. 4.
:
. 4. .. 1
4.1. .. 2
4.2. .. 4
4.2.1. .. 6
4.2.2. .. 11
4.2.3. .. 15
4.2.4. .. 22
4.3. .. 26
4.3.1. WM_INITMENU.. 26
4.3.2. WM_INITMENUPOPUP. 27
4.3.3. WM_COMMAND.. 27
4.3.4. WM_MENUSELECT. 27
4.4. .. 27
4.5. .. 31
.. 45
. 45
. . , WM_COMMAND .
. . , . . , . , . .
. , . , , . .
. , . . "" , "" . . , , , .
, .
. . . . . .
, . MENUITEMINFO:
typedef struct
{
UINT cbSize;
UINT fMask;
UINT fType;
UINT fState;
UINT wID;
HMENU hSubMenu;
|
|
HBITMAP hbmpChecked;
HBITMAP hbmpUnchecked;
DWORD dwItemData;
LPTSTR dwTypeData;
UINT cch;
} MENUITEMINFO;
:
static MENUITEMINFO mii;
cbsize MENUITEMINFO :
mii.cbSize = sizeof(MENUITEMINFO);
fMask , mii . , . fMask :
Co | |
MIIM_CHECKMARKS | hbmpChecked hbmpUnchecked |
MIIM_DATA | dwItemData |
MIIM_ID | wID |
MIIM_STATE | fState |
MIIM_SUBMENU | hsubMenu |
MIIM_TYPE | fType dwTypeData |
, fMask :
mii.fMask = MIIM_STATE | MIIM_TYPE | MIIM_SUBMENU | MIIM_ID;
fState, fType, dwTypeData, hSubMenu wID mii.
fMask -:
mii.fMask = MIIM_STATE | MIIM_ID;
fState wID.
fType . :
MFT_BITMAP | , dwTypeData, cch |
MFT_MENUBARBREAK | ( ) ( ). |
MFT_MENUBREAK | , MFT_MENUBARBREAK, |
MFT_RADIOCHECK | hbmpChecked = NULL, , |
MFT_RIGHTJUSTIFY | |
MFT_SEPARATOR | . dwTypeData cch |
MFT_STRING | dwTypeData, cch |
, MFT_BITMAP, MFT_SARATOR MFT_STRING.
. , , :
mii.fType=MFT_STRING;
fState . :
MFS_CHECKED | |
MFS_DEFAULT | |
MFS_DISABLED | |
MFS_ENABLED | |
MFS_GRAYED | |
MFS_HILITE | |
MFS_UNCHECKED | |
MFS_UNHILITE |
wID , .
. , "" CM_FILE_NEW.
:
#define CM_FILE_NEW 3001
wID :
mii.wID = CM_FILE_NEW;
|
|
hSubMenu , . , NULL.
hbmpChecked . NULL, .
hbmpUnchecked . NULL, .
dwItemData , .
dwTypeData . mii.fType = MFT_STRING dwTypeData .
cch dwTypeData 0.
:
1. hMenu.
2. hMenu.
3. 2 , hMenu.
. , 2- . .
. , , , . .
CreateMenu :
HMENU CreateMenu(VOID);
CreateMenu , NULL.
CreatePopupMenu :
HMENU CreatePopupMenu(VOID);
CreatePopupMenu , NULL.
SetMenu hMenu hwnd:
BOOL SetMenu(HWND hwnd, HMENU hMenu);
, . hMenu = NULL, . .
, hwnd, DrawMenuBar:
void WINAPI DrawMenuBar(HWND hwnd);
hwnd.
, :
1. . .
2. .
3. .
.
, .
InsertMenuItem hMenu:
BOOL InsertMenuItem(HMENU hMenu, UINT uItem,
BOOL fByPosition, LPMENUITEMINFO lpmii);
uItem fByPosition. fByPosition = FALSE uItem , , . n , n (n = 0, 1, 2,...).
lpmii MENUITEMINFO, .
.
. .
.
BOOL CreateMenuItem(HMENU hMenu, char *str, UINT uIns, UINT uCom, HMENU hSubMenu, BOOL flag, UINT fType)
{
MENUITEMINFO mii;
mii.cbSize = sizeof(MENUITEMINFO);
mii.fMask = MIIM_STATE | MIIM_TYPE | MIIM_SUBMENU | MIIM_ID;
mii.fType = fType;
|
|
mii.fState = MFS_ENABLED;
mii.dwTypeData = str;
mii.cch = sizeof(str);
mii.wID = uCom;
mii.hSubMenu = hSubMenu;
return InsertMenuItem(hMenu, uIns, flag, &mii);
}
.
1. hMenu , .
2. str .
3. uIns uItem InsertMenuItem.
4. uCom, , wID InsertMenuItem.
5. hSubMenu , str hMenu.
6. flag fByPosition InsertMenuItem.
7. fType , fType MENUITEMINFO.
. "" "". "" "", "" "". "" "" "".
4.1. .
#include <windows.h>
#define CM_FILE_OPEN 1001
#define CM_FILE_SAVE 1002
#define CM_FILE_QUIT 1003
#define CM_EDIT_FIND 2001
#define CM_EDIT_REPLC 2002
BOOL RegClass(WNDPROC, LPCTSTR, UINT);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE hInstance;
TCHAR szClass[] = TEXT("MenuWindow");
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpszCmdLine, int nCmdShow)
{
MSG msg;
HWND hwnd;
hInstance = hInst;
if (!RegClass(WndProc, szClass, COLOR_WINDOW)) return FALSE;
hwnd = CreateWindow(szClass, TEXT(" "), WS_OVERLAPPEDWINDOW | WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, hInstance, NULL);
if (!hwnd) return FALSE;
while(GetMessage(&msg, 0, 0, 0))
{ TranslateMessage(&msg); DispatchMessage(&msg); }
return msg.wParam;
}
BOOL RegClass(WNDPROC Proc, LPCTSTR szName, UINT brBackground)
{
WNDCLASS wc;
wc.style = wc.cbClsExtra = wc.cbWndExtra = 0;
wc.lpfnWndProc = Proc;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(brBackground +1);
wc.lpszMenuName = NULL;
wc.lpszClassName = szName;
return (RegisterClass(&wc)!= 0);
}
BOOL CreateMenuItem(HMENU hMenu, TCHAR *str, UINT uIns, UINT uCom, HMENU hSubMenu, BOOL flag, UINT fType)
{
MENUITEMINFO mii;
mii.cbSize = sizeof(MENUITEMINFO);
mii.fMask = MIIM_STATE | MIIM_TYPE | MIIM_SUBMENU | MIIM_ID;
mii.fType = fType;
mii.fState = MFS_ENABLED;
mii.dwTypeData = str;
mii.cch = sizeof(str);
mii.wID = uCom;
mii.hSubMenu = hSubMenu;
return InsertMenuItem(hMenu, uIns, flag, &mii);
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
static HMENU hMainMenu, hFileMenu, hEditMenu;
switch (msg)
{
case WM_CREATE:
{
hMainMenu = CreateMenu();
// ""
hFileMenu = CreatePopupMenu();
int i=0; // hFileMenu
CreateMenuItem(hFileMenu, TEXT("&"), i++, CM_FILE_OPEN, NULL, FALSE, MFT_STRING);
CreateMenuItem(hFileMenu, TEXT("&"), i++, CM_FILE_SAVE, NULL, FALSE, MFT_STRING);
CreateMenuItem(hFileMenu, NULL, i++, 0, NULL, FALSE, MFT_SEPARATOR);
CreateMenuItem(hFileMenu, TEXT("&"), i++, CM_FILE_QUIT, NULL, FALSE, MFT_STRING);
|
|
// ""
hEditMenu = CreatePopupMenu();
i=0; // hEditMenu
CreateMenuItem(hEditMenu, TEXT("&"), i++, CM_EDIT_FIND, NULL, FALSE, MFT_STRING);
CreateMenuItem(hEditMenu, TEXT("&3"), i++, CM_EDIT_REPLC, NULL, FALSE, MFT_STRING);
//
i=0; // hMainMenu
CreateMenuItem(hMainMenu, TEXT("&"), i++, 0, hFileMenu, FALSE, MFT_STRING);
CreateMenuItem(hMainMenu, TEXT("&"), i++, 0, hEditMenu, FALSE, MFT_STRING);
SetMenu(hwnd, hMainMenu);
DrawMenuBar(hwnd);
return 0;
}
case WM_COMMAND:
{
switch (LOWORD(wParam))
{
case CM_FILE_OPEN:
{ MessageBox(hwnd, TEXT(" CM_FILE_OPEN"), TEXT(""), MB_OK); return 0; }
case CM_FILE_SAVE:
{ MessageBox(hwnd, TEXT(" CM_FILE_SAVE"), TEXT(""), MB_OK); return 0; }
case CM_EDIT_FIND:
{ MessageBox(hwnd, TEXT(" CM_EDIT_FIND"), TEXT(""), MB_OK); return 0; }
case CM_EDIT_REPLC:
{ MessageBox(hwnd, TEXT(" CM_EDIT_REPLC"), TEXT(""), MB_OK); return 0; }
case CM_FILE_QUIT: { DestroyWindow(hwnd); return 0; }
}
return 0;
}
case WM_DESTROY: { PostQuitMessage(0); return 0; }
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
CreateMenuItem . , . .
1. :
static HMENU hMainMenu, hFileMenu, hEditMenu;
2. WM_CREATE ( ).
2.1. :
hMainMenu = CreateMenu();
2.2. "".
2.2.1. :
hFileMenu = CreatePopupMenu();
2.2.2. hFileMenu:
CreateMenuItem(hFileMenu, "&", i++, CM_FILE_OPEN,
NULL, FALSE, MFT_STRING);
CreateMenuItem(hFileMenu,"&", i++, CM_FILE_SAVE,
NULL, FALSE, MFT_STRING);
CreateMenuItem(hFileMenu, NULL, i++, 0,
NULL, FALSE, MFT_SEPARATOR);
CreateMenuItem(hFileMenu, "&", i++, CM_FILE_QUIT,
NULL, FALSE, MFT_STRING);
"&" , . & , "" . CM_FILE_OPEN , "&".
. .
2.3. "".
2.3.1. :
hEditMenu = CreatePopupMenu();
2.3.2. hEditMenu:
CreateMenuItem(hEditMenu, "&", i++, CM_EDIT_FIND,
NULL, FALSE, MFT_STRING);
CreateMenuItem(hEditMenu,"&3aMeHHTb", i++, CM_EDIT_REPLC,
NULL, FALSE, MFT_STRING);
2.4. hFileMenu hEditMenu hMainMenu:
CreateMenuItem(hMainMenu, "&", i++,
0, hFileMenu, FALSE, MFT_STRING);
CreateMenuItem(hMainMenu, "&", i++,
0, hEditMenu, FALSE, MFT_STRING);
3. :
SetMenu(hwnd, hMainMenu);
DrawMenuBar(hwnd);
. , .
DeleteMenu . , DeleteMenu . :
BOOL DeleteMenu(HMENU hMenu, UINT uPosition, UINT uFlags);
:
1. hMenu .
2. uPosition . uFlags.
3. uFlags uPosition. uFlags = MF_BYCOMMAND ( ), uPosition . uFlags = MF_BYPOSITION, uPosition .
|
|
.
RemoveMenu , . . :
BOOL RemoveMenu(HMENU hMenu, UINT uPosition, UINT uFlags);
RemoveMenu DeleteMenu. RemoveMenu .
DestroyMenu:
BOOL DestroyMenu(HMENU hMenu);
, . , , . .
.
. "". "" "", "", "". "" "".. "" "" "". "", "".
4.2. .
#include <windows.h>
#define CM_FILE_OPEN 1001
#define CM_FILE_SAVE 1002
#define CM_FILE_QUIT 1003
#define CM_EDIT_FIND 2001
#define CM_EDIT_REPLC 2002
BOOL RegClass(WNDPROC, LPCTSTR, UINT);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE hInstance;
TCHAR szClass[] = TEXT("RemoveMenu");
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpszCmdLine, int nCmdShow)
{
MSG msg;
HWND hwnd;
hInstance = hInst;
if (!RegClass(WndProc, szClass, COLOR_WINDOW)) return FALSE;
hwnd = CreateWindow(szClass, TEXT(" "), WS_OVERLAPPEDWINDOW | WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, hInstance, NULL);
if (!hwnd) return FALSE;
while(GetMessage(&msg, 0, 0, 0))
{ TranslateMessage(&msg); DispatchMessage(&msg); }
return msg.wParam;
}
BOOL RegClass(WNDPROC Proc, LPCTSTR szName, UINT brBackground)
{
WNDCLASS wc;
wc.style = wc.cbClsExtra = wc.cbWndExtra = 0;
wc.lpfnWndProc = Proc;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(brBackground +1);
wc.lpszMenuName = NULL;
wc.lpszClassName = szName;
return (RegisterClass(&wc)!= 0);
}
BOOL CreateMenuItem(HMENU hMenu, TCHAR *str, UINT uIns, UINT uCom, HMENU hSubMenu, BOOL flag, UINT fType)
{
MENUITEMINFO mii;
mii.cbSize = sizeof(MENUITEMINFO);
mii.fMask = MIIM_STATE | MIIM_TYPE | MIIM_SUBMENU | MIIM_ID;
mii.fType = fType;
mii.fState = MFS_ENABLED;
mii.dwTypeData = str;
mii.cch = sizeof(str);
mii.wID=uCom;
mii.hSubMenu = hSubMenu;
return InsertMenuItem(hMenu, uIns, flag, &mii);
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
static HMENU hMainMenu, hFileMenu, hEditMenu;
static BOOL fFileOpened;
switch (msg)
{
case WM_CREATE:
{
hMainMenu = CreateMenu();
// ""
hFileMenu = CreatePopupMenu();
int i=0; // hFileMenu
CreateMenuItem(hFileMenu, TEXT("&"), i++, CM_FILE_OPEN, NULL, FALSE, MFT_STRING);
CreateMenuItem(hFileMenu, TEXT("&"), i++, CM_FILE_SAVE, NULL, FALSE, MFT_STRING);
CreateMenuItem(hFileMenu, NULL, i++, 0, NULL, FALSE, MFT_SEPARATOR);
CreateMenuItem(hFileMenu, TEXT("&"), i++, CM_FILE_QUIT, NULL, FALSE, MFT_STRING);
// ""
hEditMenu = CreatePopupMenu();
i=0; // hEditMenu
CreateMenuItem(hEditMenu, TEXT("&"), i++, CM_EDIT_FIND, NULL, FALSE, MFT_STRING);
CreateMenuItem(hEditMenu, TEXT("&3"), i++, CM_EDIT_REPLC, NULL, FALSE, MFT_STRING);
//
i=0; // hMainMenu
CreateMenuItem(hMainMenu, TEXT("&"), i++, 0, hFileMenu, FALSE, MFT_STRING);
SetMenu(hwnd, hMainMenu);
DrawMenuBar(hwnd);
fFileOpened = FALSE;
return 0;
}
case WM_COMMAND:
{
switch (LOWORD(wParam))
{
case CM_FILE_OPEN:
{
if (!fFileOpened)
{
CreateMenuItem(hMainMenu, TEXT("&"), 1, 0, hEditMenu, FALSE, MFT_STRING);
DrawMenuBar(hwnd);
fFileOpened = TRUE;
}
return 0;
}
case CM_FILE_SAVE:
{
if (fFileOpened)
{
RemoveMenu(hMainMenu, 1, MF_BYPOSITION);
DrawMenuBar(hwnd);
fFileOpened = FALSE;
}
return 0;
}
case CM_EDIT_FIND:
{
MessageBox(hwnd, TEXT(" CM_EDIT_FlND"), TEXT(""), MB_OK);
return 0;
}
case CM_EDIT_REPLC:
{
MessageBox(hwnd, TEXT(" CM_EDIT_REPLC"), TEXT(""), MB_OK);
return 0;
}
case CM_FILE_QUIT: { DestroyWindow(hwnd); return 0; }
}
return 0;
}
case WM_DESTROY:
{
if (!fFileOpened) DestroyMenu(hEditMenu);
PostQuitMessage(0);
return 0;
}
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
:
1. hEditMenu "". fFileOpened , hEditMenu :
if (!fFileOpened)
{
CreateMenuItem(hMainMenu, "&", 1, 0, hEditMenu,
FALSE, MFT_STRING);
DrawMenuBar(hwnd);
fFileOpened=TRUE;
}
, .
2. hEditMenu "". . fFileOpened , hEditMenu :
if (fFileOpened)
{
RemoveMenu(hMainMenu, 1, MF_BYPOSITION);
DrawMenuBar(hwnd);
fFileOpened=FALSE;
}
3. , hEditMenu . , :
if (!fFileOpened) DestroyMenu(hEditMenu);