windows 程序设计自学:添加图标资源

 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页

posted @ 2014-07-02 01:23  践道者  阅读(1116)  评论(0编辑  收藏  举报