. wParam . lParam , lParam 1 0 . , 0. .
WM_COMMAND
. wParam , 0. 0.
WM_MENUSELECT
WM_MENUSELECT . wParam ( ), :
MF_CHECKED | |
MF_DISABLED | |
MF_GRAYED | |
MF_HILITE | |
MF_MOUSESELECT | |
MF_POPUP | |
MF_SYSMENU | . lParam |
wParam 0xFFFF lParam = NULL, Windows . lParam , .
, 0.
, . TrackPopupMenu:
BOOL TrackPopupMenu(HMENU hMenu, UINT uFlags, int x, int y,
int nReserved, HWND hwnd, CONST RECT *prcRect);
, . , .
:
1. hMenu . CreatePopupMenu GetSubMenu.
2. uFlags , .
2.1. :
_CENTERALIGN | |
_LEFTALIGN | |
TPM_RIGHTALIGN |
2.2. :
_BOTTOMALIGN | |
TPM_TOPALIGN | |
TPM_VCENTERALIGN |
2.3. - :
_NONOTIFY | |
TPM_RETURNCMD |
2.4. , :
|
|
TPM_LEFTBUTTON | |
TPM_RIGHTBUTTON |
3. .
4. .
5. nReserved , .
6. hwnd -, . WM_COMMAND TrackPopupMenu.
7. prcRect , . , . prcRect = NULL, .
. uFlags TPM_RETURNCMD, . , .
. .
4.5.
#include <windows.h>
#include <tchar.h>
#define CM_EDIT_CUT 2003
#define CM_EDIT_COPY 2004
#define CM_EDIT_PASTE 2005
BOOL RegClass(WNDPROC, LPCTSTR, UINT);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE hInstance;
TCHAR szClass[] = TEXT("FloatMenu");
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))
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)
{
switch (msg)
{
case WM_COMMAND:
{
switch (LOWORD(wParam))
{
case CM_EDIT_CUT:
{ MessageBox(hwnd, TEXT(""), TEXT(""), MB_OK); return 0; }
case CM_EDIT_COPY:
{ MessageBox(hwnd, TEXT(""), TEXT(""), MB_OK); return 0; }
|
|
case CM_EDIT_PASTE:
{ MessageBox(hwnd, TEXT(""), TEXT(""), MB_OK); return 0; }
}
return 0;
}
case WM_RBUTTONDOWN:
{
//
DWORD xyPos = GetMessagePos();
WORD xPos = LOWORD(xyPos),
yPos = HIWORD(xyPos);
HMENU hFloatMenu = CreatePopupMenu();
int i=0;
CreateMenuItem(hFloatMenu, TEXT(""), i++, CM_EDIT_CUT, NULL, FALSE, MFT_STRING);
CreateMenuItem(hFloatMenu, TEXT(""), i++, CM_EDIT_COPY, NULL, FALSE, MFT_STRING);
CreateMenuItem(hFloatMenu, TEXT(""), i++, CM_EDIT_PASTE, NULL, FALSE, MFT_STRING);
//
TrackPopupMenu(hFloatMenu, TPM_CENTERALIGN | TPM_LEFTBUTTON | TPM_VCENTERALIGN, xPos, yPos, 0, hwnd, NULL);
DestroyMenu(hFloatMenu);
return 0;
}
case WM_DESTROY: { PostQuitMessage(0); return 0; }
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
WM_RBUTTONDOWN. lParam . TrackPopupMenu . , . GetMessagePos xPos yPos :
xyPos = GetMessagePos();
xPos = LOWORD(xyPos);
yPos = HIWORD(xyPos);
.
:
TrackPopupMenu(hFloatMenu,
TPM_CENTERALIGN | TPM_LEFTBUTTON | TPM_VCENTERALIGN,
xPos, yPos, 0, hwnd, NULL);
xPos, yPos , "" .
, WM_COMMAND . . .
. " " . .
WM_COMMAND wParam , wParam 1.
. , " Alt+F4 " Alt+F4. Alt F4 " Alt+F4 " .
. .
CreateAcceleratorTable :
HACCEL CreateAcceleratorTable(LPACCEL lpaccl, int cEntries);
lpaccl ACCEL, , a cEntries lpaccl. , NULL.
CreateAcceleratorTable . DestroyAcceleratorTable.
ACCEL :
typedef struct {
BYTE fVirt;
WORD key;
WORD cmd;
} ACCEL;
ACCEL:
1. fVirt :
|
|
FALT | key Alt |
FCONTROL | key Ctrl |
FNOINVERT | , , . , , , |
FSHIFT | key Shift |
FVIRTKEY | key . FVIRTKEY , , key ASCII |
2. key ASCII. . 4.1.
3. cmd . , WM_COMMAND WM_SYSCOMMAND. wParam cmd.
4.1.
0x0 | ||
VK_LBUTTON ( ) | 0x1 | |
VK_RBUTTON ( ) | 0x2 | |
VK_CANCEL | 0x3 | <Control + Break> |
VK_MBUTTON ( ) | 0x4 | |
0x5 0x7 | ||
VK_BACK | 0x8 | <Backspace> |
VK_TAB | 0x9 | <Tab> |
0xa-0xb | ||
VK_CLEAR | 0xc | <5> <Num Lock> |
VK_RETURN | 0xd | <Enter> |
0xe 0xf | ||
VK_SHIFT | 0x10 | <Shift> |
VK_CONTROL | 0x11 | <Control> |
VK_MENU | 0x12 | <Alt> |
VK_PAUSE | 0x13 | <Pause> |
VK_CAPITAL | 0x14 | <Caps Lock> |
He | 0x15 0x1a | |
VK_ESCAPE | 1b | <Esc> |
He | 0x1c 0x1f | |
VK_SPACE | 0x20 | |
VK_PRIOR | 0x21 | <PgUp> |
VK_NEXT | 0x22 | <PgDn> |
VK_END | 0x23 | <End> |
VK_HOME | 0x24 | <Home> |
VK_LEFT | 0x25 | <Left> |
VK_UP | 0x26 | <Up> |
VK_RIGHT | 0x27 | <Right> |
VK_DOWN | 0x28 | <Down> |
VK_SELECT | 0x29 | |
VK_PRINT | 0x2a | |
VK_EXECUTE | 0x2b | |
VK_SNAPSHOT | 0x2c | <PrtSc> |
VK_INSERT | 0x2d | <Insert> |
VK_DELETE | 0x2e | <Delete> |
VK_HELP | 0x2f | |
He | 0x30 | <0> |
- - - | 0x31 | <1> |
- - - | 0x32 | <2> |
- - - | 0x33 | <3> |
- - - | 0x34 | <4> |
- - - | 0x35 | <5> |
- - - | 0x36 | <6> |
- - - | 0x37 | <7> |
- - - | 0x38 | <8> |
- - - | 0x39 | <9> |
- - - | 0x3a-0x40 | |
- - - | 0x41 | <A> |
- - - | 0x42 | <B> |
- - - | 0x43 | <C> |
- - - | 0x44 | <D> |
- - - | 0x45 | <E> |
- - - | 0x46 | <F> |
- - - | 0x47 | <G> |
- - - | 0x48 | <H> |
- - - | 0x49 | <I> |
- - - | 0x4a | <J> |
- - - | 0x4b | <K> |
- - - | 0x4c | <L> |
- - - | 0x4d | <M> |
- - - | 0x4e | <N> |
- - - | 0x4f | <O> |
- - - | 0x50 | <P> |
- - - | 0x51 | <Q> |
- - - | 0x52 | <R> |
- - - | 0x53 | <S> |
- - - | 0x54 | <T> |
- - - | 0x55 | <U> |
- - - | 0x56 | <V> |
- - - | 0x57 | <W> |
- - - | 0x58 | <X> |
- - - | 0x59 | <Y> |
- - - | 0x5a | <Z> |
- - - | 0x5b- 0x5f | |
VK_NUMPAD0 | 0x60 | <0> |
VK_NUMPAD1 | 0x61 | <1> |
VK_NUMPAD2 | 0x62 | <2> |
VK_NUMPAD3 | 0x63 | <3> |
VK_NUMPAD4 | 0x64 | <4> |
VK_NUMPAD5 | 0x65 | <5> |
VK_NUMPAD6 | 0x66 | <6> |
VK_NUMPAD7 | 0x67 | <7> |
VK_NUMPAD8 | 0x68 | <8> |
VK_NUMPAD9 | 0x69 | <9> |
VK_MULTIPLAY | 0x6a | <*> |
VK_ADD | 0x6b | <+> |
VK_SEPARATOR | 0x6c | |
VK_SUBTRACT | 0x6d | <-> |
VK_DECIMAL | 06e | 0 |
VK_DIVIDE | 0x6f | </> |
VK_F1 | 0x70 | <F1> |
VK_F2 | 0x71 | <F2> |
VK_F3 | 0x72 | <F3> |
VK_F4 | 0x73 | <F4> |
VK_F5 | 0x74 | <F5> |
VK_F6 | 0x75 | <F6> |
VK_F7 | 0x76 | <F7> |
VK_F8 | 0x77 | <F8> |
VK_F9 | 0x78 | <F9> |
VK_F10 | 0x79 | <F10> |
VK_F11 | 0x7 | <F11> |
VK_F12 | 0x7b | <F12> |
VK_F13 | 0x7 | |
VK_F14 | 0x7d | |
VK_F15 | 07 | |
VK_F16 | 0x7 f | |
He | 0x80 0x8f | |
VK_NUMLOCK | 0x90 | <Num Lock> |
VK_SCROLL | 0x91 | <Scroll Lock> |
He | 0x92 0xb9 | |
- - - | 0xba | ; |
- - - | 0xbb | + = |
- - - | 0xbc | , < |
- - - | 0xbd | - _ |
- - - | 0xbe | . > |
- - - | 0xbf | /? |
- - - | 0xc0 | ` ~ |
- - - | 0xc1 0xda | |
- - - | 0xdb | [ { |
- - - | 0xdc | \ | |
- - - | 0xdd | ] } |
- - - | 0xde | ' " |
|
|
. .
.
#define CM_FILE_NEW 1000
#define CM_FILE_OPEN 1001
#define CM_FILE_SAVE 1002
#define CM_FILE_QUIT 1003
#define CM_EDIT_CUT 2000
#define CM_EDIT_PASTE 2001
#define CM_EDIT_COPY 2002
#define CM_EDIT_DEL 2003
HACCEL CreateAccelTable(void)
{
//
ACCEL Accel[8];
//
Accel[0].fVirt = FVIRTKEY | FCONTROL;
Accel[0].key = 0x4e;
Accel[0].cmd = CM_FILE_NEW;
//
Accel[1].fVirt = FVIRTKEY | FCONTROL;
Accel[1].key = 0x4f;
Accel[1].cmd = CM_FILE_OPEN;
//
Accel[2].fVirt = FVIRTKEY | FCONTROL;
Accel[2].key = 0x53;
Accel[2].cmd = CM_FILE_SAVE;
//
Accel[3].fVirt = FVIRTKEY | FALT;
Accel[3].key = 0x73;
Accel[3].cmd = CM_FILE_QUIT;
//
Accel[4].fVirt = FVIRTKEY | FCONTROL;
Accel[4].key =0x58;
Accel[4].cmd = CM_EDIT_CUT;
//
Accel[5].fVirt = FVIRTKEY | FCONTROL;
Accel[5].key = 0x56;
Accel[5].cmd = CM_EDIT_PASTE;
//
Accel[6].fVirt = FVIRTKEY | FCONTROL;
Accel[6].key = 0x43;
Accel[6].cmd = CM_EDIT_COPY;
//
Accel[7].fVirt = FVIRTKEY;
Accel[7].key = 0x2e;
Accel[7].cmd = CM_EDIT_DEL;
return CreateAcceleratorTabIe((LPACCEL)Accel, 8);
}
.
1. , :
#define CM_FILE_NEW 1000
...
#define CM_EDIT_DEL 2003
2. , , . :
HACCEL CreateAccelTable(void)
2.1. :
ACCEL l[8];
2.2. . , :
//
Accel[0].fVirt = FVIRTKEY | FCONTROL;
Accel[0].key = 04;
Accel[0].cmd = CM_FILE_NEW;
, . " " " " CM_FILE_NEW WM_COMMAND wParam, CM_FILE_NEW.
(, . .) Ctrl+N. " ", fVirt FCONTROL. , , key, Ctrl. key 04. . 4.1, <N>.
|
|
, <N> Ctrl, <Caps Lock>, key . fVirt FVIRTKEY. . , ASCII <Caps Lock>.
.
2.3. CreateAcceleratorTable:
CreateAcceleratorTable((LPACCEL)Accel, 8);
, NULL.
2.4. CreateAcceleratorTable CreateAccelTable:
return CreateAcceleratorTable((LPACCEL)Accel, 8);
, TranslateAccelerator:
int TranslateAccelerator(HWND hwnd, HACCEL hAccTable, LPMSG lpMsg);
WM_KEYDOWN WM_SYSKEYDOWN WM_COMMAND WM_SYSCOMMAND WM_COMMAND WM_SYSCOMMAND hwnd. . .
:
1. hwnd .
2. hAccTable . LoadAccelerators CreateAcceleratorTable.
3. lpMsg MSG, GetMessage PeekMessage.
TranslateAccelerator (, ) wParam WM_COMMAND WM_SYSCOMMAND 1.
, , WM_SYSCOMMAND. WM_COMMAND.
TranslateAccelerator , , . TranslateMessage DispatchMessage.
:
1. , WM_INITMENU WM_INITMENUPOPUP , .
2. WM_INITMENU WM_INITMENUPOPUP :
- ;
- ;
- ;
- .
3. TranslateAccelerator ( , ), TranslateAccelerator WM_KEYUP WM_KEYDOWN WM_SYSKEYUP WM_SYSKEYDOWN.
4. TranslateAccelerator , WM_COMMAND, .
:
HACCEL hAccel=CreateAccelTable();
...
while (GetMessage(&msg, 0, 0, 0))
{
if (!hAccel ||!TranslateAccelerator(hwnd, hAccel, &msg))
{
TranslateMessage(&msg); DispatchMessage(&msg);
}
}
hAccel . hAccel NULL, TranslateAccelerator. , , WM_COMMAND WM_SYSCOMMAND , .
wParam , . wParam 1 , , 0 , .
. , . .
4.6. .
#include <windows.h>
#include <tchar.h>
#define CM_FILE_NEW 1000
#define CM_FILE_OPEN 1001
#define CM_FILE_SAVE 1002
#define CM_FILE_QUIT 1003
#define CM_EDIT_CUT 2000
#define CM_EDIT_PASTE 2001
#define CM_EDIT_COPY 2002
#define CM_EDIT_DEL 2003
#define CM_HELP_HELP 3000
#define CM_HELP_ABOUT 3001
BOOL RegClass(WNDPROC, LPCTSTR, UINT);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HACCEL CreateAccelTable(void);
HINSTANCE hInstance;
TCHAR szClass[] = TEXT("AccelClass");
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;
HACCEL hAccel = CreateAccelTable();
while(GetMessage(&msg, 0, 0, 0))
{
if (!hAccel ||!TranslateAccelerator(hwnd, hAccel, &msg))
{ TranslateMessage(&msg); DispatchMessage(&msg); }
}
DestroyAcceleratorTable(hAccel);
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);
}
HACCEL CreateAccelTable(void)
{
//
ACCEL Accel[8];
//
Accel[0].fVirt= FVIRTKEY | FCONTROL;
Accel[0].key = 0x4e;
Accel[0].cmd = CM_FILE_NEW;
//
Accel[1].fVirt= FVIRTKEY | FCONTROL;
Accel[1].key = 0x4f;
Accel[1].cmd = CM_FILE_OPEN;
//
Accel[2].fVirt= FVIRTKEY | FCONTROL;
Accel[2].key = 0x53;
Accel[2].cmd = CM_FILE_SAVE;
//
Accel[3].fVirt= FVIRTKEY | FALT;
Accel[3].key = 0x73;
Accel[3].cmd = CM_FILE_QUIT;
//
Accel[4].fVirt= FVIRTKEY | FCONTROL;
Accel[4].key = 0x58;
Accel[4].cmd = CM_EDIT_CUT;
//
Accel[5].fVirt= FVIRTKEY | FCONTROL;
Accel[5].key = 0x56;
Accel[5].cmd = CM_EDIT_PASTE;
//
Accel[6].fVirt= FVIRTKEY | FCONTROL;
Accel[6].key = 0x43;
Accel[6].cmd = CM_EDIT_COPY;
//
Accel[7].fVirt= FVIRTKEY;
Accel[7].key = 0x2e;
Accel[7].cmd = CM_EDIT_DEL;
return CreateAcceleratorTable((LPACCEL)Accel, 8);
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
static HMENU hMainMenu, hFileMenu, hEditMenu, hHelpMenu;
switch (msg)
{
case WM_CREATE:
{
hMainMenu = CreateMenu();
SetMenu(hwnd, hMainMenu);
// ""
hFileMenu = CreatePopupMenu();
int i=0; //
CreateMenuItem(hFileMenu, TEXT("&\tCtrl+N"), i++, CM_FILE_NEW, NULL, FALSE, MFT_STRING);
CreateMenuItem(hFileMenu, TEXT("&\t Ctrt+O"), i++, CM_FILE_OPEN, NULL, FALSE, MFT_STRING);
CreateMenuItem(hFileMenu, TEXT("&Coxpa\t Ctrl+S"), i++, CM_FILE_SAVE, NULL, FALSE, MFT_STRING);
CreateMenuItem(hFileMenu, NULL, i++, 0, NULL, FALSE, MFT_SEPARATOR);
CreateMenuItem(hFileMenu, TEXT("&\t Alt+F4"), i++, CM_FILE_QUIT, NULL, FALSE, MFT_STRING);
hEditMenu = CreatePopupMenu();
i=0; //
CreateMenuItem(hEditMenu, TEXT("&\t Ctrl+X"), i++, CM_EDIT_CUT, NULL, FALSE, MFT_STRING);
CreateMenuItem(hEditMenu, TEXT("B&\t Ctrl+V"), i++, CM_EDIT_PASTE, NULL, FALSE, MFT_STRING);
CreateMenuItem(hEditMenu, TEXT("&\t Ctrl+C"), i++, CM_EDIT_COPY, NULL, FALSE, MFT_STRING);
CreateMenuItem(hEditMenu, TEXT("&\t Delete"), i++, CM_EDIT_DEL, NULL, FALSE, MFT_STRING);
hHelpMenu = CreatePopupMenu();
i=0; //
CreateMenuItem(hHelpMenu, TEXT("&"), i++, CM_HELP_HELP, NULL, FALSE, MFT_STRING);
CreateMenuItem(hHelpMenu, NULL, i++, 0, NULL, FALSE, MFT_SEPARATOR);
CreateMenuItem(hHelpMenu, TEXT("& "), i++, CM_HELP_ABOUT, NULL, FALSE, MFT_STRING);
//
i=0; //
CreateMenuItem(hMainMenu, TEXT("&"), i++, 0, hFileMenu, FALSE, MFT_STRING);
CreateMenuItem(hMainMenu, TEXT("&"), i++, 0, hEditMenu, FALSE, MFT_STRING);
CreateMenuItem(hMainMenu, TEXT("&"), i++, 0, hHelpMenu, FALSE, MFT_STRING);
DrawMenuBar(hwnd);
return 0;
}
case WM_COMMAND:
{
TCHAR str[30]={0};
if (HIWORD(wParam)==1)
_tcscpy(str, TEXT(" "));
else _tcscpy(str, TEXT(" "));
switch (LOWORD(wParam))
{
case CM_FILE_NEW:
{ MessageBox(hwnd, TEXT(""), str, MB_OK); return 0; }
case CM_FILE_OPEN:
{ MessageBox(hwnd, TEXT(""), str, MB_OK); return 0; }
case CM_FILE_SAVE:
{ MessageBox(hwnd, TEXT(""), str, MB_OK); return 0; }
case CM_FILE_QUIT: { DestroyWindow(hwnd); return 0; }
case CM_EDIT_CUT:
{ MessageBox(hwnd, TEXT(""), str, MB_OK); return 0; }
case CM_EDIT_PASTE:
{ MessageBox(hwnd, TEXT(""), str, MB_OK); return 0; }
case CM_EDIT_COPY:
{ MessageBox(hwnd, TEXT(""), str, MB_OK); return 0; }
case CM_EDIT_DEL:
{ MessageBox(hwnd, TEXT(""), str, MB_OK); return 0; }
case CM_HELP_HELP:
{ MessageBox(hwnd, TEXT(""), TEXT(""), MB_OK); return 0; }
case CM_HELP_ABOUT:
{ MessageBox(hwnd, TEXT(" "), TEXT(" "), MB_OK); return 0; }
}
}
case WM_DESTROY: { PostQuitMessage(0); return 0;}
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
, .
1. , :
HACCEL hAccel = CreateAccelTable();
while(GetMessage(&msg, 0, 0, 0))
{
if (!hAccel ||!TranslateAccelerator(hwnd, hAccel, &msg))
{ TranslateMessage(&msg); DispatchMessage(&msg); }
}
DestroyAcceleratorTable(hAccel);
. . , . ,
HACCEL hAccel;
. , CreateAccelTable1, :
hAccel=CreateAccelTable1();
2. CreateAccelTable . , .
3. wParam. WM_COMMAND 1.
, :
char str[30];
if (HIWORD(wParam)==1)
strcpy(str, " ");
else strcpy(str, " ");
1. .
2. , , .
3. 4.1 TranslateMessage?
4. WM_DESTROY?
5. WM_COMMAND , ?
6. ?
7. ?
8. , ?
9. ?
1. " ", " " "". . , ShowCursor(0); ShowCursor(1).
2. "" . . .
3. "" "". "" "", "" ( ). "", "" "".
4. "", "", "" "". "" "" "" "", "" "", "" "". .
5. "" "", "", "", "", "" "", "" "", "" "". "" "". .
6. "" . . .
7. "" "", "" "". "" "" , "" "". .
8. "" "", "" "". "" "" , "" ; . .
9. "" . . .
10. , .
11. . .
HCURSOR hCursor=LoadCursor(NULL, IDC_CROSS); SetCursor(hCursor);
12. "" "", "" "" "" "" " ". "" "", " 1", " 2"... "..." " 1", " 2"...
13. . "" "" "". "", "".
14. "", "", "", "". "" : "50%", "100%", "150%" "200%", .
15. . "" "", "", "-" "". "-" .
16. "" "", "" "". "" "" "" "", "" "". .
17. "", "", "" "", . "" "" "" "", "" "", . .
18. "" . .
19. "" "", "", "- " "". "" "" "". "" "-". .
20. "" "". "" "", "" "", "" "". "" . .
21. . "" "" "" (). "" "" "", "" "". "" "". "" .
22. . , , .
23. "", . "", . .
24. "" Windows "" . , . .
25. , , .