它们和菜单一起,统称为windows的资源,虽然它们也是数据,但他们并不存放在数据段中,我们也不能直接在程序中定义资源变量并访问它们,Windows提供函数直接或间接地把它们加载内存以备使用。
先说图标:图标分为2种:16*16的和32*32的,这两种的区别在于,16*16的用于程序的标题栏,而32*32的应用于程序中,或者用于exe文件。
光标其实没啥好说的,但是字符串表值得一提:windows已经有了字符串了,为什么还要把它搞成资源呢?其实这样做的主要目的是为了软件的翻译方便:如果你的软件需要翻译,但又害自己的源代码泄密,最好的办法就是给翻译的人只提供资源文件,让他把资源翻译好了以后在给我们,然后我们自己再重新进行编译,这样就能万无一失啦!但这也意味着,你在写程序时,要把显示在屏幕上的内容全部做成资源。
下面看一下程序,比较简单:
#include <windows.h> #include "resource.h" LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("Checker1") ; TCHAR szCaption [100]; HWND hwnd ; MSG msg ; WNDCLASS wndclass ; //装载字符串 LoadString (hInstance, IDS_STRING102, szCaption, sizeof (szCaption) / sizeof (TCHAR)) ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; //给窗口装载自己的图标:16位的 wndclass.hIcon = LoadIcon (hInstance, MAKEINTRESOURCE (IDI_ICON1)) ; //加载光标 wndclass.hCursor = LoadCursor (hInstance, MAKEINTRESOURCE (IDC_POINTER)) ; wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = szAppName ; if (!RegisterClass (&wndclass)) { MessageBox (NULL, TEXT ("This program requires Windows NT!"), szAppName, MB_ICONERROR) ; return 0 ; } //这里就使用了装载的字符串表 hwnd = CreateWindow (szAppName, szCaption, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL) ; ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ; while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } return msg.wParam ; } LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static HICON hIcon ; static int cxIcon, cyIcon, cxClient, cyClient ; HDC hdc ; HINSTANCE hInstance ; PAINTSTRUCT ps ; int x, y ; int mx,my; RECT rect; static TCHAR szTEXT[100] ; switch (message) { case WM_CREATE : //获取实例句柄 hInstance = ((LPCREATESTRUCT) lParam)->hInstance ; //这里装载的是32位的 hIcon = LoadIcon (hInstance, MAKEINTRESOURCE (IDI_ICON1)) ; //装载字符串 LoadString (hInstance, IDS_STRING103,szTEXT , sizeof (szTEXT) / sizeof (TCHAR)) ; //图标宽度 cxIcon = GetSystemMetrics (SM_CXICON) ; //图标高度 cyIcon = GetSystemMetrics (SM_CYICON) ; return 0 ; case WM_SIZE : cxClient = LOWORD (lParam) ; cyClient = HIWORD (lParam) ; return 0 ; case WM_PAINT : hdc = BeginPaint (hwnd, &ps) ; GetClientRect(hwnd,&rect); for (y = 0 ; y < cyClient ; y += cyIcon) for (x = 0 ; x < cxClient ; x += cxIcon) DrawIcon (hdc, x, y, hIcon) ; EndPaint (hwnd, &ps) ; return 0 ; case WM_LBUTTONDOWN: mx = (LOWORD(lParam)); my = (HIWORD(lParam)); hdc = GetDC(hwnd); //使用了装载的字符串表 TextOut(hdc,mx,my,szTEXT,lstrlen(szTEXT) ); ReleaseDC(hwnd,hdc); return 0; case WM_DESTROY : PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; }
有几点需要注意:
程序中装载了两次图标,一次是给wndclass.hIcon,另一次则是为了画图;
程序中也装载了两次字符串,一次是给程序的标题栏,另一次则是为了点击哪里就能在那里显示。