国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
VC API之菜單函數(shù)
1.CreateMenu(VOID)
函數(shù)功能:該函數(shù)創(chuàng)建一個(gè)菜單。此菜單最初是空的,但可用函數(shù)InserMenultem,AppendMenu,和lnsertMenu來(lái)填入菜單項(xiàng)。
  函數(shù)原型:HMENU CreateMenu(VOID)
  參數(shù):無(wú)。
  返回值:如果函數(shù)調(diào)用成功,返回值是新創(chuàng)建菜單的句柄。如果函數(shù)調(diào)用失敗,返回值是NULL。若想獲得更多的錯(cuò)誤信息,請(qǐng)調(diào)用GetLastError函數(shù)。
  備注:與被分配給一個(gè)窗日的菜單相聯(lián)系的資源會(huì)被自動(dòng)釋放。如果此菜單未被分配給一個(gè)窗口,應(yīng)用程序必須在關(guān)閉之前釋放與菜單相連的資源。應(yīng)用程序通過(guò)調(diào)用函數(shù)DestroyMenu來(lái)釋放菜單資源。
2.HMENU CreatePopupMenu(VOID)
函數(shù)功能:該函數(shù)創(chuàng)建一個(gè)下拉式菜單、子菜單或快捷菜單。此菜單最初是空的,但可用函數(shù)InsertMenultem來(lái)插入或追加菜單項(xiàng)。也可用函數(shù)InsertMenu來(lái)插人菜單項(xiàng),用AppendMenu來(lái)追加菜單項(xiàng)。
  函數(shù)原型:HMENU CreatePopupMenu(VOID)
  參數(shù):無(wú)。
  返回值:如果函數(shù)調(diào)用成功,返回值是新創(chuàng)建菜單的句柄。如果函數(shù)調(diào)用失敗,返回值是NULL。若想獲得更多的錯(cuò)誤信息,請(qǐng)調(diào)用GetLastError函數(shù)。
  備注:一個(gè)應(yīng)用程序可增加新菜單到已存在的菜單上,或者可以調(diào)用函數(shù)TrackPopupMenuEx或TrackPopupMenu來(lái)顯示快捷菜單。與被分配給一個(gè)窗口的菜單相聯(lián)系的資源會(huì)被自動(dòng)釋放。如果此菜單未被分配給一個(gè)窗口,應(yīng)用程序必須在關(guān)閉之前釋放與菜單相連的資源。應(yīng)用程序通過(guò)調(diào)用函數(shù)DestroyMenu來(lái)釋放菜單資源。Windows95環(huán)境下,系統(tǒng)可支持最多16,364個(gè)菜單句柄。
3.BOOL AppendMenu(hMenu hMenu,UINT uFlags,UINT uIDNewltem,LPCTSTR lpNewltem)
函數(shù)功能:該函數(shù)在指定的菜單條、下拉式菜單、子菜單或快捷菜單的末尾追加一個(gè)新菜單項(xiàng)。此函數(shù)可指定菜單項(xiàng)的內(nèi)容、外觀和性能。函數(shù)AppendMenu己被lnsertMenultem取代。但如果不需要lnsertMenultem的擴(kuò)展特性,仍可使用AppendMenu。
  函數(shù)原型:BOOL AppendMenu(hMenu hMenu,UINT uFlags,UINT uIDNewltem,LPCTSTR lpNewltem);
  參數(shù):
  hMenu:將被修改的菜單條、下拉式菜單、子菜單、或快捷菜單的句柄。
  UFlags:控制新菜單項(xiàng)的外觀和性能的標(biāo)志。此參數(shù)可以是備注里所列值的組合。
  UIDNewltem:指定新菜單項(xiàng)的標(biāo)識(shí)符,或者當(dāng)uFlags設(shè)置為MF_POPUP時(shí),表示下拉式菜單或子菜單的句柄。
  LpNewltem:指定新菜單項(xiàng)的內(nèi)容。此參數(shù)的含義取決于參數(shù)uFlags是否包含MF_BITMAP, MF_OWNERDRAW或MF_STRING標(biāo)志,如下所示:
  MF_BITMAP:含有位圖句柄。MF_STRING:以`\O’結(jié)束的字符串的指針。
  MF_OWNERDRAW:含有被應(yīng)用程序應(yīng)用的32位值,可以保留與菜單項(xiàng)有關(guān)的附加數(shù)據(jù)。當(dāng)菜單被創(chuàng)建或其外觀被修改時(shí),此值在消息WM_MEASURE或WM_DRAWITEM的參數(shù)IParam指向的結(jié)構(gòu),成員itemData里。
  返回值:如果函數(shù)調(diào)用成功,返回非零值;如果函數(shù)調(diào)用失敗,返回值是零。若想獲得更多的錯(cuò)誤信息,請(qǐng)調(diào)用GetLastError函數(shù)。
  備注:一旦菜單被修改,無(wú)論它是否在顯示窗口里,應(yīng)用程序必須調(diào)用函數(shù)DrawMenuBar。
下列標(biāo)志可被設(shè)置在參數(shù)uFlags里:
  MF_BITMAP:將一個(gè)位圖用作菜單項(xiàng)。參數(shù)lpNewltem里含有該位圖的句柄。
  MF_CHECKED:在菜單項(xiàng)旁邊放置一個(gè)選取標(biāo)記。如果應(yīng)用程序提供一個(gè)選取標(biāo)記,位圖(參見(jiàn)SetMenultemBitmaps),則將選取標(biāo)記位圖放置在菜單項(xiàng)旁邊。
  MF_DISABLED:使菜單項(xiàng)無(wú)效,使該項(xiàng)不能被選擇,但不使菜單項(xiàng)變灰。
  MF_ENABLED:使菜單項(xiàng)有效,使該項(xiàng)能被選擇,并使其從變灰的狀態(tài)恢復(fù)。
  MF_GRAYED:使菜單項(xiàng)無(wú)效并變灰,使其不能被選擇。
  MF_MENUBARBREAK:對(duì)菜單條的功能同MF_MENUBREAK標(biāo)志。對(duì)下拉式菜單、子菜單或快捷菜單,新列和舊列被垂直線分開(kāi)。
  MF_MENUBREAK:將菜單項(xiàng)放置于新行(對(duì)菜單條),或新列(對(duì)下拉式菜單、子菜單或快捷菜單)且無(wú)分割列。
  MF_OWNERDRAW:指定該菜單項(xiàng)為自繪制菜單項(xiàng)。菜單第一次顯示前,擁有菜單的窗口接收一個(gè)WM_MEASUREITEM消息來(lái)得到菜單項(xiàng)的寬和高。然后,只要菜單項(xiàng)被修改,都將發(fā)送WM_DRAWITEM消息給菜單擁有者的窗口程序。
  MF_POPUP:指定菜單打開(kāi)一個(gè)下拉式菜單或子菜單。參數(shù)uIDNewltem下拉式菜單或子菜單的句柄。此標(biāo)志用來(lái)給菜單條、打開(kāi)一個(gè)下拉式菜單或于菜單的菜單項(xiàng)、子菜單或快捷菜單加一個(gè)名字。
  MF_SEPARATOR:畫一條水平區(qū)分線。此標(biāo)志只被下拉式菜單、子菜單或快捷菜單使用。此區(qū)分線不能被變灰、無(wú)效或加亮。參數(shù)IpNewltem和uIDNewltem無(wú)用。
  MF_STRING:指定菜單項(xiàng)是一個(gè)正文字符串;參數(shù)lpNewltem指向該字符串。
  MF_UNCHECKED:不放置選取標(biāo)記在菜單項(xiàng)旁邊(缺?。?。如果應(yīng)用程序提供一個(gè)選取標(biāo)記位圖(參見(jiàn)SetMenultemBitmaps),則將選取標(biāo)記位圖放置在菜單項(xiàng)旁邊。
  下列標(biāo)志組不能被一起使用:
  MF_DISABLED,MF_ENABLED和MF_GRAYED;MF_BITMAP,MF_STRING和MF_OWNERDRAW
  MF_MENUBARBREAK和MF_MENUBREAK;MF_CHECKED和MF_UNCHECKED
  Windows CE環(huán)境下,不支持參數(shù)fuFlags使用下列標(biāo)志:
  MF_BITMAP;MF_DOSABLE;MF_GRAYED
  MF_GRAYED可用來(lái)代替MF_DISABLED和MFS_GRAYED。
  Windows CE 1.0不支持層疊式菜單。在使用Windows CE 1.0時(shí),不能將一個(gè)MF_POPUP菜單插入到另一個(gè)下拉式菜單中。Window CE 1.0不支持下列標(biāo)志:
  MF_POPUP;MF_MENUBREAK;MF_MENUBARBREAK
4.BOOL WINAPI InsertMenuItem(HMENU hMenu,UINT uItem,BOOL fByPosition,LPMENUITEMINFO lpmii);
 用一個(gè)MENUITEMINFO結(jié)構(gòu)指定的特征插入一個(gè)新菜單條目
  [參數(shù)表]
  hMenu ---------- Long,菜單的句柄
  un ------------- Long,菜單條目的菜單ID。新條目會(huì)插入由這個(gè)參數(shù)指定的項(xiàng)目之前
  bool ----------- Boolean,如un指定的是條目的位置,就為TRUE,如指定的是菜單ID,就為FALSE
  lpcMenuItemInfo - MENUITEMINFO,用于設(shè)置指定菜單條目的特征
 ?。鄯祷刂担?div id="moiyehiw" class="spctrl">
  Long,TRUE(非零)表示成功,否則返回零。會(huì)設(shè)置GetLastError
5.BOOL DrawMenuBar(HWND hWnd)
函數(shù)功能:該函數(shù)重畫指定菜單的菜單條。如果系統(tǒng)創(chuàng)建窗口以后菜單條被修改,則必須調(diào)用此函數(shù)來(lái)畫修改了的菜單條。
  函數(shù)原型:BOOL DrawMenuBar(HWND hWnd);
  參數(shù):
  hWnd:其菜單條需要被重畫的窗口的句柄。
  返回值:如果函數(shù)調(diào)用成功,返回非零值:如果函數(shù)調(diào)用失敗,返回值是零。若想獲得更多的錯(cuò)誤信息,請(qǐng)調(diào)用GetLastError函數(shù)。
HMENU  hMenu,hPopupMenu;
HMENU hOldMenu;
MENUITEMINFO mi;
char szExit[16],szAbout[16];
sprintf(szExit,"%s","&Exit11");
sprintf(szAbout,"%s","&About11");
//設(shè)置一個(gè)菜單項(xiàng)的具體內(nèi)容
mi.cbSize=sizeof(MENUITEMINFO);  //MENUITEMINFO類型變量的大小
mi.fMask=MIIM_STATE|MIIM_TYPE; //fState和fType分量有效
mi.fType=MFT_STRING;    //指定菜單項(xiàng)為字符串類型
mi.fState=MFS_ENABLED;   //指定菜單項(xiàng)的狀態(tài)為活躍狀態(tài)
mi.wID=0;       //指定菜單項(xiàng)的標(biāo)識(shí)ID
mi.hSubMenu=NULL;     //指定菜單項(xiàng)包含的子菜單句柄
mi.hbmpChecked=NULL;    //指定菜單項(xiàng)選中時(shí)的位圖
mi.hbmpUnchecked=NULL;   //指定菜單項(xiàng)未選中的位圖
mi.dwItemData=0;     //指定菜單項(xiàng)的數(shù)據(jù)
mi.dwTypeData=szExit;     //指定菜單項(xiàng)的文本
mi.cch=strlen(szExit);     //指定菜單項(xiàng)文本的長(zhǎng)度
hMenu=CreateMenu();
hPopupMenu=CreatePopupMenu();
InsertMenuItem(hPopupMenu,101,FALSE,&mi);
//展示一下MFT_MENUBARBREAK的用法
mi.fType|=MFT_MENUBARBREAK;
InsertMenuItem(hPopupMenu,102,FALSE,&mi);
//添加File菜單
AppendMenu(hMenu,MF_POPUP,(UINT)hPopupMenu,"&File11");
//創(chuàng)建一個(gè)新的彈出式菜單
hPopupMenu=CreatePopupMenu();
mi.fType&=~MFT_MENUBARBREAK;
mi.dwTypeData=szAbout;
InsertMenuItem(hPopupMenu,103,FALSE,&mi);
//添加Help菜單
AppendMenu(hMenu,MF_POPUP,(UINT)hPopupMenu,"&Help11");
//將新創(chuàng)建的菜單設(shè)置為窗口菜單
//hOldMenu=GetMenu(hWnd);
SetMenu(hWnd,hMenu); 
//不再使用該菜單,以后先恢復(fù)以前的菜單,然后再將其刪除,
//SetMenu(hWnd,hOldMenu);
//DestroyMenu(hMenu);
 
6. HMENU LoadMenu(HINSTANCE hlnstance,LPCTSTR lpMenuName)
函數(shù)功能:該函數(shù)從與應(yīng)用事例相聯(lián)系的可執(zhí)行文件(.EXE)中加載指定的菜單資源。
  函數(shù)原型:HMENU LoadMenu(HINSTANCE hlnstance,LPCTSTR lpMenuName);
  參數(shù):
  hlnstance:含有被加載菜單資源的事例模塊的句柄。
  LpMenuName:指向含有菜單資源名的以空結(jié)束的字符串的指針。同時(shí),此參數(shù)可由低位字上的資源標(biāo)識(shí)符和高位字上的零組成。要?jiǎng)?chuàng)建此值,用MAKEINTRESOURCE宏。
  返回值:如果函數(shù)調(diào)用成功,返回值是菜單資源句柄;如果函數(shù)調(diào)用失敗,返回值是NULL。若想獲得更多的錯(cuò)誤信息,請(qǐng)調(diào)用GetLastError函數(shù)。
  備注:關(guān)閉應(yīng)用程序之前,用函數(shù)DestroyMenu來(lái)銷毀菜單并釋放加載菜單占用的內(nèi)存。Windows CE 1.0不支持層疊式菜單。Windows CE 2.0及更高版本支持層疊式菜單。
HMENU hMenu,hOldMenu;
    //裝載ID標(biāo)識(shí)為IDM_TEST的一個(gè)新創(chuàng)建的菜單
   hInst = hInstance;
    hMenu=LoadMenu(hInst,(LPCTSTR)IDM_TEST);
    hOldMenu=GetMenu(hWnd);
    SetMenu(hWnd,hMenu);
    //不再使用該新菜單以后恢復(fù)窗口以前的菜單
    //SetMenu(hWnd,hOldMenu);
 
7.HMENU LoadMenuIndirect (const MENUTEMPLATE *lpMenuTemplate // Menu的內(nèi)存地址)
HRSRC hRsrc;
    HGLOBAL hGlobal;
    HMENU hMenu;
    void* pMenu;
    //從當(dāng)前進(jìn)程實(shí)例中查找標(biāo)識(shí)為IDM_TEST的菜單資源
    //IDM_TEST為一個(gè)新創(chuàng)建的菜單資源標(biāo)識(shí)ID
    hRsrc=FindResource(hInst,(LPCTSTR)IDM_TEST,RT_MENU);
    //裝載找到的菜單資源
    hGlobal=LoadResource(hInst,hRsrc);
    //鎖定已裝載的菜單資源,從而獲取指向資源的指針
    pMenu=LockResource(hGlobal);
    //由pMenu指針指定的資源來(lái)創(chuàng)建一個(gè)菜單
    hMenu=LoadMenuIndirect((CONST MENUTEMPLATE*)pMenu);
    SetMenu(hWnd,hMenu);
 
8.BOOL DestroyMenu(HMENU hMenu);
函數(shù)動(dòng)能:該函數(shù)銷毀指定的菜單,并釋放此菜單占用的存儲(chǔ)器。
  函數(shù)原型:BOOL DestroyMenu(HMENU hMenu);
  參數(shù):
  hMenu:要銷毀的菜單的句柄。
  返回值:如果函數(shù)調(diào)用成功,返回非零值;如果函數(shù)調(diào)用失敗,返回值是零。若想獲得更多的錯(cuò)誤信息,請(qǐng)調(diào)用GetLastError函數(shù)。
  備注:一個(gè)應(yīng)用程序在關(guān)閉之前,必須調(diào)用函數(shù)DestroyMenu來(lái)銷毀一個(gè)沒(méi)被分配給窗口的菜單。分配給窗口的菜單,當(dāng)應(yīng)用程序關(guān)閉時(shí),被自動(dòng)銷毀。
可以利用CMenu的成員函數(shù)DeleteMenu.刪除指定菜單項(xiàng),或者彈出菜單。 
就看你用什么,調(diào)用DeleteMenu。如果用菜單欄的指針GetMenu()調(diào)用DeleteMenu,刪除的是彈出菜單,如 
果你用子菜單GetSubMenu的指針,調(diào)用DeleteMenu,刪除的是菜單項(xiàng)。 

9.BOOL DeleteMenu( HMENU hMenu ,UINT nPosition, UINT nFlags ); 
參數(shù):菜單項(xiàng)或彈出菜單,所在的ID號(hào)或索引號(hào),由第二個(gè)參數(shù)決定訪問(wèn)方式; 
備注:只要一個(gè)菜單被修改,無(wú)論它是否在顯示窗口里,應(yīng)用程序都必須調(diào)用函數(shù)DrawMenuBar。
在CMainFrame::OnCreate中添加以下代碼: 
GetMenu()->DeleteMenu(1,MF_BYPOSITION);//刪除彈出菜單 
GetMenu()->GetSubMenu(1)->DeleteMenu(ID_FILE_SAVE,MF_BYCOMMAND);//刪除指定菜單項(xiàng) 
HMENU hMenu;
hMenu=LoadMenu(hInst,(LPCTSTR)IDM_TEST);
//IDM_TEST為自己創(chuàng)建的一個(gè)菜單資源,該菜單中包含標(biāo)識(shí)ID為IDM_EXIT的菜單項(xiàng)。
SetMenu(hWnd,hMenu);
//使用該菜單
DeleteMenu(hMenu,IDM_EXIT,MF_BYCOMMAND);
SetMenu(hWnd,hMenu);
 
 
10.RemoveMenu(HMENU hMenu ,UINT nPosition, UINT nFlags )
參數(shù):菜單項(xiàng)或彈出菜單,所在的ID號(hào)或索引號(hào),由第二個(gè)參數(shù)決定訪問(wèn)方式; 
備注:只要一個(gè)菜單被修改,無(wú)論它是否在顯示窗口里,應(yīng)用程序都必須調(diào)用函數(shù)DrawMenuBar。
 HMENU hMenu;
hMenu=GetMenu(hWnd);
//下面的語(yǔ)句將刪除窗口菜單中Help這一列主菜單
RemoveMenu(hMenu,0,MF_BYPOSITION);
SetMenu(hWnd,hMenu);
 
11.HMENU GetSystemMenu(HWND hWnd,BOOL bRevert);
函數(shù)功能:該函數(shù)允許應(yīng)用程序?yàn)閺?fù)制或修改而訪問(wèn)窗口菜單(系統(tǒng)菜單或控制菜單)。
  函數(shù)原型:HMENU GetSystemMenu(HWND hWnd,BOOL bRevert);
  參數(shù):
  hWvd:擁有窗口菜單拷貝的窗口的句柄。
  BPevert:指定將執(zhí)行的操作。如果此參數(shù)為FALSE,GetSystemMenu返回當(dāng)前使用窗口菜單的拷貝的句柄。該拷貝初始時(shí)與窗口菜單相同,但可以被修改。
  如果此參數(shù)為TRUE,GetSystemMenu重置窗口菜單到缺省狀態(tài)。如果存在先前的窗口菜單,將被銷毀。
  返回值:如果參數(shù)bRevert為FALSE,返回值是窗口菜單的拷貝的句柄:如果參數(shù)bRevert為TRUE,返回值是NULL。
  備注:任何沒(méi)有用函數(shù)GetSystemMenu來(lái)生成自己的窗口菜單拷貝的窗口將接受標(biāo)準(zhǔn)窗口菜單。
  窗口某單最初包含的菜單項(xiàng)有多種標(biāo)識(shí)符值,如SC_CLOSE,SC_MOVE和SC_SIZE。
  窗口菜單上的菜單項(xiàng)發(fā)送WM_SYSCOMMAND消息。
  所有預(yù)定義的窗口菜單項(xiàng)的標(biāo)識(shí)符數(shù)大于OxFOOO。如果一個(gè)應(yīng)用程序增加命令到窗口菜單,應(yīng)該使用小于OxFOOO的標(biāo)識(shí)符數(shù)。
  系統(tǒng)根據(jù)狀態(tài)自動(dòng)變灰標(biāo)準(zhǔn)窗口菜單上的菜單項(xiàng)。應(yīng)用程序通過(guò)響應(yīng)在任何某單顯示之前發(fā)送的WM_INITMENU消息來(lái)實(shí)現(xiàn)選取和變灰。
  Windows CE環(huán)境下,不支持系統(tǒng)菜單,但GetSyemMenu以宏的方式實(shí)現(xiàn),以保持和已存在代碼的兼容性??梢允褂迷摵甑姆祷夭藛尉浔龟P(guān)閉框無(wú)效,與在Windows桌面平臺(tái)上一樣。Windows CE下的返回值沒(méi)有其他用處。參數(shù)bRevert無(wú)用。
  HMENU hSysMenu;
hSysMenu=GetSystemMenu(hWnd,FALSE);
DeleteMenu(hSysMenu,0,MF_BYPOSITION);
//使用下面這個(gè)語(yǔ)句來(lái)恢復(fù)系統(tǒng)菜單
//GetSystemMenu(hWnd,TRUE); 
 
12.HMENU GetMenu(HWND hWnd)
函數(shù)功能:該函數(shù)取得分配給指定窗口的菜單的句柄。
  函數(shù)原型:HMENU GetMenu(HWND hWnd);
  參數(shù):
  hWnd:其菜單句柄被取得的窗口的句柄。
  返回值:返回值是菜單的句柄。如果給定的窗口沒(méi)有菜單,則返回NULL。如果窗口是一個(gè)子窗口,返回值無(wú)定義。
HMENU hMenu;
hMenu=GetMenu(hWnd);
 
13.HMENU GetSubMenu(HMENU hMenu,int nPos);
函數(shù)功能:該函數(shù)取得被指定菜單激活的下拉式菜單或子菜單的句柄。
  函數(shù)原型:HMENU GetSubMenu(HMENU hMenu,int nPos);
  參數(shù):
  hMenu:菜單句柄。
  nPos:激活下拉式菜單或子菜單的菜單項(xiàng)相對(duì)于零的位置。
  返回值:如果函數(shù)調(diào)用成功,返回值是菜單項(xiàng)激活的下拉式菜單或子菜單的句柄。如果菜單項(xiàng)沒(méi)有激活一個(gè)下拉式菜單或子菜單,返回值是NULL。
POINT pt;
 HMENU hMenu,hSubMenu;
  //獲取當(dāng)前單擊鼠標(biāo)右鍵位置的坐標(biāo)(在屏幕坐標(biāo)系中)
  pt.x=LOWORD(lParam);
  pt.y=HIWORD(lParam);
  //將屏幕坐標(biāo)系中的坐標(biāo)轉(zhuǎn)換到客戶坐標(biāo)系中
  ClientToScreen(hWnd,&pt);
  //獲取窗口菜單的一個(gè)子菜單,并且將其顯示出來(lái)
  hMenu=GetMenu(hWnd);
  hSubMenu=GetSubMenu(hMenu,1);
  TrackPopupMenu(hSubMenu,TPM_LEFTALIGN|TPM_TOPALIGN|TPM_RETURNCMD,
     pt.x,pt.y,0,hWnd,NULL);
 
14. BOOL SetMenuItemInfo(HMENU hMenu,UINT uItem,  BOOL fByPosition,    LPMENUITEMINFO lpmii)
 
函數(shù)原型:BOOL SetMenuItemInfo(HMENU hMenu,UINT uItem,  BOOL fByPosition,    LPMENUITEMINFO lpmii)
為一個(gè)菜單條目設(shè)置指定的信息,具體信息保存于MENUITEMINFO結(jié)構(gòu)中)
參數(shù) 類型及說(shuō)明:
hMenu Long,菜單句柄
un Long,菜單條目的菜單ID或位置
bool Boolean,如un指定了條目的位置,就為TRUE;如指定的是菜單ID,就為FALSE
lpcMenuItemInfo MENUITEMINFO,用于設(shè)置目標(biāo)菜單條目的特征CMenu::SetMenuItemInfo(可以改變?cè)O(shè)置菜單項(xiàng)目的相關(guān)信息)

 返回值:
Long,TRUE(非零)表示成功,否則返回零。會(huì)設(shè)置GetLastError    

15.BOOL WINAPI GetMenuItemInfo(HMENU hMenu,UINT uItem,BOOL fByPosition,LPMENUITEMINFO lpmii);

typedef struct tagMENUITEMINFO {

    UINT          cbSize; //本結(jié)構(gòu)體物理大小,以byte為單位,其值實(shí)際上為48

    UINT          fMask; //確定想要查詢或設(shè)置菜單項(xiàng)的哪能些內(nèi)容

    UINT          fType; //菜單格式類型

    UINT          fState;// 菜單狀態(tài):Enabled、Disabled or Grayed

    UINT          wID; //命令標(biāo)識(shí)符

    HMENU       hSubMenu; //子菜單句柄,若無(wú)子菜單則為NULL

    HBITMAP     hbmpChecked; //根據(jù)這兩個(gè)域值,可以自定義菜單項(xiàng)被選定時(shí)的標(biāo)記,

    HBITMAP     hbmpUnchecked; //而不一定要是’√’或空白

    DWORD      dwItemData;//由English翻譯為:應(yīng)用程序定義的與菜單項(xiàng)相關(guān)的值(我也不明白)

LPTSTR       dwTypeData; //菜單資源內(nèi)容指針,指向String or BitMap or SEPARATOR資源

UINT          cch; //若菜單項(xiàng)為MFT_STRING類型,則此項(xiàng)為dwTypeData長(zhǎng)度

HBITMAP     hbmpItem;//在調(diào)試程序時(shí)發(fā)現(xiàn)有此一項(xiàng)

} MENUITEMINFO, FAR *LPMENUITEMINFO;
 
memset(&mii,   0,   sizeof(mii));  
char szAbout[16];
sprintf(szAbout, "%s","About12");
hMenu=GetMenu(hWnd);
hSubMenu=GetSubMenu(hMenu,0);
mii.cbSize=sizeof(MENUITEMINFO);
mii.fMask= MIIM_TYPE;
GetMenuItemInfo(hSubMenu,0,MF_BYPOSITION,&mii);
mii.dwTypeData=szAbout;
mii.cch=strlen(szAbout);
SetMenuItemInfo(hSubMenu,0,MF_BYPOSITION,&mii);
 
16.BOOL SetMenuDefaultItem(HMENU hMenu,UINT nItem,UINT fByPos); //缺省菜單項(xiàng)用黑體標(biāo)出
hMenu
Long,菜單句柄
uItem
Long,欲設(shè)為默認(rèn)菜單條目的一個(gè)條目的位置或菜單ID。如果為-1,表示清除當(dāng)前的默認(rèn)條目
fByPos
Long,如uItem是條目的位置,就為TRUE;如果是菜單ID,就為FALSE

16.UINT GetMenuDefaultItem(HMENU hMenu,UINT fByPos,UINT gmddiFlags); //缺省菜單項(xiàng)用黑體標(biāo)出
hMenu
Long,菜單的句柄
fByPos
Long,如果為TRUE,表示接收條目在菜單中的位置;FALSE表示接收它的菜單ID
gmdiFlags
Long,下述標(biāo)志之一:
GMDI_GOINTOPOPUPS
如默認(rèn)條目是彈出菜單,這個(gè)函數(shù)就會(huì)在其中搜索一個(gè)默認(rèn)的菜單條目
GMDI_USEDISABLED
指明自己在搜索過(guò)程中不想跳過(guò)被禁止的菜單條目

18 UINT GetMenuItemID(int nPos) const
如果成功,則返回彈出菜單中指定項(xiàng)的ID號(hào)。若指定項(xiàng)為彈出菜單(對(duì)應(yīng)于彈出菜單內(nèi)的項(xiàng)),那么返回值為-1。否則如果nPos對(duì)應(yīng)于SEPARATOR菜單項(xiàng),那么返回值為0。

參數(shù):
nPos 指定將要獲取ID號(hào)菜單項(xiàng)的位置(以0為基數(shù))。


說(shuō)明:獲取由nPos指定位置的菜單項(xiàng)的菜單項(xiàng)標(biāo)識(shí)符。
HMENU hMenu,hSubMenu;
MENUITEMINFO mi;
int id;
char szMain[16],szSub[16],szOutput[32];

hMenu=GetMenu(hWnd);
mi.cbSize=sizeof(MENUITEMINFO);
mi.fMask=MIIM_TYPE;
mi.dwTypeData=szMain;
mi.cch=16;
GetMenuItemInfo(hMenu,0,TRUE,&mi);

mi.dwTypeData=szSub;
mi.cch=16;
hSubMenu=GetSubMenu(hMenu,0);
GetMenuItemInfo(hSubMenu,0,TRUE,&mi);

id=GetMenuItemID(hSubMenu,0);
sprintf(szOutput,"%s/%s的ID:%d",szMain,szSub,id);
 
19.int GetMenuItemCount(HMENU hMenu);
GetMenuItemCount 獲取hMenu中的表項(xiàng)數(shù)
HMENU hMenu,hSubMenu;
int num;
hMenu=GetMenu(hWnd);
num=GetMenuItemCount(hMenu);
 
20BOOL GetMenuItemRect(hwnd hWnd,HMENU hMenu,UINT nItem , LPRECT lprcItem)
獲取制定菜單項(xiàng)的大小矩形
HMENU hMenu;
RECT rect,rect1;
HDC hDC;
//獲取整個(gè)窗口的DC
hDC=GetWindowDC(hWnd);
hMenu=GetMenu(hWnd);
//計(jì)算出菜單項(xiàng)矩形在窗口坐標(biāo)系下的值
GetMenuItemRect(hWnd,hMenu,0,&rect);//說(shuō)明rect的系統(tǒng)坐標(biāo)
GetWindowRect(hWnd,&rect1);
int height,width;
width=rect.right-rect.left;
height=rect.bottom-rect.top;
rect.left-=rect1.left;
rect.top-=rect1.top;
rect.right=rect.left+width;
rect.bottom=rect.top+height;
MoveToEx(hDC,rect.left,rect.top,NULL);
LineTo(hDC,rect.right,rect.bottom);
MoveToEx(hDC,rect.right,rect.top,NULL);
LineTo(hDC,rect.left,rect.bottom);
   break;
 
21.BOOL HiliteMenuItem(hwnd hWnd,HMENU hMenu,UINT wIDHiliteItem  , UINT wHilite)
控制頂級(jí)菜單條目的加亮顯示狀態(tài)
 ?。蹍?shù)表]
  hwnd ----------- Long,擁有頂級(jí)菜單的一個(gè)窗口的句柄
  hMenu ---------- Long,hwnd窗口的頂級(jí)菜單的句柄
  wIDHiliteItem -- Long,欲加亮或撤消加亮的菜單條目的標(biāo)識(shí)符。倘若在wHilite參數(shù)中設(shè)置了MF_BYCOMMAND標(biāo)志,這個(gè)參數(shù)就用于指定要改變的菜單條目的命令I(lǐng)D。如果設(shè)置的是MF_BYPOSITION標(biāo)志,這個(gè)參數(shù)就用于指定條目在菜單中的位置(第一個(gè)條目的位置為0)
  wHilite -------- Long,一系列常數(shù)標(biāo)志的組合。其中包括MF_BYCOMMAND或MF_BYPOSITION,指出要改變的條目。也包括MF_HILITE,用于設(shè)置加亮狀態(tài);或者M(jìn)F_UNHILITE,用于撤消加亮狀態(tài)
HMENU hMenu;
hMenu=GetMenu(hWnd);
HiliteMenuItem(hWnd,hMenu,0,MF_BYPOSITION|MF_HILITE);
 
22. DWORD CheckMenuItem(HMENU hmenu, UINT uIDCheckItem, UINT uCheck); 
函數(shù)功能:該函數(shù)取得與指定菜單項(xiàng)相聯(lián)系的菜單標(biāo)志。如果該菜單項(xiàng)打開(kāi)了一個(gè)子菜單,該函數(shù)也返回子菜單里的菜單項(xiàng)數(shù)。
  函數(shù)原型:DWORD CheckMenuItem(HMENU hmenu, UINT uIDCheckItem, UINT uCheck); 
  參數(shù):
  hmenu:含有其菜單項(xiàng)的標(biāo)志將被提取得的菜單的句柄。
  uIDCheckItem:制定要修改的菜單項(xiàng)。
  uCheck:表示標(biāo)記的狀態(tài)。此參數(shù)可取下列值之一:
  MF_BYCOMMAND:表示參數(shù)uId給出菜單項(xiàng)的標(biāo)識(shí)符。如果MF_BYCOMMAND和MF_BYPOSITION都沒(méi)被指定,則MF_BYCOMMAND是缺省值。
  MF_BYPOSITION:表示參數(shù)uId給出菜單項(xiàng)相對(duì)于零的位置。
  返回值:如果指定的項(xiàng)不存在,返回值是OXFFFFFFFF;如果菜單項(xiàng)打開(kāi)了一個(gè)子菜單,則返回值的低位含有與菜單相聯(lián)系的菜單標(biāo)志,高位含有子菜單的項(xiàng)數(shù)。否則,返回值是萊單標(biāo)志的掩碼(布爾OR)。
  下面列出與菜單項(xiàng)相關(guān)的菜單標(biāo)志。
  MF_CHECKED:放置選取標(biāo)記于菜單項(xiàng)旁邊(只用于下拉式菜單、子菜單或快捷菜單)。
  MF_DISABLED:使菜單項(xiàng)無(wú)效。MF_GRAYED:使菜單項(xiàng)無(wú)效并交灰。MF_HILITE:加亮菜單項(xiàng)。
  MF_MENUBARBREAK:對(duì)下拉式菜單、子菜單和快捷菜單,新列和舊列由垂直線隔開(kāi),其余功能同MF_MENUBREAK標(biāo)志。
  MF_MENUBREAK:將菜單項(xiàng)放于新行(對(duì)菜單條)或無(wú)分隔列地放于新列(對(duì)下拉式菜單、子菜單或快捷菜單)。
  MF_SEPARATOR:創(chuàng)建一個(gè)水平分隔線(只用于下拉式菜單、子菜單或快捷菜單)。
  MF_UNCHECKED: Acts as a toggle with MF_CHECKED to remove a check mark next to the item
HMENU hMenu,hSubMenu;
hMenu=GetMenu(hWnd);
hSubMenu=GetSubMenu(hMenu,0);
CheckMenuItem(hSubMenu,0,MF_BYPOSITION|MF_CHECKED);
 
23. BOOL EnableMenuItem(HMENU hMenu,UINT uIDEnableItem, UINT uEnable);
  返回值 : BOOL 判斷是否成功
  參數(shù)表 :
  參數(shù) 類型及說(shuō)明
  hMenu ,菜單句柄
  wIDEnableItem ,欲允許或禁止的一個(gè)菜單條目的標(biāo)識(shí)符。如果在wEnable參數(shù)中設(shè)置了MF_BYCOMMAND標(biāo)志,這個(gè)參數(shù)就代表欲改變菜單條目的命令I(lǐng)D。如設(shè)置的是MF_BYPOSITION,則這個(gè)參數(shù)代表菜單條目在菜單中的位置(第一個(gè)條目肯定是零)
  wEnable ,參考ModifyMenu函數(shù)中的菜單常數(shù)標(biāo)志定義表,其中列出了允許使用的所有常數(shù)。對(duì)于這個(gè)函數(shù),只能指定下述常數(shù):MF_BYCOMMAND,MF_BYPOSITION,MF_ENABLED,MF_DISABLED以及MF_GRAYED
  這些值有下列含義:
  
· MF_BYCOMMAND 指定參數(shù)給出已存在的菜單項(xiàng)的命令I(lǐng)D號(hào)。此為缺省值。 · MF_BYPOSITION 指定參數(shù)給出已存在菜單項(xiàng)的位置。第一項(xiàng)所在的位置是0。 · MF_DISABLED 使菜單項(xiàng)無(wú)效,以便它不能被選擇,但不變灰。 · MF_ENABLED 使菜單項(xiàng)有效,以便它能夠被選擇,并可從變灰的狀態(tài)中恢復(fù)出來(lái)。 · MF_GRAYED 使菜單項(xiàng)無(wú)效,以便它不能被選擇并同時(shí)變灰。
  注解
  如指定的菜單條目依附了一個(gè)彈出式菜單,那么整個(gè)彈出式菜單都會(huì)受到影響
  說(shuō)明:
  使菜單項(xiàng)有效、無(wú)效或變灰。CreateMenu,InsertMenu,ModifyMenu和LoadMenuIndirect成員函數(shù)同時(shí)也設(shè)置菜單項(xiàng)的狀態(tài)(有效、無(wú)效、或變灰)。
  使用MF_BYPOSITION的值需要應(yīng)用恰當(dāng)?shù)腃Menu對(duì)象。若菜單條的CMenu被使用,那么頂層菜單項(xiàng)(菜單條中的某項(xiàng))將受影響。如果為了在彈出菜單或嵌套的彈出菜單中通過(guò)位置來(lái)設(shè)置項(xiàng)的狀態(tài),那么應(yīng)用必須指定彈出菜單的CMenu。
  當(dāng)應(yīng)用指定了MF_BYCOMMAND標(biāo)志,那么Windows將檢測(cè)所有的屬于CMenu的彈出菜單項(xiàng)。因此,除非當(dāng)前正在復(fù)制菜單項(xiàng),那么使用菜單條的CMenu是非常有效的。
HMENU hMenu,hSubMenu;
hMenu=GetMenu(hWnd);
hSubMenu=GetSubMenu(hMenu,0);
CheckMenuItem(hSubMenu,0,MF_BYPOSITION|MF_DISABLED|MF_GRAYED );
 
24 BOOL CheckMenuRadioItem(HMEN hMENU,UINT idFirst,UINT idLast,UINT idCheck,UINT uFlags);
函數(shù)功能:該函數(shù)校核一個(gè)指定的菜單項(xiàng)并使其成為一個(gè)圓按鈕項(xiàng)。同時(shí)不校核相關(guān)組里的其他菜單項(xiàng)并清除這些項(xiàng)的國(guó)按鈕的類型標(biāo)志。
  函數(shù)原型:BOOL CheckMenuRadioItem(HMEN hMENU,UINT idFirst,UINT idLast,UINT idCheck,UINT uFlags);
  參數(shù):
  hMenu:包含一組菜單項(xiàng)的菜單的句柄。
  idFirst:菜單組里第一個(gè)菜單項(xiàng)的標(biāo)識(shí)符或位置。
  idLast:菜單組里最后一個(gè)菜單項(xiàng)的標(biāo)識(shí)符或位置。
  idCheck:要選取的菜單項(xiàng)的標(biāo)識(shí)符或位置。
  uFlag:指定idFirst,idLast,idCheck含義的值。如果此參數(shù)為MF_BYCOMMAND,則其他參數(shù)指定菜單項(xiàng)標(biāo)識(shí)符。如果此參數(shù)為MF_BYPOSITION,則其他參數(shù)指定菜單項(xiàng)位置。
  返回值:如果函數(shù)調(diào)用成功,返回值非零。如果函數(shù)調(diào)用失敗,返回值為零。若想獲得更多的錯(cuò)誤信息,請(qǐng)調(diào)用GetLastError函數(shù)。
  備注:CheckMenuRadioItem設(shè)置了MFT_RADIOCHECK類型標(biāo)志,并為由idCheck指定的項(xiàng)設(shè)置 MFS_CHECKED狀態(tài),同時(shí),清除組里所有其他項(xiàng)目的上述兩個(gè)標(biāo)志。被選取的項(xiàng)用項(xiàng)目目標(biāo)表示,而不是用復(fù)選標(biāo)記目標(biāo)。要得到更多的關(guān)于菜單項(xiàng)類型和狀態(tài)標(biāo)志的信息,參看MENUITEMINFO結(jié)構(gòu)。
HMENU hMenu,hSubMenu;
    hMenu=GetMenu(hWnd);
  hSubMenu=GetSubMenu(hMenu,0);
  InsertMenu(hSubMenu,0,MF_STRING,101,"Test1");
  InsertMenu(hSubMenu,1,MF_STRING,101,"Test2");
  InsertMenu(hSubMenu,2,MF_STRING,101,"Test3");
  
  CheckMenuItem(hSubMenu,0,MF_BYPOSITION|MF_CHECKED);
  CheckMenuItem(hSubMenu,2,MF_BYPOSITION|MF_CHECKED);
  break;

  //注意這里的菜單句柄必須重新定義,而不能使用上面的hMenu和hSubMenu
  //因?yàn)榇藭r(shí)是第二次進(jìn)入該窗口過(guò)程,上面的非靜態(tài)局部變量已經(jīng)不再可用
  HMENU hMenu1,hSubMenu1;
  hMenu1=GetMenu(hWnd);
  hSubMenu1=GetSubMenu(hMenu1,0);
  CheckMenuRadioItem(hSubMenu1,0,3,1,MF_BYPOSITION);
  break;
 
24.UINT MenuItemFromPoint(HWND hWnd,HMENU hMenu,POINT ptScreen)
判斷指定點(diǎn)是否有一個(gè)菜單項(xiàng)。
HMENU hMenu;
POINT pt;
int  pos;
MENUITEMINFO mi;
RECT rect;
//獲取窗口的外框矩形坐標(biāo)
GetWindowRect(hWnd,&rect);
//定位第一個(gè)菜單項(xiàng)的坐標(biāo)
pt.x=rect.left+10;
pt.y=rect.top+30;
hMenu=GetMenu(hWnd);
if((pos=MenuItemFromPoint(hWnd,hMenu,pt))>=0){
  char szName[16];
  mi.cbSize=sizeof(MENUITEMINFO);
  mi.fMask=MIIM_TYPE;
  mi.dwTypeData=szName;
  mi.cch=16;
  GetMenuItemInfo(hMenu,pos,TRUE,&mi);
  MessageBox(NULL,szName,"MenuItemFromPoint",MB_OK);
 
25BOOL SetMenu(HWND hWnd,HMENU hMenu)
函數(shù)功能:該函數(shù)分配一個(gè)新菜單到指定窗口。
  函數(shù)原型:BOOL SetMenu(HWND hWnd,HMENU hMenu);
  參數(shù):
  hWnd:菜單被分配到其中的窗口的句柄。
  HMenu:新菜單的句柄。如果菜單參數(shù)為NULL,則窗口的當(dāng)前菜單被刪除。
  返回值:如果函數(shù)調(diào)用成功,返回非零值;如果函數(shù)調(diào)用失敗,返回值是零。若想獲得更多的錯(cuò)誤信息,請(qǐng)調(diào)用GetLastError函數(shù)。
  備注:窗口被重畫來(lái)反映菜單的修改。函數(shù)SetMenu替換原來(lái)的菜單(如果存在),但并不將其銷毀。應(yīng)用程序必須調(diào)用函數(shù)DestroyMenu來(lái)銷毀菜單。
 
26.BOOL SetMenuItemBitmaps(UINT nPosition,UINT nFlags,const CBitmap* pBmpUnchecked,const CBitmap* pBmpChecked)
設(shè)置一幅特定位圖,令其在指定的菜單條目中使用,代替標(biāo)準(zhǔn)的復(fù)選符號(hào)(√)。位圖的
大小必須與菜單復(fù)選符號(hào)的正確大小相符,這個(gè)正確大小可以由GetMenuCheckMarkDimens
ions函數(shù)獲得 
返回值 
Long,非零表示成功,零表示失敗。會(huì)設(shè)置GetLastError 
參數(shù)表 
參數(shù) 類型及說(shuō)明 
hMenu Long,菜單句柄 
nPosition Long,欲設(shè)置位圖的一個(gè)菜單條目的標(biāo)識(shí)符。如在wFlags參數(shù)中指定了
MF_BYCOMMAND,這個(gè)參數(shù)就代表欲改變的菜單條目的命令I(lǐng)D。如設(shè)置的是MF_BYPOSITION
,這個(gè)參數(shù)就代表菜單條目在菜單中的位置(第一個(gè)條目的位置為零) 
wFlags Long,常數(shù)MF_BYCOMMAND或MF_BYPOSITION,取決于nPosition參數(shù) 
hBitmapUnchecked Long,撤消復(fù)選時(shí)為菜單條目顯示的一幅位圖的句柄。如果為零,表
示不在未復(fù)選狀態(tài)下顯示任何標(biāo)志 
hBitmapChecked Long,復(fù)選時(shí)為菜單條目顯示的一幅位圖的句柄??稍O(shè)為零,表示復(fù)選
時(shí)不顯示任何標(biāo)志。如兩個(gè)位圖句柄的值都是零,則為這個(gè)條目恢復(fù)使用默認(rèn)復(fù)選位圖 
 
27 HMENU Detach(); 
  MFC類里CMENU類的成員函數(shù)。功能是切斷一個(gè)CWnd對(duì)象和一個(gè)有效窗口的聯(lián)系。
  由于WNDCLASS其實(shí)和CWnd根本沒(méi)有什么關(guān)系,它們之間只是通過(guò)CWnd的成員HWND聯(lián)系起來(lái)的。Detach的作用是切斷一個(gè)CWnd對(duì)象和一個(gè)有效窗口的聯(lián)系。因?yàn)镃Wnd是C++的對(duì)象,C++的對(duì)象有一個(gè)生存期的概念,脫離了該對(duì)象的作用域,這個(gè)對(duì)象就要被銷毀,但是Windows對(duì)象沒(méi)有這個(gè)特點(diǎn),當(dāng)銷毀CWnd對(duì)象的時(shí)候,我們不一定希望WNDCLASS一起被銷毀,那么在此之前,我們就先要把這個(gè)聯(lián)系切斷。
  當(dāng)我們建立了一個(gè)局部的菜單對(duì)象后,比如 在一個(gè)窗口類的函數(shù)里建立了一個(gè)局部菜單對(duì)象,當(dāng)這個(gè)窗口函數(shù)的生命周期結(jié)束時(shí),如果不希望菜單對(duì)象也被銷毀,就要用detach()函數(shù)把菜單句柄和這個(gè)菜單對(duì)象分離。這樣,當(dāng)局部的菜單對(duì)象被銷毀時(shí),它不會(huì)銷毀一個(gè)它不具備擁有權(quán)的菜單。
SM_CXMENUCHECK, SM_CYMENUCHECK 以像素為單位計(jì)算的菜單選中標(biāo)記位圖的尺寸
CFrameWnd::m_bAutoMenuEnable  = FALSE; (系統(tǒng)默認(rèn)的為TRUE);
菜單命令消息路由的具體過(guò)程:
當(dāng)點(diǎn)擊某個(gè)菜單項(xiàng)時(shí),框架類先接受菜單消息,框架類在交給視類處理。如果視類不作處理,則交給文檔類處理。文檔類不處理,則交還給視類,視類
交還給框架類,框架類交還給應(yīng)用程序。
 
一。創(chuàng)建非Popup類型菜單,不使用資源。 
(一)創(chuàng)建非下拉菜單。 
1。在窗口類的OnCreate函數(shù)里創(chuàng)建CMenu對(duì)象。如果是創(chuàng)建運(yùn)用程序主框架窗口 
的話,也可以在InitInstance()函數(shù)里。 
2。聲明一個(gè)CMenu對(duì)象:CMenu MyMenu; 
3。調(diào)用MyMenu.CreateMenu()或MyMenu.LoadMenu() 
4。調(diào)用若干次MyMenu.AppendMenu()或MyMenu.InsertMenu(),每調(diào)用一次創(chuàng)建一 
個(gè)菜單項(xiàng)。 
5。調(diào)用MyMneu.SetMenu()將菜單Attach到窗口上。 
6。調(diào)用MyMenu.Detach()。 
int CMyWnd::OnCreate( LPCREATESTRUCT lpCreateStruct )  
{  
  CMenu MyMenu;  
  MyMenu.CreateMenu();  
  MyMenu.AppendMenu(MF_STRING,IDM_MENU0,"文件");  
  MyMenu.InsertMenu(IDM_MENU2,MF_BYCOMMAND,IDM_ITEM0,"有關(guān)");  
  this->SetMenu(&MyMenu);  
  MyMenu.Detach();  
  return 0;  
}
用Detach()使菜單和MyMenu對(duì)象脫離關(guān)系,因?yàn)镸yMenu對(duì)象是一個(gè)局部變量,馬上就要超出作用域了,這一步是必須的。  
而SetMenu 是CMyWnd的成員函數(shù),是建立看得見(jiàn)的菜單同CMyWnd::m_cmenu的關(guān)系
DestroyMenu則根據(jù)m_cmenu 銷毀看得見(jiàn)的菜單。
備注:一個(gè)應(yīng)用程序在關(guān)閉之前,必須調(diào)用函數(shù)DestroyMenu來(lái)銷毀一個(gè)沒(méi)被分配給窗口的菜單。分配給窗口的菜單,當(dāng)應(yīng)用程序關(guān)閉時(shí),被自動(dòng)銷毀。 

(二)創(chuàng)建下拉菜單,不使用資源。 
這種菜單當(dāng)鼠標(biāo)移動(dòng)到菜單條目上面點(diǎn)擊時(shí)不是去執(zhí)行某段程序,而是彈出 
一個(gè)下拉菜單。這需要用前面的方法創(chuàng)建兩個(gè)菜單。第一個(gè)是鼠標(biāo)未點(diǎn)擊時(shí)看到 
的那個(gè)菜單,另一個(gè)就是扮演下拉菜單的菜單。例子: 
int CMyWnd::OnCreate( LPCREATESTRUCT lpCreateStruct ) 
CMenu MyMenu0,MyMenu1; 
//下面這幾條創(chuàng)建下拉菜單 
MyMenu1.CreateMenu(); 
MyMenu1.AppendMenu(MF_STRING,IDM_ITEM0,"拷貝"); 
MyMenu1.AppendMenu(MF_STRING,IDM_ITEM1,"剪切"); 
MyMenu1.AppendMenu(MF_STRING,IDM_ITEM2,"粘貼"); 
MyMenu1.AppendMenu(MF_SEPARATOR,IDM_ITEM3,""); 
MyMenu1.AppendMenu(MF_STRING,IDM_ITEM4,"全選"); 
MyMenu1.AppendMenu(MF_SEPARATOR,IDM_ITEM5,""); 
MyMenu1.AppendMenu(MF_STRING,IDM_ITEM6,"刪除"); 
//下面這兩條創(chuàng)建鼠標(biāo)未點(diǎn)擊時(shí)看到的那個(gè)菜單 
//其中第二句將下拉菜單張貼到第一個(gè)菜單上。 
MyMenu0.CreateMenu(); 
MyMenu0.AppendMenu(MF_POPUP,(UINT)MyMenu1.m_hMenu,"編輯"); 

this->SetMenu(&MyMenu0);//將菜單張貼到窗口上 
MyMenu0.Detach();//必須有 
MyMenu1.Detach();//必須有 
return 0; 

二。創(chuàng)建Popup類型的菜單,也不用資源。 
很多程序里,只要用鼠標(biāo)右鍵點(diǎn)一下窗口客戶區(qū),就會(huì)在鼠標(biāo)的位置彈出一 
個(gè)菜單,這叫右鍵菜單。我們可以用CMenu類來(lái)制作。 
制作這種菜單比制作第一類菜單稍微復(fù)雜點(diǎn)。首先要在窗口類里加個(gè)成員變 
量:CMenu *MyMenu2; 
然后在窗口類的構(gòu)造函數(shù)里(或OnCreate()函數(shù)里)加上創(chuàng)建菜單的語(yǔ)句,再 
在析構(gòu)函數(shù)里加上銷毀菜單的語(yǔ)句,最后在OnRButtonDown()函數(shù)里加上顯示菜單 
的語(yǔ)句。 
創(chuàng)建菜單時(shí),CMenu類對(duì)象應(yīng)該用new來(lái)分配。 
例子: 

CMyWnd::CMyWnd() 
//CMyWnd是從CWnd派生來(lái)的。 
//先把菜單創(chuàng)建起來(lái)。 
MyMenu2=new CMenu; 
MyMenu2->CreatePopupMenu(); 
MyMenu2->AppendMenu(MF_STRING,IDM_ITEM0,"拷貝"); 
MyMenu2->AppendMenu(MF_STRING,IDM_ITEM1,"剪切"); 
MyMenu2->AppendMenu(MF_STRING,IDM_ITEM2,"粘貼"); 
MyMenu2->AppendMenu(MF_SEPARATOR,IDM_ITEM3,""); 
MyMenu2->AppendMenu(MF_STRING,IDM_ITEM4,"全選"); 
MyMenu2->AppendMenu(MF_SEPARATOR,IDM_ITEM3,""); 
MyMenu2->AppendMenu(MF_STRING,IDM_ITEM5,"刪除"); 

CMyWnd::~CMyWnd() 
MyMenu2->DestroyMenu();//銷毀菜單所占用的系統(tǒng)資源 
delete MyMenu2;//銷毀菜單類對(duì)象 
void CMyWnd::OnRButtonDown(UINT nFlags, CPoint point) 
RECT rect; 
GetWindowRect(&rect); 
//顯示菜單 
MyMenu2->TrackPopupMenu(TPM_RIGHTALIGN,point.x+rect.left,point.y+ 
rect.top,this,NULL); 

三。使用資源編輯器做好的菜單,只能做非POPUP類型菜單。 
如果使用資源的話,創(chuàng)建菜單確實(shí)非常簡(jiǎn)單了,只須在窗口類的OnCreate() 
函數(shù)里加幾句話就行了: 
int CMyWnd::OnCreate( LPCREATESTRUCT lpCreateStruct ) 
CMenu MyMenu3; 
MyMenu3.LoadMenu(IDR_MENU1);//IDR_MENU1是你的菜單的資源ID。 
this->SetMenu(&MyMenu3);   // this == CMyWnd*
MyMenu3.Detach(); 
return 0; 

MFC類里CMENU類的成員函數(shù)。功能是切斷一個(gè)CWnd對(duì)象和一個(gè)有效窗口的聯(lián)系。   由于WNDCLASS其實(shí)和CWnd根本沒(méi)有什么關(guān)系,它們之間只是通過(guò)CWnd的成
員HWND聯(lián)系起來(lái)的。Detach的作用是切斷一個(gè)CWnd對(duì)象和一個(gè)有效窗口的聯(lián)系。因?yàn)镃Wnd是C++的對(duì)象,C++的對(duì)象有一個(gè)生存期的概念,脫離了該對(duì)象的作用域,這
個(gè)對(duì)象就要被銷毀,但是Windows對(duì)象沒(méi)有這個(gè)特點(diǎn),當(dāng)銷毀CWnd對(duì)象的時(shí)候,我們不一定希望WNDCLASS一起被銷毀,那么在此之前,我們就先要把這個(gè)聯(lián)系切斷。  
當(dāng)我們建立了一個(gè)局部的菜單對(duì)象后,比如 在一個(gè)窗口類的函數(shù)里建立了一個(gè)局部菜單對(duì)象,當(dāng)這個(gè)窗口函數(shù)的生命周期結(jié)束時(shí),如果不希望菜單對(duì)象也被銷毀,就要用
detach()函數(shù)把菜單句柄和這個(gè)菜單對(duì)象分離。這樣,當(dāng)局部的菜單對(duì)象被銷毀時(shí),它不會(huì)銷毀一個(gè)它不具備擁有權(quán)的菜單。


m_menu.CreateMenu();
CString c_menustr;
while (! m_pRecord->ADOEOF)
{
c_menustr = m_pRecord->GetCollect("菜單名稱").bstrVal;
//menu.AppendMenu(MF_STRING,-1,c_menustr);
LoadSubMenu(&m_menu,c_menustr);
m_pRecord->MoveNext();
}
SetMenu(&m_menu);

void  LoadSubMenu(CMenu* m_menu,CString str)
{
CMenu m_tempmenu;
m_tempmenu.CreateMenu();

while (!m_record->ADOEOF)
{
CString c_menustr = m_record->GetCollect("菜單名稱").bstrVal;
if(IsHaveSubMenu(c_menustr))
{
LoadSubMenu(&m_tempmenu,c_menustr);
}
else
m_tempmenu.AppendMenu(MF_STRING,-1,c_menustr);
m_record->MoveNext();
}

m_menu->AppendMenu(MF_POPUP,(UINT)m_tempmenu.m_hMenu,str);
m_tempmenu.Detach();
}


自定義菜單時(shí),需要
(1)主窗口
m_menu.AttatchMenu(this->GetMenu()->GetSafeHmenu());
m_menu.ChangeMenuItem(&m_menu,TRUE);
或是m_menu.LoadMenu(IDR_POPUPMENU);
m_menu.ChangeMenuItem(&m_menu);


ON_WM_DRAWITEM()
ON_WM_MEASUREITEM()
afx_msg void OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct);
afx_msg void OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct);

void CMainFrame::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)  // 
{
m_menu.DrawItem(lpDrawItemStruct);
// CFrameWnd::OnDrawItem(nIDCtl, lpDrawItemStruct);
}

void CMainFrame::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct) 
{
m_menu.MeasureItem(lpMeasureItemStruct);
// CFrameWnd::OnMeasureItem(nIDCtl, lpMeasureItemStruct);
}

void CMainFrame::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct) 

lpMeasureItemStruct 是指向MEASUREITEMSTRUCT結(jié)構(gòu)體的指針,其成員變量
UINT CtlType; // 要繪制的類型
UINT itemID; // 菜單選項(xiàng)ID
UINT itemWidth; //菜單選項(xiàng)寬度
UINT itemHeight; //菜單選項(xiàng)高度

void CMainFrame::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)

lpDrawItemStruct 是指向DRAWITEMSTRUCT結(jié)構(gòu)體的指針,其成員變量
UINT CtlType; // 要繪制的類型
UINT itemID; // 菜單選項(xiàng)ID
UINT itemAction; // 菜單動(dòng)作
UINT itemState; // 菜單選項(xiàng)的當(dāng)前狀態(tài)
HWND hwndItem; // 頂層菜單的句柄 
HDC hDC; // 繪制設(shè)備DC 
RECT rcItem; // 菜單選項(xiàng)的大小
DWORD itemData; // 附加自定義數(shù)據(jù),由AppendMenu或InsertMenu或ModifyMenu的lpszNewItem指定


WM_DRAWITEM:繪制菜單的樣式
WM_MEASUREITEM:指定要繪制菜單的大小
WM_INITMENU:把框架菜單全部改成帶MF_OWNERDRAW標(biāo)志


(2)class CIconMenu : public CMenu

struct CMenuItemInfo
{
CString m_ItemText;//菜單項(xiàng)文本
int m_IconIndex;//菜單項(xiàng)索引
int m_ItemID;//菜單標(biāo)記 -2頂層菜單,-1彈出式菜單,0分隔條,其他普通菜單
};

CMenuItemInfo m_ItemLists[MAX_MENUCOUNT]; //菜單項(xiàng)信息

BOOL  CIconMenu::AttatchMenu(HMENU m_hmenu)
{
this->Attach(m_hmenu);
return TRUE;
}

BOOL CIconMenu::ChangeMenuItem(CMenu* m_menu,BOOL m_Toped)
{
if (m_menu != NULL)
{
int m_itemcount = m_menu->GetMenuItemCount();
for (int i=0;i<m_itemcount;i++)
{
m_menu->GetMenuString(i,m_ItemLists[m_index].m_ItemText,MF_BYPOSITION);
int m_itemID = m_menu->GetMenuItemID(i);
if (m_itemID==-1 && m_Toped)
{
m_itemID = -2;//頂層菜單
};
m_ItemLists[m_index].m_ItemID = m_itemID;
if (m_itemID>0)
{
m_ItemLists[m_index].m_IconIndex= m_iconindex;
m_iconindex+=1;
}
m_menu->ModifyMenu(i,MF_OWNERDRAW|MF_BYPOSITION |MF_STRING,m_ItemLists[m_index].m_ItemID,(LPSTR)&(m_ItemLists

[m_index]));
m_index+=1;
CMenu* m_subMenu = m_menu->GetSubMenu(i);

if (m_subMenu)
{
ChangeMenuItem(m_subMenu);
}
}
}
return TRUE ;
}

void CIconMenu::MeasureItem( LPMEASUREITEMSTRUCT lpStruct )

void CIconMenu::DrawItem( LPDRAWITEMSTRUCT lpStruct )


響應(yīng)系統(tǒng)菜單按鍵

// 相應(yīng)系統(tǒng)的下拉菜單
void CPeculiarMenuDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if (nID == IDI_PECULIARMENU)
{
MessageBox("系統(tǒng)菜單","提示",MB_OKCANCEL|MB_ICONINFORMATION|MB_DEFBUTTON2);
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}

獲取系統(tǒng)菜單
CMenu *m_pMenu = GetSystemMenu(FALSE); // GetSystemMenu(); 獲取系統(tǒng)菜單


【VC++】在對(duì)話框中使用ON_UPDATE_COMMAND_UI更新菜單

從命令用戶界面處理函數(shù)(Command UI handler)改變菜單狀態(tài)(啟用/禁用,選擇/取消選擇,更改文字)在由對(duì)話框處理時(shí)沒(méi)有正常工作。

 

原因:在下拉菜單顯示的時(shí)候, WM_INITMENUPOPUP消息被先發(fā)送以顯示菜單項(xiàng)。MFC CFrameWnd::OnInitMenuPopup 函數(shù)遍歷菜單項(xiàng)并為每個(gè)菜單項(xiàng)調(diào)用更新命令處

理函數(shù)(如果有的話)。菜單的外觀被更新以反映它的狀態(tài)(啟用/禁用,選擇/取消選擇)。更新用戶界面機(jī)制在基于對(duì)話框的應(yīng)用程序中不能工作,因?yàn)镃Dialog沒(méi)有

OnInitMenuPopup 處理函數(shù),而使用CWnd's 默認(rèn)處理函數(shù),該函數(shù)沒(méi)有為菜單項(xiàng)調(diào)用更新命令處理函數(shù)。

 

解決辦法:

class CTestDlg : public CDialog
{
void OnInitMenuPopup(CMenu *pPopupMenu, UINT nIndex,BOOL bSysMenu);
afx_msg void OnUpdateChkckDelete(CCmdUI* pCmdUI);
afx_msg void OnUpdateChkckCut(CCmdUI* pCmdUI);
afx_msg void OnUpdateChkckCopy(CCmdUI* pCmdUI);
afx_msg void OnUpdateChkckSend(CCmdUI* pCmdUI);
afx_msg void OnUpdateChkckPaste(CCmdUI* pCmdUI);
}
1.在消息映射中添加ON_WM_INITMENUPOPUP項(xiàng)

[cpp] view plaincopy
BEGIN_MESSAGE_MAP(CTestDlg, CDialog)  
    //{{AFX_MSG_MAP(CTestDlg)  
.......  
    //}}AFX_MSG_MAP  
    ON_WM_INITMENUPOPUP()   
    ON_UPDATE_COMMAND_UI(ID_CHKCK_DELETE, OnUpdateChkckDelete)
    ON_UPDATE_COMMAND_UI(ID_CHKCK_CUT, OnUpdateChkckCut)
    ON_UPDATE_COMMAND_UI(ID_CHKCK_COPY, OnUpdateChkckCopy)
    ON_UPDATE_COMMAND_UI(ID_CHKCK_SEND, OnUpdateChkckSend)
    ON_UPDATE_COMMAND_UI(ID_CHKCK_PASTE, OnUpdateChkckPaste)
END_MESSAGE_MAP()  

2.在你的對(duì)話框類中添加OnInitMenuPopup成員函數(shù)且復(fù)制下列代碼到該函數(shù)(注意:代碼基本上是從CFrameWnd::OnInitMenuPopup(在WinFrm.cpp中)復(fù)制過(guò)來(lái)的)。

[cpp] view plaincopy
void CTestDlg::OnInitMenuPopup(CMenu *pPopupMenu, UINT nIndex,BOOL bSysMenu)  
{  
    ASSERT(pPopupMenu != NULL);  
      
    CCmdUI state;  
    state.m_pMenu = pPopupMenu;  
    ASSERT(state.m_pOther == NULL);  
    ASSERT(state.m_pParentMenu == NULL);  
      
    HMENU hParentMenu;  
    if (AfxGetThreadState()->m_hTrackingMenu == pPopupMenu->m_hMenu)  
        state.m_pParentMenu = pPopupMenu;      
    else if ((hParentMenu = ::GetMenu(m_hWnd)) != NULL)  
    {  
        CWnd* pParent = this;  
        if (pParent != NULL &&  
            (hParentMenu = ::GetMenu(pParent->m_hWnd)) != NULL)  
        {  
            int nIndexMax = ::GetMenuItemCount(hParentMenu);  
            for (int nIndex = 0; nIndex < nIndexMax; nIndex++)  
            {  
                if (::GetSubMenu(hParentMenu, nIndex) == pPopupMenu->m_hMenu)  
                {  
                    state.m_pParentMenu = CMenu::FromHandle(hParentMenu);  
                    break;  
                }  
            }  
        }  
    }  
      
    state.m_nIndexMax = pPopupMenu->GetMenuItemCount();  
    for (state.m_nIndex = 0; state.m_nIndex < state.m_nIndexMax;  
    state.m_nIndex++)  
    {  
        state.m_nID = pPopupMenu->GetMenuItemID(state.m_nIndex);  
        if (state.m_nID == 0)  
            continue;   
          
        ASSERT(state.m_pOther == NULL);  
        ASSERT(state.m_pMenu != NULL);  
        if (state.m_nID == (UINT)-1)  
        {  
            state.m_pSubMenu = pPopupMenu->GetSubMenu(state.m_nIndex);  
            if (state.m_pSubMenu == NULL ||  
                (state.m_nID = state.m_pSubMenu->GetMenuItemID(0)) == 0 ||  
                state.m_nID == (UINT)-1)  
            {  
                continue;        
            }  
            state.DoUpdate(this, TRUE);    
        }  
        else  
        {  
            state.m_pSubMenu = NULL;  
            state.DoUpdate(this, FALSE);  
        }  
          
        UINT nCount = pPopupMenu->GetMenuItemCount();  
        if (nCount < state.m_nIndexMax)  
        {  
            state.m_nIndex -= (state.m_nIndexMax - nCount);  
            while (state.m_nIndex < nCount &&  
                pPopupMenu->GetMenuItemID(state.m_nIndex) == state.m_nID)  
            {  
                state.m_nIndex++;  
            }  
        }  
        state.m_nIndexMax = nCount;  
    }  
}   


void CChkDlgWnd::OnUpdateChkckPaste(CCmdUI* pCmdUI)
{
CWnd* pWnd = GetFocus();
if(pWnd)
{
if( pWnd->IsKindOf( RUNTIME_CLASS(CChkckTreeView) ) )
{
m_pTreeView->OnUpdateChkckPaste(pCmdUI);
}
}
}
 
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
在菜單中加入圖標(biāo)
菜單和列表框 (轉(zhuǎn))
TrackPopupMenu
菜單及其它資源
vb教程之在系統(tǒng)菜單上添加自定義菜單項(xiàng)
No MFC,Only API - 菜單的創(chuàng)建和使用
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服