(一)菜单和加速键
TCHAR szBuffer[128];
TCHAR szClassName[] = TEXT("Menu Example");
TCHAR szCaptionMain[] = TEXT("Menu");
TCHAR szCaption[] = TEXT("菜单选择");
TCHAR szMenuHelp[] = TEXT("帮助主题(&H)");
TCHAR szMenuAbout[] = TEXT("关于本程序(&A)...");
TCHAR szFormat[] = TEXT("您选择了菜单命令: %08x");
HWND hMainWnd;
HMENU hMenu;
HMENU hSubMenu;
HACCEL hAccelerator;
VOID DisplayMenuItem(DWORD dwCommandID)
{
wsprintf(szBuffer, szFormat, dwCommandID);
MessageBox(hMainWnd, szBuffer, szCaption, MB_OK);
}
VOID Quit()
{
DestroyWindow(hMainWnd);
PostQuitMessage(0);
}
LRESULT CALLBACK ProcWinMain(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
POINT stPt;
HMENU hSysMenu;
switch(uMsg)
{
case WM_CREATE:
hSubMenu = GetSubMenu(hMenu, 1);
hSysMenu = GetSystemMenu(hWnd, FALSE);
AppendMenu(hSysMenu, MF_SEPARATOR, 0, NULL);
AppendMenu(hSysMenu, 0, IDM_HELP, szMenuHelp);
AppendMenu(hSysMenu, 0, IDM_ABOUT, szMenuAbout);
return 0;
case WM_COMMAND:
DisplayMenuItem(wParam);
switch(LOWORD(wParam))
{
case IDM_EXIT:
Quit();
return 0;
case IDM_TOOLBAR:
case IDM_TOOLBARTEXT:
case IDM_INPUTBAR:
case IDM_STATUSBAR:
if(MF_CHECKED == GetMenuState(hMenu, (UINT)wParam, MF_BYCOMMAND))
{
CheckMenuItem(hMenu, (UINT)wParam, MF_UNCHECKED);
}
else
{
CheckMenuItem(hMenu, (UINT)wParam, MF_CHECKED);
}
return 0;
case IDM_BIG:
case IDM_SMALL:
case IDM_LIST:
case IDM_DETAIL:
CheckMenuRadioItem(hMenu, IDM_BIG, IDM_DETAIL, LOWORD(wParam), MF_BYCOMMAND);
return 0;
}
break;
case WM_SYSCOMMAND:
switch(LOWORD(wParam))
{
case IDM_HELP:
case IDM_ABOUT:
DisplayMenuItem(wParam);
return 0;
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
break;
case WM_RBUTTONDOWN:
GetCursorPos(&stPt);
TrackPopupMenu(hSubMenu, TPM_LEFTALIGN, stPt.x, stPt.y, 0, hMainWnd, NULL);
return 0;
case WM_CLOSE:
Quit();
return 0;
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
WNDCLASSEX stWndCls;
MSG stMsg;
RtlZeroMemory(&stWndCls, sizeof(stWndCls));
stWndCls.hCursor = LoadCursor(NULL, IDC_ARROW);
stWndCls.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MAIN));
stWndCls.hIconSm = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MAIN));
stWndCls.cbWndExtra = 0;
stWndCls.cbClsExtra = 0;
stWndCls.hInstance = hInstance;
stWndCls.cbSize = sizeof(WNDCLASSEX);
stWndCls.style = CS_HREDRAW | CS_VREDRAW;
stWndCls.lpfnWndProc = ProcWinMain;
stWndCls.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
stWndCls.lpszClassName = szClassName;
stWndCls.lpszMenuName = NULL;
RegisterClassEx(&stWndCls);
hMenu = LoadMenu(hInstance, MAKEINTRESOURCE(IDM_MAIN));
hAccelerator = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDA_ACCELERATOR));
hMainWnd = CreateWindowEx(WS_EX_CLIENTEDGE, szClassName, szCaptionMain,
WS_OVERLAPPEDWINDOW, 100, 100, 600, 400, NULL, hMenu, hInstance, NULL);
ShowWindow(hMainWnd, SW_SHOWNORMAL);
UpdateWindow(hMainWnd);
while(GetMessage(&stMsg, NULL, 0, 0))
{
if(0 == TranslateAccelerator(hMainWnd, hAccelerator, &stMsg))
{
TranslateMessage(&stMsg);
DispatchMessage(&stMsg);
}
}
return stMsg.wParam;
}