它们和菜单一起,统称为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,另一次则是为了画图;
程序中也装载了两次字符串,一次是给程序的标题栏,另一次则是为了点击哪里就能在那里显示。