windows程序设计(16):使用自己的图标,光标和字符串表

它们和菜单一起,统称为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,另一次则是为了画图;

程序中也装载了两次字符串,一次是给程序的标题栏,另一次则是为了点击哪里就能在那里显示。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值