hMenu:
BOOL SetMenuItemInfo(MENU hMenu, UINT uItem,
BOOL fByPosition, LPMENUITEMINFO lpmii);
fByPosition = FALSE uItem , . lpmii MENUITEMINFO, . .
SetMenuItemInfo. 3 , . . , fMask.
. .
:
BOOL SetMenuItem(HMENU hMenu, UINT uIns, UINT fState, BOOL flag)
{
MENUITEMINFO mii;
mii.cbSize = sizeof(MENUITEMINFO);
mii.fMask = MIIM_STATE | MIIM_ID;
mii.fState = fState;
mii.wID = uIns;
return SetMenuItemInfo(hMenu, uIns, flag, &mii);
}
:
1. hMenu , .
2. uIns flag uItem fByPosition, SetMenuItemInfo.
3. fState .
4. fMask , fState. wID mii .
hMenu:
BOOL GetMenuItemInfo (HMENU hMenu, UINT uItem,
BOOL fByPosition, LPMENUITEMINFO lpmii);
fByPosition = FALSE uItem , . lpmii MENUITEMINFO, fMask . . .
. .
:
UINT GetMenuItem(HMENU hMenu, UINT uIns, BOOL flag)
{
MENUITEMINFO mii;
mii.cbSize = sizeof(MENUITEMINFO);
mii.fMask = MIIM_STATE;
GetMenuItemInfo(hMenu, uIns, flag, &mii);
return mii.fState;
}
:
1. hMenu , .
2. uIns flag uItem fByPosition GetMenuItemInfo.
. fMask , fState .
. "" "", "" "". "" . "" , "" "" "" .
|
|
"" "" "". .
"" "" "". .
"" . "" "" "".
4.3.
#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
#define CM_VIEW_NORM 3001
#define CM_VIEW_STRC 3002
BOOL RegClass(WNDPROC, LPCTSTR, UINT);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE hInstance;
TCHAR szClass[] = TEXT("SetMenuInfo");
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 SetMenuItem(HMENU hMenu, UINT uIns, UINT fState, BOOL flag)
{
MENUITEMINFO mii;
mii.cbSize = sizeof(MENUITEMINFO);
mii.fMask = MIIM_STATE | MIIM_ID;
mii.fState = fState;
mii.wID = uIns;
return SetMenuItemInfo(hMenu, uIns, flag, &mii);
}
UINT GetMenuItem(HMENU hMenu, UINT uIns, BOOL flag)
{
MENUITEMINFO mii;
mii.cbSize = sizeof(MENUITEMINFO);
mii.fMask = MIIM_STATE;
GetMenuItemInfo(hMenu, uIns, flag, &mii);
return mii.fState;
}
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, hViewMenu;
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);
// ""
hViewMenu = CreatePopupMenu();
i=0; // hViewMenu
CreateMenuItem(hViewMenu, TEXT("&"), i++, CM_VIEW_NORM, NULL, FALSE, MFT_RADIOCHECK);
CreateMenuItem(hViewMenu, TEXT("&"), i++, CM_VIEW_STRC, NULL, FALSE, MFT_RADIOCHECK);
//
i=0; // hMainMenu
CreateMenuItem(hMainMenu, TEXT("&"), i++, 0, hFileMenu, FALSE, MFT_STRING);
SetMenu(hwnd, hMainMenu);
SetMenuItem(hFileMenu, CM_FILE_SAVE, MFS_GRAYED, FALSE);
DrawMenuBar(hwnd);
return 0;
}
case WM_COMMAND:
{
switch (LOWORD(wParam))
{
case CM_FILE_OPEN:
{
SetMenuItem(hFileMenu, CM_FILE_OPEN, MFS_GRAYED, FALSE);
SetMenuItem(hFileMenu, CM_FILE_SAVE, MFS_ENABLED, FALSE);
CreateMenuItem(hMainMenu, TEXT("&"), 1, 0, hEditMenu, FALSE, MFT_STRING);
CreateMenuItem(hMainMenu, TEXT("&"), 2, 0, hViewMenu, FALSE, MFT_STRING);
DrawMenuBar(hwnd);
return 0;
}
case CM_FILE_SAVE:
{
SetMenuItem(hFileMenu, CM_FILE_SAVE, MFS_GRAYED, FALSE);
SetMenuItem(hFileMenu, CM_FILE_OPEN, MFS_ENABLED, FALSE);
RemoveMenu(hMainMenu, 1, MF_BYPOSITION);
RemoveMenu(hMainMenu, 1, MF_BYPOSITION);
DrawMenuBar(hwnd);
return 0;
}
case CM_EDIT_FIND:
{
if (GetMenuItem(hEditMenu, CM_EDIT_FIND, FALSE)==MFS_CHECKED)
SetMenuItem(hEditMenu, CM_EDIT_FIND, MFS_UNCHECKED, FALSE);
else SetMenuItem(hEditMenu, CM_EDIT_FIND, MFS_CHECKED, FALSE);
return 0;
}
case CM_EDIT_REPLC:
{
if (GetMenuItem(hEditMenu, CM_EDIT_REPLC, FALSE)==MFS_CHECKED)
SetMenuItem(hEditMenu, CM_EDIT_REPLC, MFS_UNCHECKED, FALSE);
else SetMenuItem(hEditMenu, CM_EDIT_REPLC, MFS_CHECKED, FALSE);
return 0;
}
case CM_VIEW_NORM:
{
SetMenuItem(hViewMenu, CM_VIEW_NORM, MFS_CHECKED, FALSE);
SetMenuItem(hViewMenu, CM_VIEW_STRC, MFS_UNCHECKED, FALSE);
return 0;
}
case CM_VIEW_STRC:
{
SetMenuItem(hViewMenu, CM_VIEW_NORM, MFS_UNCHECKED, FALSE);
SetMenuItem(hViewMenu, CM_VIEW_STRC, MFS_CHECKED, FALSE);
return 0;
}
case CM_FILE_QUIT: { DestroyWindow(hwnd); return 0; }
}
return 0;
}
case WM_DESTROY:
{ DestroyMenu(hEditMenu); DestroyMenu(hViewMenu); PostQuitMessage(0); return 0; }
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
:
1. hEditMenu hViewMenu "". fFileOpened. . , , "":
SetMenuItem(hFileMenu, CM_FILE_SAVE, MFS_GRAYED, FALSE);
:
SetMenuItem(hFileMenu, CM_FILE_SAVE, MFS_ENABLED, FALSE);
"":
SetMenuItem(hFileMenu, CM_FILE_OPEN, MFS_GRAYED, FALSE);
, .
|
|
2. hEditMenu hViewMenu "".
3. "" "" "" . , . MFS_CHECKED. :
SetMenuItem(hEditMenu, CM_EDIT_FIND, MFS_CHECKED, FALSE);
. , . , , , :
if(GetMenuItem(hEditMenu, CM_EDIT_FIND, FALSE)==MFS_CHECKED)
SetMenuItem(hEditMenu, CM_EDIT_FIND, MFS_UNCHECKED, FALSE);
else
SetMenuItem(hEditMenu, CM_EDIT_FIND, MFS_CHECKED, FALSE);
hViewMenu . MFT_RADIOCHECK:
CreateMenuItem(hViewMenu, "&", i++,
CM_VIEW_NORM, NULL, FALSE, WFT_RADIOCHECK);
, ( ).
hViewMenu , . , CM_VIEW_NORM :
SetMenuItem(hViewMenu, CM_VIEW_NORM, MFS_CHECKED, FALSE);
_VIEW_STRC :
SetMenuItem(hViewMenu, CM_VIEW_STRC, MFS_UNCHECKED, FALSE);