《Windows程序设计》(第五版)(美Charles Petzold著)
1 #include<windows.h> 2 3 LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); 4 5 int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdline,int iCmdShow) 6 //第一个参数是实例句柄,在Windows程序中,句柄就是一个数值,程序里用它来标志某些东西 7 //第三个参数是用来运行程序的命令行 8 //第四个参数用来指明程序最初如何显示:正常显示、最大化到全屏、最小化到任务栏 9 { 10 static TCHAR szAppName[]=TEXT("HelloWin"); 11 HWND hwnd; //窗口句柄 12 MSG msg; //消息结构 13 WNDCLASS wndclass; //窗口类结构 14 15 wndclass.style=CS_HREDRAW | CS_VREDRAW; 16 wndclass.lpfnWndProc = WndProc; //将窗口类的过程设为WndProc函数 17 wndclass.cbClsExtra=0; 18 wndclass.cbWndExtra=0; //这两行用于在类结构和Windows内部维护的窗口结构中预留额外的空间 19 wndclass.hInstance=hInstance; //应用程序的实例句柄 20 wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION); //为所有基于该窗口类的窗口设定一个图标 21 wndclass.hCursor=LoadCursor(NULL,IDC_ARROW); //载入一个预定义的鼠标指针 22 wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); //为这类窗口的客户区指定背景颜色 23 wndclass.lpszMenuName=NULL; //指定窗口类的菜单 24 wndclass.lpszClassName=szAppName; //为窗口类指定一个名称 25 26 if(!RegisterClass(&wndclass)) //RegisterClass(&wndclass)窗口类注册 27 { 28 MessageBox(NULL,TEXT("This program requares Windows NT"),szAppName,MB_ICONERROR); 29 return 0; 30 } 31 32 hwnd=CreateWindow(szAppName, //创建窗口类 窗口类名称 33 TEXT("The Hello Program"), //窗口标题 34 WS_OVERLAPPEDWINDOW, //风格 35 CW_USEDEFAULT, //初始x坐标 36 CW_USEDEFAULT, //初始y坐标 37 CW_USEDEFAULT, //初始x方向尺寸 38 CW_USEDEFAULT, //初始y方向尺寸 39 NULL, //父窗口句柄 40 NULL, //窗口菜单句柄 41 hInstance, //程序实例句柄 42 NULL); //创建参数 43 ShowWindow(hwnd,iCmdShow); //显示窗口 44 UpdateWindow(hwnd); //重绘窗口 45 while(GetMessage(&msg,NULL,0,0))//消息循环,GetMessage函数用于从消息队列中对消息进行检索,此调用将一个指向名称为msg的MSG结构变量的指针传给Windows 46 { 47 Translate(&msg); //将msg结构返还给Windows以进行某些键盘消息的转换 48 DispatchMessage(&msg); //将msg结构再次返回给Windows,接下来,Windows会将这条消息发送给合适的窗口过程来处理 49 } 50 return msg.wParam; 51 } 52 53 LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) 54 { 55 HDC hdc; //设备环境句柄 56 PAINTSTRUCT ps; //绘制结构 57 RECT rect; //矩形结构 58 59 switch(message) //消息处理 60 { 61 case WM_VREATE: 62 return 0; 63 case WM_PAINT: //当窗口客户区的部分或全部无效且必须更新时应用程序将收到此通知 64 hdc=BeginPaint(hwnd,&ps); //几乎总是从BeginPaint开始 65 GetClientRect(hwnd,&rect); 66 DrawText(hdc,TEXT("Hello,Windows 10!"),-1,&rect,DT_SINGLELINE | DT_CENTER | DT_VCENTER); //绘制文本 67 EndPaint(hwnd,&ps); 68 case WM_DESTROY: //销毁窗口 69 PostQuitMessage(0); 70 return 0; 71 } 72 return DefWindowProc(hwnd,message,wParam,lParam); //对所有窗口过程没有处理的消息进行默认处理 73 }