RecentFileMF クラスを利用して,画像でのメニュー表示を可能にする
- ODMenu を利用可能な様に追加する.
アプリケーションクラスのヘッダなどで MetaFile.hxx をインクルードして,ODMMetaFile を利用可能に. - ID_RECENT_FILE_00 ~ の必要数分のリソースを作成する.
- アプリケーションクラスのヘッダに,include と変数を追加する.
#include "RecentFM.hxx"
RecentFileMF RcntFM ; - アプリケーションクラスのコンストラクタに RecnetFileMF の初期化を追加する.
: RcntFM(_T("RecentFileMF"),30) - InitInstance で,RcntFM のデータを読込む処理を追加する.
{
RcntFM.Read() ;
RcntFM.SetStartID(ID_RECENT_FILE_00) ;
} - アプリケーションクラスに,範囲でコマンドハンドラを追加する.
ON_COMMAND_RANGE (ID_RECENT_FILE_00,ID_RECENT_FILE_29,OnRecentFile)
void CXxxxApp::OnRecentFile(UINT nID)
{
CString selFile = RcntFM.GetSelectFile(nID) ;
AfxGetApp()->OpenDocumentFile(selFile) ;
} - ドキュメントクラスのファイルの読み書きの時に,次の様にドキュメントと対応する画像を指定する.
{
CXxxxApp* app = (CXxxxApp*)AfxGetApp() ;
app->RcntFM.Add(fileName,emfName) ;
}
- さらに,ドキュメントに対するファイル名をステータスバーなどに表示するために,CMainFrame に追加する.
// ツールチップの表示データの更新
BOOL CMainFrame::OnToolTipText(UINT id, NMHDR *pNMHDR, LRESULT *pResult)
{
BOOL ret = CFrameWnd:: OnToolTipText(id,pNMHDR,pResult) ;
Prompt:: OnToolTipText(id,pNMHDR,pResult) ;
return ret ;
}
// ステータスバーの表示データの更新
void CMainFrame::GetMessageString(UINT nID, CString &rMessage) const
{
CFrameWnd:: GetMessageString(nID,rMessage) ;
Prompt:: GetMessageString(nID,rMessage) ;
}
2012/06/12 追記
VC6 でドロップタウンが有効にならない場合,CBRS_SIZE_DYNAMIC を外す.
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | …
… | CBRS_FLYBY/* | CBRS_SIZE_DYNAMIC*/) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
ODMenu が有効にならない場合,
#include “ODMenu.hxx”
#include “WinMFC.cxx”
Prompt が有効にならない場合,
#include “Prompt.hxx”
#include “RecentFM.cxx”
ODMenu は有効ではあるが,何も表示されない
手動で追加していたため,メッセージマップの修正漏れ
ON_WM_MEASUREITEM()
ON_WM_DRAWITEM()
2019/09/20
OnMeasureItem , OnDrawItem が呼ばれない.
内部的には ODMenu::ModifyMenu が呼ばれていない.
WinMFC.cxx を読み込む前に ODMenu.hxx が必要.
App.h 内の include の最後辺りに ODMenu.hxx の追加で対応可能.