vc入門寶典(一)(選單) (轉)
選單
/develop/author/netauthor/he_zhidan/">何志丹
選單項屬性說明:
ID 標識選單的唯一常量。
Caption 選單項標題,“&" 後面的字元為,在選單項後的字元將加下劃線。
Separator 水平線,其它屬性無效。
Pop_up 有子選單
Grayed 無效,標題以灰色顯示
Inactive 無效,標題正常顯示
Checked 在標題前加一個對鉤
break 為None時,使它和它的兄弟們一行或一列顯示。
Help 只對最上層選單項有效,使它及後面的最上層選單移到視窗的右上角。
Prompt 當滑鼠指向它時的提示資訊
多文件應用除了生成IDR_MAINFRAME外,還生成識別符號為IDR_xxxxTYPE,其中xxxx為應用程式名。它們分別對應無文件和有文件時。
一個選單id可以在多個類有響應,但只會有一個響應。
我實驗得出的結果,CChildFrame,CCMenuApp,CCMenuDoc,CCMenuView,CMainFrame(我的應用程式名為CMenu)的響應順序為:
在IDR_MAINFRAME中,CMainFrame,CCMenuApp其它三個不響應.
在IDR_XXXXTYPE 中,CCMenuView,CCMenuDoc,CChildFrame,CCMenuApp,CMainFrame.
ctrl+w開啟ClassWizard,選好工程,類(最常選的是xxxView),在id中選擇我們要修改的選單項。
雙擊COMMAND(或UPDATE_COMMAND_UI)點確定就可以了。再在成員函式中雙擊我們剛剛加的函式,就可以編輯函式了。
當單擊選單時,我們剛剛編輯的函式會。
如果我們雙擊的是UPDATA_COMMAND_UI,則響應形式類似如下:
void ... OnUpdate...(CCmdUI * pCmdUI)
{
pCmdUI->SetCheck(true);//在選單項前加一個對鉤
pCmdUI->Enable(true);// 使選單項能夠使用
}
因為此函式往往影響到它的外形,故在它的“父親”或“祖父”被選中時就會執行。
CWnd類中與選單有關的幾個函式。
SetMeun(CMenu *pMenu);
修改視窗的選單,為NULL,則表示刪除。
常用的還有
GetMenu();
GetSystemMenu();
CMenu的一些函式。
AppendMenu()函式指定的選單最後附加一個新選單項,同時可以指定選單項的相關情況,它有兩個語法。
nFlag指定狀態,可以是以下四組之一或相組合而成,還可以與MF_POPUP組合表示新增的是彈出式選單。
MF_CHECKED,MF_CHECKED
MF_DISABLED,MF_ENABLED,MF_GRAYED
MF_STRING,MF_OWNERDRAW,MF_SEPARATOR,MF_BITMAP選單項是字串,自畫型,分隔線,點陣圖。
MF_MENUBARBREAK,MF_MENUBREAK
nIDNewItem 指定選單項的id.
lpszNewItem指定選單項的內容,與nFlag有關。為MF_OWNERDRAW時,該引數為資料指標,用來傳送資料,在傳送訊息WM_MEASUREITEM和WM_DRAWITEM時將該資料存入引數
的(DRAWITEMSTRUCT結構)itemData域;nFlag為MF_STRING時該引數為選單標題。
InsertMenu
nFlags指定選單項位置和狀態,狀態選項參見AppendMenu()函式,位置選項為MF_BYCOMMAND,MF_BYPOSITION.
nPositin若為MF_BYCOMMAND,新選單項插在指定選單項之前;或為MF_BYPOSITION,該引數指定新選單項的位置,為-1插到最後。
ModifyMenu()引數與InsertMenu類似。
DeleteMenu刪除選單項
RemoveMenu移去選單項
設定和顯示浮動選單
BOOL TrackPopupMenu(UINT nFlags,int x,int y,
CWnd *pWnd,LPCRECT = NULL);
nFlag浮動式選單座標設定方式及滑鼠操作方式,有效值如下:
TPM_CENTERALIGN TPM_LEFTALIGN TPM_RIGHTALIGN
TPM_LEFTBUTTON TPM_RIGHTBUTTON
x,y浮動式選單座標
pWnd指定操作選單的視窗
lpRect指定滑鼠操作範圍
在客戶區單擊左鍵就會彈出快捷選單,方法二需要在資源編輯器中編輯一個新選單,方法三必須有主選單。
方法一:
void CHeView::OnLButtonDown(UINT nFlags, CPoint point)
{
CMenu PopupMenu;
PopupMenu.CreatePopupMenu();
PopupMenu.AppendMenu(MF_STRING,ID_FILE_NEW,"NEW..");
//...
ClientToScreen(&point);
PopupMenu.TrackPopupMenu(TPM_CENTERALIGN|TPM_RIGHTBUTTON,point.x,point.y,this);
CView::OnLButtonDown(nFlags, point);
}
方法二:
void CHeView::OnLButtonDown(UINT nFlags, CPoint point)
{
CMenu menu;
menu.LoadMenu(IDR_DUMMY);
CMenu *pMenu=menu.GetSubMenu(0);
ASSERT(pMenu!=NULL);
ClientToScreen(&point);
pMenu->TrackPopupMenu(TPM_CENTERALIGN|TPM_RIGHTBUTTON,point.x,point.y,this);
CView::OnLButtonDown(nFlags, point);
}
方法三:
void CHeView::OnLButtonDown(UINT nFlags, CPoint point)
{
CWnd *pWnd=AfxGetApp()->GetMainWnd();
CMenu * pMenu=pWnd->GetMenu();
pMenu=pMenu->GetSubMenu(0);
ASSERT(pMenu!=NULL);
ClientToScreen(&point);
pMenu->TrackPopupMenu(TPM_CENTERALIGN|TPM_RIGHTBUTTON,point.x,point.y,this);
}
習題:
動態選單,使用者點選“更多選單”,增加一些選單項。
其實,自畫選單原理不難理解.AppendMenu的風格選自畫,將自畫用的資訊(指標)強制轉化成LPCTSTR,再重
載DrawItem就行了,注意自畫用的資訊不要提前delete了.
示例如下:
COwnerMenu.h中
class CMenuItem
{
public:
CString m_szText;
COLORREF m_color;
CMenuItem(CString szText,COLORREF color)
{
m_szText = szText;
m_color = color;
}
};
#include
class COwnerMenu : public CMenu
{
public:
void DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct );
bool AppendMenu(UINT nIDNewItem,CString caption,COLORREF color);
COwnerMenu();
CTypedPtrList
virtual ~COwnerMenu();
};
COwnerMenu.cpp中
COwnerMenu::~COwnerMenu()
{
while(m_MenuList.GetCount())
{
CMenuItem *pMenuItem = m_MenuList.GetHead();
delete pMenuItem;
m_MenuList.RemoveHead();
}
}
bool COwnerMenu::AppendMenu(UINT nIDNewItem, CString caption, COLORREF color)
{
CMenuItem * pMenuItem = new CMenuItem(caption,color);
m_MenuList.AddTail(pMenuItem);
return CMenu::AppendMenu(MF_OWNERDRAW,nIDNewItem,(LPCTSTR)pMenuItem);
}
void COwnerMenu::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
pDC->SetTextColor(((CMenuItem*)lpDrawItemStruct->itemData)->m_color);
pDC->TextOut(0,0,((CMenuItem*)lpDrawItemStruct->itemData)->m_szText);
}
在使用選單的地方(不要忘記了加頭):
void COwnerMenuView::OnRButtonDown(UINT nFlags, CPoint point)
{
COwnerMenu menu;
menu.CreatePopupMenu();
menu.AppendMenu(ID_1,"1",RGB(0,0,128));
ClientToScreen(&point);
menu.TrackPopupMenu(TPM_LEFTBUTTON|TPM_LEFTALIGN,point.x,point.y,this);
CView::OnRButtonDown(nFlags, point);
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-993344/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- vc入門寶典(十) (轉)
- vc入門寶典(九) (轉)
- VC入門寶典三(String) (轉)
- vc入門寶典八(基本操作) (轉)
- vc入門寶典七(工具欄) (轉)
- vc入門寶典六(多執行緒) (轉)執行緒
- VC常見入門問題總結(一) (轉)
- VC++的選單控制和自繪選單。 (轉)C++
- [轉]BI入門經典
- BI入門經典 (轉)
- Tungsten Fabric入門寶典丨編排器整合
- 【官方重磅釋出】Google AdMob新手入門寶典Go
- JAVA的入門基礎一些精典(轉)Java
- 一站式後設資料治理平臺——Datahub入門寶典
- Tungsten Fabric入門寶典丨TF元件的七種“武器”元件
- VC常見入門問題總結(二) (轉)
- VC++ MFC入門簡明教程,我當時就是看了它一天入門的 (轉)C++
- Tungsten Fabric入門寶典丨多編排器用法及配置
- Tungsten Fabric入門寶典丨首次啟動和執行指南
- Python入門經典案例一Python
- Tungsten Fabric入門寶典丨關於安裝的那些事(下)
- Tungsten Fabric入門寶典丨關於叢集更新的那些事
- Tungsten Fabric入門寶典丨8個典型故障及排查Tips
- Tungsten Fabric入門寶典丨關於服務鏈、BGPaaS及其它
- Kotlin 語言入門寶典 | Android 開發者 FAQ Vol.5KotlinAndroid
- Python 資料分析入門寶藏書,選它!Python
- 《Flutter 入門經典》之“Flutter 入門 ”Flutter
- Webpack經典入門Web
- Tungsten Fabric入門寶典丨開始第二天的工作
- 大資料架構師從入門到精通 學習必看寶典大資料架構
- 資料治理之後設資料管理的利器——Atlas入門寶典
- VC中文FAQ寶庫之5:怎樣載入其他的應用程式 (轉)
- windows網路程式設計經典入門 (轉)Windows程式設計
- Spark入門(三)--Spark經典的單詞統計Spark
- 面試寶典面試
- Linux下Oracle安裝寶典 (轉)LinuxOracle
- Linux下Oracle安裝寶典(轉)LinuxOracle
- Tungsten Fabric入門寶典丨說說L3VPN及EVPN整合