#include
#define IDM_SYS_ABOUT 1
#define IDM_SYS_HELP 2
#define IDM_SYS_REMOVE 3 //这里定义三个菜单的ID标识
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;//回调函数的声明
static TCHAR szAppName[] = TEXT ("PoorMenu") ;
int WINAPI WinMain (HINSTANCE hInstance,//应用程序当前实例的句柄
HINSTANCE hPrevInstance,//应用程序先前的实例句柄
PSTR szCmdLine,//指向应用程序命令行的字符串的指针
int iCmdShow)//指明窗口如何显示
{
HMENU hMenu ;//定义菜单句柄
HWND hwnd ;//当前窗口的句柄
MSG msg ;//消息
WNDCLASS wndclass ;//窗口类名
wndclass.style = CS_HREDRAW | CS_VREDRAW ;//窗口的显示方式,此处为水平重画和竖直重画
wndclass.lpfnWndProc = WndProc ;//窗口回调函数
wndclass.cbClsExtra = 0 ;//窗口扩展,此处为0
wndclass.cbWndExtra = 0 ;//窗口实例扩展,此处为0
wndclass.hInstance = hInstance ;//窗口的实例句柄
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;//窗口的显示方式,此处设置为应用程序型
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;//鼠标的显示方式,此处设置为标准型
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;//窗口背景颜色的设置,此处设置为白色
wndclass.lpszMenuName = NULL ;//窗口菜单,此处为NULL
wndclass.lpszClassName = szAppName ;//窗口类名
if (!RegisterClass (&wndclass))//注册窗口,若注册失败,产生如下的信息
{
MessageBox (NULL, TEXT ("This program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}
//创建窗口,如果函数成功,返回值为新窗口的句柄:如果函数失败,返回值为NULL
hwnd = CreateWindow (szAppName,
TEXT ("The Poor-Person's Menu"),//窗口的名字
WS_OVERLAPPEDWINDOW,//指定创建窗口的风格
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,//以上四个参数分别为窗口的x坐标和y坐标宽度和高度
NULL, //指向被创建窗口的父窗口或所有者窗口的句柄,此处为NULL
NULL, //菜单句柄,或依据窗口风格指明一个子窗口标识,此处为NULL
hInstance, //与窗口相关联的模块实例的句柄
NULL) ;//指向一个值的指针,该值传递给窗口WM_CREATE消息
hMenu = GetSystemMenu (hwnd, FALSE) ;//获得系统菜单的句柄
//第一个参数为当前父窗口的句柄
//第二个参数如果为FALSE则系统菜单可以被修改,
//如果为TRUE,GetSystemMenu重置窗口菜单到缺省状态。如果存在先前的窗口菜单,将被销毁
//AppendMenu函数在指定的菜单条、下拉式菜单、子菜单或快捷菜单的末尾追加一个新菜单项
//第一个参数为菜单句柄
//第二个参数为控制新菜单项的外观和性能的标志,具体参数请参考MSDN
//第三个参数为指定新菜单项的标识符
//第四个菜单的意思为指定新菜单项的内容
//MF_STRING意思为指定菜单项是一个正文字符串
AppendMenu (hMenu, MF_SEPARATOR, 0, NULL) ;//画一条水平分割线
AppendMenu (hMenu, MF_STRING, IDM_SYS_ABOUT, TEXT ("About...")) ;
AppendMenu (hMenu, MF_STRING, IDM_SYS_HELP, TEXT ("Help...")) ;
AppendMenu (hMenu, MF_STRING, IDM_SYS_REMOVE, TEXT ("Remove Additions")) ;
ShowWindow (hwnd, iCmdShow) ;//显示窗口,hWnd:指窗口句柄。iCmdShow:指定窗口如何显示
UpdateWindow (hwnd) ;//更新窗口,hWnd:指窗口句柄
while (GetMessage (&msg, NULL, 0, 0))//消息循环
{
TranslateMessage (&msg) ;//该函数将虚拟键消息转换为字符消息
DispatchMessage (&msg) ;//该函数分发一个消息给窗口程序
}
return msg.wParam ;//wParam是消息携带的参数,可以是个值,也可以是个地址
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_SYSCOMMAND:
switch (LOWORD (wParam))
{
case IDM_SYS_ABOUT://弹出一个对话框
MessageBox (hwnd, TEXT ("A Poor-Person's Menu Program\n")
TEXT ("(c) Charles Petzold, 1998"),
szAppName, MB_OK | MB_ICONINFORMATION) ;
return 0 ;
case IDM_SYS_HELP://弹出一个对话框
MessageBox (hwnd, TEXT ("Help not yet implemented!"),
szAppName, MB_OK | MB_ICONEXCLAMATION) ;
return 0 ;
case IDM_SYS_REMOVE:
GetSystemMenu (hwnd, TRUE) ;//GetSystemMenu重置窗口菜单到缺省状态。如果存在先前的窗口菜单,将被销毁
return 0 ;
}
break ;
case WM_DESTROY:
PostQuitMessage (0) ;//该函数向系统表明有个线程有终止请求。通常用来响应WM_DESTROY消息
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;//该函数调用缺省的窗口过程来为应用程序没有处理的任何窗口消息提供缺省的处理
}