1 #include <windows.h> 2 #include "resource.h" 3 4 LRESULT CALLBACK MyWndProc( HWND hwnd, // handle to window 5 UINT uMsg, // message identifier 6 WPARAM wParam, // first message parameter 7 LPARAM lParam // second message parameter 8 ); 9 10 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ) 11 { 12 TCHAR szAppName[] = TEXT("IconDemo"); 13 WNDCLASS wnd; 14 HWND hwnd; 15 MSG msg; 16 wnd.style = CS_HREDRAW | CS_VREDRAW; //水平或垂直改变窗口都被重绘 与MyWndProc的WM_PAINT消息关联 17 wnd.lpfnWndProc = MyWndProc; 18 wnd.cbClsExtra = 0; 19 wnd.cbWndExtra = 0; 20 wnd.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON)); 21 wnd.hCursor = LoadCursor(NULL, IDC_ARROW); 22 wnd.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); 23 wnd.lpszMenuName = NULL; 24 wnd.lpszClassName = szAppName; //窗口类标识,用在CreateWindow的第一个参数 25 wnd.hInstance = hInstance; 26 if(!RegisterClass(&wnd)) 27 { 28 MessageBox(NULL, TEXT("无法创建窗口"), TEXT("ERROR"), MB_OK|MB_ICONERROR); 29 return 0; 30 } 31 32 hwnd = CreateWindow(szAppName, TEXT("Hello"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); //第二个参数为窗口标题 33 ShowWindow(hwnd, nShowCmd); 34 UpdateWindow(hwnd); 35 while (GetMessage(&msg, NULL, 0, 0)) 36 { 37 TranslateMessage(&msg); 38 DispatchMessage(&msg); 39 } 40 return 0; 41 } 42 43 LRESULT CALLBACK MyWndProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 44 { 45 HDC hdc; //定义设备环境句柄 46 PAINTSTRUCT ps; //绘制结构 47 48 static HICON hIcon; 49 static int cxIcon, cyIcon, cxClient, cyClient; 50 HINSTANCE hInstance; 51 int x, y; 52 53 switch(uMsg) 54 { 55 56 case WM_CREATE: 57 { 58 hInstance = ((LPCREATESTRUCT) lParam)->hInstance;//WM_CREATE消息的lParam参数是一个CREATESTRUCT结构的指针,包含hInstance. 59 hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON)); 60 cxIcon = GetSystemMetrics(SM_CXICON); //获取图标大小,上一条LoadIcon关联 61 cyIcon = GetSystemMetrics(SM_CYICON); 62 return 0; 63 } 64 break; 65 66 case WM_PAINT: 67 { 68 hdc = BeginPaint(hwnd, &ps); 69 for (y = 0; y < cyClient; y += cyIcon) 70 { 71 for (x = 0; x < cxClient; x += cxIcon) 72 { 73 DrawIcon(hdc, x, y, hIcon); //绘制 74 } 75 76 } 77 EndPaint(hwnd, &ps); 78 79 } 80 break; 81 82 case WM_SIZE: 83 { 84 cxClient = LOWORD(lParam); 85 cyClient = HIWORD(lParam); 86 } 87 break; 88 89 case WM_DESTROY: 90 PostQuitMessage(0); 91 return 0; 92 } 93 94 return DefWindowProc(hwnd, uMsg, wParam, lParam); 95 }
注:参阅windows 程序设计第五版334页