.


:




:

































 

 

 

 





. 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);

 





:


: 2016-09-06; !; : 308 |


:

:

, ; , .
==> ...

2002 - | 1796 -


© 2015-2024 lektsii.org - -

: 0.274 .