﻿<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>小文章&#124;短文网 &#187; Win32</title>
	<atom:link href="http://concom.org.ru/duanwen/tag/win32/feed" rel="self" type="application/rss+xml" />
	<link>http://concom.org.ru</link>
	<description>本站提供小文，小短文等内容！</description>
	<lastBuildDate>Sun, 20 Jun 2010 04:59:07 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Win32程序资源(3)</title>
		<link>http://concom.org.ru/duanwen/160.html</link>
		<comments>http://concom.org.ru/duanwen/160.html#comments</comments>
		<pubDate>Mon, 17 Jul 2006 11:11:22 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[电脑技术]]></category>
		<category><![CDATA[Win32]]></category>

		<guid isPermaLink="false">http://conn.org.ru/uncategorized/win32%e7%a8%8b%e5%ba%8f%e8%b5%84%e6%ba%903.html</guid>
		<description><![CDATA[　 ☆ 控制菜单事件
　　你可能记得，Windows的消息都是通过CALLBACK函数控制的，通常它是这个样子：WindowProc()或类似的样子。我们在上一章中用到的是这个样子：MsgHandler()。它的原形如下：
LRESULT CALLBACK MsgHandler(　HWND hwnd, // window handle　UINT msg, // the message identifier　WPARAM wparam, // message parameters　LPARAM lparam, // more message parameters};
　　当一个菜单消息被送到，msg将等于WM_COMMAND，所选择的菜单项目将被包含进wparam。这就是为什么菜单的标识符不能是字符串的原因，它需要适合wparam参数。更特别的是，菜单标识符只占用wparam的低位字。WPARAM，LPARAM，int等都是32位，分高、低位字的变量。Windows提供了宏LOWORD（）和HIWORD（）分别来提取变量中的低位字和高位字，原形如下：
#define LOWORD(l) ((WORD) (l))#define HIWORD(l) ((WORD) (((DWORD) (l) &#62;&#62; 16) &#38; 0xFFFF))
　　LOWORD()宏的实际情况是，由于简单的定义为WORD，就自然的取得了低端的16位。HIWORD()函数把高端的16位向右移，然后同0xFFFF之间调用了逻辑“和”（AND），确保把高于16位的字节变为0。可能你不太熟悉&#62;&#62;和&#60;&#60;操作符号，它们是位移操作符。“&#60;&#62;”就是向右移动。例如，我们有一个16位的变量x，它的值是224，二进制表示为0000 0000 1111 0100。下面是一个关于位移的例子：
short int x = 244, y;y = x &#60;&#60; 4;
Contents（内容） of x: 0000 0000 1111 0100Contents （内容）of y: 0000 [...]]]></description>
			<content:encoded><![CDATA[<p>　 <br />☆ 控制菜单事件</p>
<p>　　你可能记得，Windows的消息都是通过CALLBACK函数控制的，通常它是这个样子：WindowProc()或类似的样子。我们在上一章中用到的是这个样子：MsgHandler()。它的原形如下：</p>
<p>LRESULT CALLBACK MsgHandler(<br />　HWND hwnd, // window handle<br />　UINT msg, // the message identifier<br />　WPARAM wparam, // message parameters<br />　LPARAM lparam, // more message parameters<br />};</p>
<p>　　当一个菜单消息被送到，msg将等于WM_COMMAND，所选择的菜单项目将被包含进wparam。这就是为什么菜单的标识符不能是字符串的原因，它需要适合wparam参数。更特别的是，菜单标识符只占用wparam的低位字。WPARAM，LPARAM，int等都是32位，分高、低位字的变量。Windows提供了宏LOWORD（）和HIWORD（）分别来提取变量中的低位字和高位字，原形如下：</p>
<p>#define LOWORD(l) ((WORD) (l))<br />#define HIWORD(l) ((WORD) (((DWORD) (l) &gt;&gt; 16) &amp; 0xFFFF))</p>
<p>　　LOWORD()宏的实际情况是，由于简单的定义为WORD，就自然的取得了低端的16位。HIWORD()函数把高端的16位向右移，然后同0xFFFF之间调用了逻辑“和”（AND），确保把高于16位的字节变为0。可能你不太熟悉&gt;&gt;和&lt;&lt;操作符号，它们是位移操作符。“&lt;&gt;”就是向右移动。例如，我们有一个16位的变量x，它的值是224，二进制表示为0000 0000 1111 0100。下面是一个关于位移的例子：</p>
<p>short int x = 244, y;<br />y = x &lt;&lt; 4;</p>
<p>Contents（内容） of x: 0000 0000 1111 0100<br />Contents （内容）of y: 0000 1111 0100 0000</p>
<p>　　总之，使用LOWORD()宏你得到了wparam的低端字，也就是说你得到了被选择菜单的ID（标识符）。所以，在你的MsgHandler()函数中，你应该这样做：</p>
<p>// handle menu selections<br />if (msg == WM_COMMAND)<br />{<br />switch (LOWORD(wparam))<br />{<br />case MENUID_NEW:<br />// code to handle File-&gt;New goes here<br />break;<br />case MENUID_OPEN:<br />// code to handle File-&gt;Open goes here<br />break;</p>
<p>// the rest of the option handlers go here</p>
<p>}</p>
<p>// tell Windows you took care of it<br />return(0);<br />}</p>
<p>　　当然，还有一些其它的资源类型，如加速表（快捷键）、HTML页、WAV文件等。但我想以上这些是最有用，最要紧学习的。在结束之前，我还要告诉你Windows编程的一大强力特色——定制自己的资源类型。</p>
<p>　　☆ 定制资源</p>
<p>　　标准的程序资源给我们带来了很大方便。但不仅仅是这些标准的类型，你还可以创建自己的资源类型。资源可以是你希望的任何一种数据。使用自己定制的资源需要多付出一点劳动，因为你必须手工定位和读取资源数据。比想象的要容易，因为你已经习惯了定义资源的格式：</p>
<p>[identifier] [resource type name] [filename]</p>
<p>　　[resource type name]资源类型名称是让你命名的一个字符串。还是举例说明吧：假设我们要用到plconfig.dat文件作为资源，它包含初始化游戏人物的必需信息。我们将把它定义为CHARCONFIG资源类型，脚本文件应该是这个样子：</p>
<p>DATA_PLAYERINIT CHARCONFIG p1config.dat</p>
<p>　　很简单，是不是？现在，你已经拥有了数据（plconfig.dat），你还必须分三步使一个指针指向资源数据。这包括我们还没有提到过的需要调用的函数让我们一起解决。第一步，我们必须调用FindResource()函数去发现资源。函数原形如下：</p>
<p>HRSRC FindResource(<br />　HMODULE hModule, // module handle<br />　LPCTSTR lpName, // pointer to resource name<br />　LPCTSTR lpType // pointer to resource type<br />);</p>
<p>　　返回值是一个资源信息块儿的句柄，如果调用失败，返回NULL。参数意义如下：</p>
<p>　　※ HMODULE hModule：HMODULE相当于HINSTANCE。不要问我为什么换了另一个名字，你只要把你的程序实例句柄传送给它就好了，你不需要什么类型转换，它们是相同的。 </p>
<p>　　※ LPCTSTR lpName：这个是资源的标识符。如果你使用了数字的常量作为标识符，别忘了使用MAKEINTRESOURCE()宏。</p>
<p>　　※ LPCTSTR lpType：这个是资源的类型，你需要把你定义的资源类型名称的字符串传递给它。我们的是CHARCONFIG。<br />调用函数方式如下：</p>
<p>HRSRC hRsrc = http://127.0.0.1/FindResource(hinstance, MAKEINTRESOURCE(DATA_PLAYERINIT),&#8221;CHARCONFIG&#8221;);</p>
<p>　　这是信息块儿所在资源的句柄。下一步是要得到指向数据的指针。需要把句柄传递给LoadResource()函数，来调用数据。这将产生一个资源本身的句柄。下面是函数的原形：</p>
<p>HGLOBAL LoadResource(<br />　HMODULE hModule, // resource-module handle<br />　HRSRC hResInfo // resource handle<br />);</p>
<p>　　返回类型HGLOBAL是一个普通句柄类型，是相对于我们说过的那些HBITMAP或HICON等句柄类型。如果调用函数失败，将返回NULL。参数解释如下：</p>
<p>　　※ HMODULE hModule：老东西，程序实例的句柄。</p>
<p>　　※ HRSRC hResInfo：把FindResource()得到的句柄传递给它。</p>
<p>　　现在，我们有了资源的句柄，就可以得到指向数据（自定义的）的指针了，这需要调用LockResource()函数来完成。原形如下：</p>
<p>LPVOID LockResource(HGLOBAL hResData);</p>
<p>　　仅仅把调用LoadResource()函数得到的句柄传递给它就万事大吉了。如果返回值是NULL，说明函数调用失败。否则，我们就得到梦寐以求的指针！现在我们可以自由得处理数据了。注意：返回的类型是LPVOID，（相当于void*），所以若你想把指针指向队列符号，你还要注意转换成类似BYTE*型的哦！现在，我们完成了所有的步骤，这里，我将展示给你一个指针指向特殊资源的实例：</p>
<p>UCHAR* LoadCustomResource(int resID)<br />{<br />　HRSRC hResInfo;<br />　HGLOBAL hResource;</p>
<p>　// first find the resource info block<br />　if ((hResInfo = FindResource(hinstance, MAKEINTRESOURCE(resID), &#8220;CUSTOMRESOURCETYPE&#8221;)) == NULL)<br />　　return(NULL);</p>
<p>　// now get a handle to the resource<br />　if ((hResource = LoadResource(hinstance, hResInfo)) == NULL)<br />　　return(NULL);</p>
<p>　// finally get and return a pointer to the resource<br />　　return ((UCHAR*)LockResource(hResource));<br />}</p>
<p>　　总结</p>
<p>　　好了，以上就是关于资源的部分。看，Windows编程比想象的容易吧。学了这么多，好像还是不能做什么，所以，下一章，我将向你介绍一些基本的Windows图形设备接口函数，你就可以利用我们所学过的所有东西作一点作品出来了。</p>
]]></content:encoded>
			<wfw:commentRss>http://concom.org.ru/duanwen/160.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Win32程序资源(2)</title>
		<link>http://concom.org.ru/duanwen/159.html</link>
		<comments>http://concom.org.ru/duanwen/159.html#comments</comments>
		<pubDate>Mon, 17 Jul 2006 11:11:15 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[电脑技术]]></category>
		<category><![CDATA[Win32]]></category>

		<guid isPermaLink="false">http://conn.org.ru/uncategorized/win32%e7%a8%8b%e5%ba%8f%e8%b5%84%e6%ba%902.html</guid>
		<description><![CDATA[　 ☆ 位图
　　想要往程序里添加图象，通过位图资源可能是最简单的办法了。位图是Windows之本，当然提供了一些函数来处理位图，请记住，如果你使用了太多的位图，你的EXE文件将要非常巨大。在资源脚本中设置位图同图标和光标没什么区别：
[identifier] BITMAP [filename]
　　有一个函数LoadBitmap()，同LoadCursor()和LoadIcon()的用法很相似，它将得到一个句柄，由于我还没有讲过图形（graphics），就不具体说函数的功能了，你可以猜一猜它是怎样工作的，一旦你得到了图形句柄，你将怎样使用它呢？更多的留待以后再讲。不要担心，现在只是要你有点儿准备。下面看看我们还应该学点儿什么。
　　☆ 字符串表格
　　字符串表是我最喜欢的资源类型。正象你所想的：一个充满字符串的庞大表格。字符串表有很多用处。你可以用它存储你的文件名称，游戏中的人物对话，消息框中的文本，菜单中的文本等等。在资源脚本里建立一个字符串表很容易，就像这样： 
STRINGTABLE{// entries go here}
　　一个字符串表由几部分组成：一个标识字符串的数字；紧跟着一个逗号；然后是加了双引号的字符串本身。字符串表里的字符串被允许使用溢出符号。注意，字符串表本身并没有标识符，所以每个程序只能有一个字符串表。一个简单的字符串表可能象下面这个样子：
// program informationSTRINGTABLE{　1, &#8220;3D Space Game v1.0&#8243;　2, &#8220;Written by The Masked Coder&#8221;　3, &#8220;(C) 2000 WienerDog Software&#8221;}
　　从程序的字符串表里调用字符串，将使用——你可能猜到了——LoadString()函数。这是它的原形：
int LoadString(　HINSTANCE hInstance, // handle to module containing string resource　UINT uID, // resource identifier　LPTSTR lpBuffer, // pointer to buffer for resource　int nBufferMax // size of buffer);
　　函数返回的实数是字符的数量，不包括空字符，它将被赋值到程序数据段的缓冲区中去，相当于字符串的长度。如果你调用了一个空字符串或者调用失败，都将返回0。下面来看看具体参数：
　　※ HINSTANCE hInstance：同以前的一样，你所有操纵项目的句柄。
　　※ UINT uID：你想要调用的字符串的数码标识符。
　　※ LPTSTR [...]]]></description>
			<content:encoded><![CDATA[<p>　 <br />☆ 位图</p>
<p>　　想要往程序里添加图象，通过位图资源可能是最简单的办法了。位图是Windows之本，当然提供了一些函数来处理位图，请记住，如果你使用了太多的位图，你的EXE文件将要非常巨大。在资源脚本中设置位图同图标和光标没什么区别：</p>
<p>[identifier] BITMAP [filename]</p>
<p>　　有一个函数LoadBitmap()，同LoadCursor()和LoadIcon()的用法很相似，它将得到一个句柄，由于我还没有讲过图形（graphics），就不具体说函数的功能了，你可以猜一猜它是怎样工作的，一旦你得到了图形句柄，你将怎样使用它呢？更多的留待以后再讲。不要担心，现在只是要你有点儿准备。下面看看我们还应该学点儿什么。</p>
<p>　　☆ 字符串表格</p>
<p>　　字符串表是我最喜欢的资源类型。正象你所想的：一个充满字符串的庞大表格。字符串表有很多用处。你可以用它存储你的文件名称，游戏中的人物对话，消息框中的文本，菜单中的文本等等。在资源脚本里建立一个字符串表很容易，就像这样： </p>
<p>STRINGTABLE<br />{<br />// entries go here<br />}</p>
<p>　　一个字符串表由几部分组成：一个标识字符串的数字；紧跟着一个逗号；然后是加了双引号的字符串本身。字符串表里的字符串被允许使用溢出符号。注意，字符串表本身并没有标识符，所以每个程序只能有一个字符串表。一个简单的字符串表可能象下面这个样子：</p>
<p>// program information<br />STRINGTABLE<br />{<br />　1, &#8220;3D Space Game v1.0&#8243;<br />　2, &#8220;Written by The Masked Coder&#8221;<br />　3, &#8220;(C) 2000 WienerDog Software&#8221;<br />}</p>
<p>　　从程序的字符串表里调用字符串，将使用——你可能猜到了——LoadString()函数。这是它的原形：</p>
<p>int LoadString(<br />　HINSTANCE hInstance, // handle to module containing string resource<br />　UINT uID, // resource identifier<br />　LPTSTR lpBuffer, // pointer to buffer for resource<br />　int nBufferMax // size of buffer<br />);</p>
<p>　　函数返回的实数是字符的数量，不包括空字符，它将被赋值到程序数据段的缓冲区中去，相当于字符串的长度。如果你调用了一个空字符串或者调用失败，都将返回0。下面来看看具体参数：</p>
<p>　　※ HINSTANCE hInstance：同以前的一样，你所有操纵项目的句柄。</p>
<p>　　※ UINT uID：你想要调用的字符串的数码标识符。</p>
<p>　　※ LPTSTR lpBuffer：指向接收字符串的字符数组的指针。</p>
<p>　　※ int nBufferMax：缓冲区的字节长度。如果被调用的字符串的长度大于缓冲区的长度，字符串将被按照缓冲区的大小缩减。</p>
<p>　　例如，调用“WienerDog Software’s copyright”的信息，代码应该如下：</p>
<p>char buffer[80];<br />LoadString(hinstance, 3, buffer, sizeof(buffer));</p>
<p>　　尽管在资源脚本中字符串使用数字声明，而不是标识符，但我通常在使用字符串表时，习惯于在头文件中用#define定义一下字符串的声明数字。针对上面的代码，我可能加一行：</p>
<p>#define ST_WIENERDOGCOPYRIGHT 3</p>
<p>　　这样一来，用LoadString()函数时，你的程序代码更容易读懂，也使你的思路更加清晰。但也并不是意味着你必须为字符串表里的每一个字符串都定义一个常量标识符。当字符串表相当大时，或者你感觉记不清时，就应该定义常量标识符。我通常在每个常量标识符的前面加上一个前缀ST_。具体的说，ST_FILENAMES作为存储文件名称字符串的索引，ST_DIALOGUE作为人物对话字符串的索引，等等。</p>
<p>　　☆ 菜单</p>
<p>　　这是我们要讲的最后一个Windows资源，当然，不是为了凑数才讲的哦。窗口的菜单条紧接在标题栏的下发显示，这个菜单有时被称为“主菜单”或“顶层菜单”。菜单通常在建立窗口类时被调用。还记得吗？上一章中窗口类建立过程中，有这样一行：<br />sampleClass.lpszMenuName = NULL;</p>
<p>　　如果你正在建立一个窗口程序，并希望有菜单，你就得需要用到菜单资源。它的脚本文件可能要复杂一点儿，但下面是一个最基本的框架：</p>
<p>[identifier] MENU<br />{<br />　POPUP [menu name]<br />　{<br />　　MENUITEM [item name], [identifier]<br />　}<br />}</p>
<p>　　[identifier]标识符是你知道的：一个字符串或一个数字常量。在MENU的大括号中，可以有一个或者几个POPUP（弹出式）菜单，每一个都有一个下拉菜单，[menu name]中填入菜单名称。在POPUP的大括号中，可以有一个或者多个菜单条，[item name]中填入菜单条名称，后面必须跟着一个数字常量的标识符。（所谓数字常量的标识符，就是用#define定义过的标识符。如：#define MENUID_NEW 101）如果你还想在菜单里建立热键，就要用(&amp;)符号。在你想成为热键的字符前加上&amp;，例如，你想用Alt+F代替用鼠标点击File按钮，你就应该写成 &amp;File ，菜单的名称都要用双引号引上。看看下面的例子就更清楚了：</p>
<p>MAIN_MENU MENU<br />{<br />　POPUP &#8220;&amp;File&#8221;<br />　{<br />　　MENUITEM &#8220;&amp;New&#8221;, MENUID_NEW<br />　　MENUITEM &#8220;&amp;Open&#8230;&#8221;, MENUID_OPEN<br />　　MENUITEM &#8220;&amp;Save&#8221;, MENUID_SAVE<br />　　MENUITEM &#8220;Save &amp;As&#8230;&#8221;, MENUID_SAVEAS<br />　　MENUITEM &#8220;E&amp;xit&#8221;, MENUID_EXIT<br />　}</p>
<p>　POPUP &#8220;&amp;Help&#8221;<br />　{<br />　　MENUITEM &#8220;&amp;Contents&#8221;, MENUID_CONTENTS<br />　　MENUITEM &#8220;&amp;Index&#8230;&#8221;, MENUID_INDEX<br />　　MENUITEM &#8220;&amp;About&#8221;, MENUID_ABOUT<br />　}<br />}</p>
<p>　　你还可以在POPUP下建立子菜单，你自己琢磨吧，我就不讲了，我们还得往下进行。获得菜单资源的句柄，我们需要用LoadMenu()函数，它的原形如下：</p>
<p>HMENU LoadMenu(<br />　HINSTANCE hInstance, // handle to application instance<br />　LPCTSTR lpMenuName // menu name string or menu-resource identifier<br />);</p>
<p>　　现在你应该已经熟悉这些参数了。第一个参数是你的程序实例的句柄，第二个是你的菜单资源的标识符。如果你使用了数字常量作为标识符，别忘了使用MAKEINTRESOURCE()这个宏转换一下哦！现在，你有两个方法为窗口创建菜单。第一个方法是在创建窗口类时直接设置： sampleClass.lpszMenuName = LoadMenu(hinstance, MAKEINTRESOURCE(MAIN_MENU));</p>
<p>　　第二个方法是在设置窗口类时，让lpszMenuName等于NULL，以后再加入菜单。当你要建立两个独立的菜单，而又不想定义不同的窗口类时，这个选择是很有意义的，你需要用SetMenu（）函数：</p>
<p>BOOL SetMenu(<br />　HWND hWnd, // handle to window<br />　HMENU hMenu, // handle to menu<br />);</p>
<p>　　如果创建菜单的功能实现了，将返回TRUE，否则返回FALSE。它的参数是很容易理解的：</p>
<p>　　※ HWND hWnd：是你所要创建菜单的那个窗口的句柄。也就是你在调用CreateWindowEx()时产生的那个窗口句柄。</p>
<p>　　※ HMENU hMenu：识别菜单，使用它的形式是：hMenu=LoadMenu(hInstance,菜单标识符)，所以它得到的是LoadMenu（）函数返回的菜单句柄。如果给它赋值NULL，指定窗口的菜单将被移除。</p>
<p>　　资源是个好东西，因为它使我们很容易就生成了菜单。但是当我们点击了菜单上的选项，将会发生什么呢？答案是Windows将会发出一个WM_COMMAND的消息给程序，程序<br />
再让Windows作出相应的反应。让我们具体看一看吧！</p>
]]></content:encoded>
			<wfw:commentRss>http://concom.org.ru/duanwen/159.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用Win32程序资源</title>
		<link>http://concom.org.ru/duanwen/158.html</link>
		<comments>http://concom.org.ru/duanwen/158.html#comments</comments>
		<pubDate>Mon, 17 Jul 2006 11:11:08 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[电脑技术]]></category>
		<category><![CDATA[Win32]]></category>

		<guid isPermaLink="false">http://conn.org.ru/uncategorized/%e4%bd%bf%e7%94%a8win32%e7%a8%8b%e5%ba%8f%e8%b5%84%e6%ba%90.html</guid>
		<description><![CDATA[Win32程序资源(1)
　　简介
　　通过本章题目可能你已经猜出了本章论题，我将教会你在Windows程序中使用资源。简单的讲，资源即数据，它们通常是和程序的EXE文件相关联的，但是它们又是独一无二的。首先，资源在运行过程中不能被修改。它们实际上都是只读文件，而且程序代码不能够直接访问它们。另外，资源并不在程序的数据区内。在装入时，程序资源通常在某个磁盘文件中，直到程序需要它们时才被装入。使用资源是一件很容易的事情，并且它的妙处无穷。Windows为我们提供了大量的资源类型，但我们这里只学一些最常用，最容易的：图标（icon）、光标（cursor）、位图（bitmap）、菜单（menu）和字符串（string）。此后，我还将教你建立自己风格类型的资源，使你为所欲为。
　　重复一下，要想看懂本章，你得有点C语言的基础。C＋＋有时用一用，但不影响你学习本章内容。并且我假定你已经读过了上一章内容“Windows编程基础”。我还是用Microsoft Visual C＋＋的编译器，怎么样？出发吧！ 
　　☆ 资源脚本
　　在进行细节之前，我们要先搞懂怎样要编译器知道它所要编译的资源类型。方法是使用称之为资源脚本的特殊文件，它是一个简单的文本文件，可以手工编辑，也可以让Visual C＋＋自动编辑，或者你用其它的自动编辑器编辑。无论如何，资源脚本文件要有一个.rc的扩展名。大多数的脚本文件都从定义资源行开始，最简单的资源行通常要用到资源类型，就像这样：
　　[identifier] [resource type] [filename]　　【标识符】 【资源类型】 【文件名称】
　　标识符可以用两种方式表示：一种是能表示资源意思的字符串，另一种是在资源相对应的头文件中用#define定义过的数字常量。如果你选择数字常量，这通常是一个好主意，别忘了把相应的头文件加入到你的资源脚本。资源脚本使用C语言风格的文件格式好像比较容易理解。以下是一个比较简单的资源脚本实例：
#include &#8220;resource.h&#8221;
// iconsICON_MAIN ICON myicon.ico
// bitmapsIMG_TILESET1 BITMAP tileset.bmpIMG_TILESET2 BITMAP tileset2.bmp
　　好理解吧！但有一件事可能把人弄胡涂。例子中的ICON_MAIN和IMG_TILESET是字符串呢，还是数字常量？但这无伤大雅，编译器编译的时候会自己判断。如果发现在头文件中有#define的定义，那就认为是字符常量，否则，就是字符串。
　　如果有些迷茫，不要紧。我将解释我们要用到的每一个资源类型。什么？觉得麻烦？OK,OK，让我们用全自动的资源插入系统吧！（在Visual C＋＋中，在“插入”下拉菜单中，选择“资源”）我还是喜欢在记事本中用手工输入的模式，别问我为什么，我也不知道。：）现在你知道了建立资源脚本的基础知识，让我们开始进一步的行程吧！
　　☆ 图标和光标
　　你每天在使用的大多数的Windows程序，都有自己的图标，简单的说，就是EXE文件同这个图标资源相关联了，独特风格的光标也是如此。你已经知道图标的脚本行样子了，光标的和它很相似，看看吧：
[identifier] CURSOR [filename][identifier] ICON [filename]
　　增加了一行脚本行后，也就是意味着你的EXE文件又多了一个关联。也就是说你的EXE文件要根据标识符去相应的位置寻找相应的文件[filename]。你可以使用任何你喜欢用的图标/光标编辑器去编辑相应的文件。我通常利用Visual C＋＋中的编辑器。
　　把资源脚本做出来后，并没有完事儿，因为你还不知道怎么调用相应的资源，要想知道图标和光标是怎样在你的程序中被调用的，让我们回过头来，看一看上一章中的窗口类（windows class）文件：
WNDCLASSEX sampleClass; // declare structure variable
sampleClass.cbSize = sizeof(WNDCLASSEX); // always use this!sampleClass.style = CS_DBLCLKS &#124; CS_OWNDC &#124; CS_HREDRAW &#124; CS_VREDRAW; // standard settingssampleClass.lpfnWndProc = MsgHandler; // message handler [...]]]></description>
			<content:encoded><![CDATA[<p>Win32程序资源(1)</p>
<p>　　<br />简介</p>
<p>　　通过本章题目可能你已经猜出了本章论题，我将教会你在Windows程序中使用资源。简单的讲，资源即数据，它们通常是和程序的EXE文件相关联的，但是它们又是独一无二的。首先，资源在运行过程中不能被修改。它们实际上都是只读文件，而且程序代码不能够直接访问它们。另外，资源并不在程序的数据区内。在装入时，程序资源通常在某个磁盘文件中，直到程序需要它们时才被装入。使用资源是一件很容易的事情，并且它的妙处无穷。Windows为我们提供了大量的资源类型，但我们这里只学一些最常用，最容易的：图标（icon）、光标（cursor）、位图（bitmap）、菜单（menu）和字符串（string）。此后，我还将教你建立自己风格类型的资源，使你为所欲为。</p>
<p>　　重复一下，要想看懂本章，你得有点C语言的基础。C＋＋有时用一用，但不影响你学习本章内容。并且我假定你已经读过了上一章内容“Windows编程基础”。我还是用Microsoft Visual C＋＋的编译器，怎么样？出发吧！ </p>
<p>　　☆ 资源脚本</p>
<p>　　在进行细节之前，我们要先搞懂怎样要编译器知道它所要编译的资源类型。方法是使用称之为资源脚本的特殊文件，它是一个简单的文本文件，可以手工编辑，也可以让Visual C＋＋自动编辑，或者你用其它的自动编辑器编辑。无论如何，资源脚本文件要有一个.rc的扩展名。大多数的脚本文件都从定义资源行开始，最简单的资源行通常要用到资源类型，就像这样：</p>
<p>　　[identifier] [resource type] [filename]<br />　　【标识符】 【资源类型】 【文件名称】</p>
<p>　　标识符可以用两种方式表示：一种是能表示资源意思的字符串，另一种是在资源相对应的头文件中用#define定义过的数字常量。如果你选择数字常量，这通常是一个好主意，别忘了把相应的头文件加入到你的资源脚本。资源脚本使用C语言风格的文件格式好像比较容易理解。以下是一个比较简单的资源脚本实例：</p>
<p>#include &#8220;resource.h&#8221;</p>
<p>// icons<br />ICON_MAIN ICON myicon.ico</p>
<p>// bitmaps<br />IMG_TILESET1 BITMAP tileset.bmp<br />IMG_TILESET2 BITMAP tileset2.bmp</p>
<p>　　好理解吧！但有一件事可能把人弄胡涂。例子中的ICON_MAIN和IMG_TILESET是字符串呢，还是数字常量？但这无伤大雅，编译器编译的时候会自己判断。如果发现在头文件中有#define的定义，那就认为是字符常量，否则，就是字符串。</p>
<p>　　如果有些迷茫，不要紧。我将解释我们要用到的每一个资源类型。什么？觉得麻烦？OK,OK，让我们用全自动的资源插入系统吧！（在Visual C＋＋中，在“插入”下拉菜单中，选择“资源”）我还是喜欢在记事本中用手工输入的模式，别问我为什么，我也不知道。：）现在你知道了建立资源脚本的基础知识，让我们开始进一步的行程吧！</p>
<p>　　☆ 图标和光标</p>
<p>　　你每天在使用的大多数的Windows程序，都有自己的图标，简单的说，就是EXE文件同这个图标资源相关联了，独特风格的光标也是如此。你已经知道图标的脚本行样子了，光标的和它很相似，看看吧：</p>
<p>[identifier] CURSOR [filename]<br />[identifier] ICON [filename]</p>
<p>　　增加了一行脚本行后，也就是意味着你的EXE文件又多了一个关联。也就是说你的EXE文件要根据标识符去相应的位置寻找相应的文件[filename]。你可以使用任何你喜欢用的图标/光标编辑器去编辑相应的文件。我通常利用Visual C＋＋中的编辑器。</p>
<p>　　把资源脚本做出来后，并没有完事儿，因为你还不知道怎么调用相应的资源，要想知道图标和光标是怎样在你的程序中被调用的，让我们回过头来，看一看上一章中的窗口类（windows class）文件：</p>
<p>WNDCLASSEX sampleClass; // declare structure variable</p>
<p>sampleClass.cbSize = sizeof(WNDCLASSEX); // always use this!<br />sampleClass.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW; // standard settings<br />sampleClass.lpfnWndProc = MsgHandler; // message handler function<br />sampleClass.cbClsExtra = 0; // extra class info, not used<br />sampleClass.cbWndExtra = 0; // extra window info, not used<br />sampleClass.hInstance = hinstance; // parameter passed to WinMain()<br />sampleClass.hIcon = LoadIcon(NULL, IDI_WINLOGO); // Windows logo<br />sampleClass.hCursor = LoadCursor(NULL, IDC_ARROW); // standard cursor<br />sampleClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); // a simple black brush<br />sampleClass.lpszMenuName = NULL; // no menu<br />sampleClass.lpszClassName = &#8220;Sample Class&#8221; // class name<br />sampleClass.hIconSm = LoadIcon(NULL, IDI_WINLOGO); // Windows logo again</p>
<p>　　还记得它吧？这个hIcon用来表示整个程序；hIconSm用来出现在开始菜单和窗口的标题栏里；hCursor用来表示在你所创建的窗口中的光标的样子。我向你保证，我们要实现自己的风格一点都不复杂。下面是它们的原形：</p>
<p>HICON LoadIcon(<br />　HINSTANCE hInstance, // handle to application instance<br />　LPCTSTR lpIconName // icon-name string or icon resource identifier<br />);</p>
<p>HCURSOR LoadCursor(<br />　HINSTANCE hInstance, // handle to application instance<br />　LPCTSTR lpCursorName // name string or cursor resource identifier<br />);</p>
<p>　　返回的类型是它们自己相对应的类型。其内部的参数都很直观：</p>
<p>　　※ HINSTANCE hInstane：但程序执行时，把图标或光标相对应的句柄传递给WinMain（）函数。若要使用Windows的标注图标或光标，就把它设置为NULL。</p>
<p>　　※ LPCTSTR lpIconName，lpCursorName：是你要调用的资源的标识符字符串。如果你在脚本文件中用字符串直接作为标识符，就直接传送它好了；如果你是用数字常量，就要使用一个Windows头文件里的宏MAKEINTRESOURCE()来把它们协调一致。</p>
<p>　　让我们看一看下面的资源脚本，是关于图标和光标的：</p>
<p>#include &#8220;resource.h&#8221;</p>
<p>ICON_MAIN ICON myicon.ico<br />CURSOR_ARROW CURSOR arrow.cur</p>
<p>　　如果标识符ICON_MAIN合CURSOR_ARROW在头文件resource.h中没有被#define定义过，那么我们将直接传递它给资源调用函数，象这样：</p>
<p>sampleClass.hIcon = LoadIcon(hinstance, &#8220;ICON_MAIN&#8221;);</p>
<p>　　如果它们在头文件resource.h中这样定义过：</p>
<p>#define ICON_MAIN 1000<br />#define CURSOR_ARROW 2000</p>
<p>　　你就必须用宏MAKEINTRESOURCE()把它们转变为LPCTSTR类型。下面给出你几种意义相同的调用方法，都是正确的喔！</p>
<p>sampleClass.hIcon = LoadIcon(hinstance, MAKEINTRESOURCE(ICON_MAIN));<br />or&#8230;<br />sampleClass.hIcon = LoadIcon(hinstance, MAKEINTRESOURCE(1000));<br />or&#8230;<br />int ident = 1000;<br />sampleClass.hIcon = LoadIcon(hinstance, MAKEINTRESOURCE(ident));</p>
<p>　　关于图标和光标的调用，你学的差不多了。就这个话题，我还想告诉你一件事儿。如果你除了在程序的开始设置光标外，在程序中还要设置光标，有一个简单的Windows函数可以完成它：</p>
<p>HCURSOR SetCursor(HCURSOR hCursor);</p>
<p>　　仅仅一个参数，它是一个句柄，是在调用LoadCursor()时得到的，函数返回调用的上一个光标的句柄，如果没有设置过上一个光标，返回值是<br />
NULL。有点胡涂？无关大局，以后会明白。让我们看一看更有趣的吧！</p>
]]></content:encoded>
			<wfw:commentRss>http://concom.org.ru/duanwen/158.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Windows编程基础</title>
		<link>http://concom.org.ru/duanwen/154.html</link>
		<comments>http://concom.org.ru/duanwen/154.html#comments</comments>
		<pubDate>Mon, 17 Jul 2006 11:10:40 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[电脑技术]]></category>
		<category><![CDATA[con]]></category>
		<category><![CDATA[Win32]]></category>
		<category><![CDATA[我]]></category>
		<category><![CDATA[移动]]></category>

		<guid isPermaLink="false">http://conn.org.ru/uncategorized/windows%e7%bc%96%e7%a8%8b%e5%9f%ba%e7%a1%80.html</guid>
		<description><![CDATA[Windows编程(1)
　　简介
　　本文目的是介绍Windows编程基础。在本文结束时，你应该能够很好的工作了，虽然可能是简单的WIindows程序。你需要有C语言的基础知识，我很少将C＋＋的代码扩充到程序中。当然，由于Windows本身就是面向对象的，一点类的知识是不会对你有什么损害的。如果你不熟悉C＋＋，没有关系，我想你还是能从我这里学到大部分的东西。所有的程序代码都通过了Microsoft Visual C＋＋6.0的编译，如果你还没有合适的编译器，弄一个同我一样的好了，它还是很棒的。开动吧！
　　开始
　　多数的Windows程序都需要Windows.h和Windowsx.h这两个头文件，要确保使用它们。当然，你还需要其它的标准的C的头文件，象stdio.h，conio.h等。除了这些，你还会经常看到在程序的开始有这样一行代码：
#define WIN32_LEANAND_MEAN
　　它表示Windows的头文件中将拒绝接受MFC的东西，这将加速你的build时间。如果你从没有打算应用MFC在你的游戏编程中，那就使用它吧。如果你以前从没有看过这种声明类型——在#define后，直接加上一个“单词”，那么它的作用就是有条件编译。看看下面的例子： 
#ifdef DEBUG_MODEprintf(&#8221;Debug mode is active!&#8221;);#endif
　　意思是：如果程序的开始包含#define DEBUG_MODE，那么就printf()，否则退出。这个对于你跟踪程序的逻辑错误是很有帮助的。
　　WinMain()函数
　　DOS下的C语言从main()开始，Windows下的C语言从WinMain()开始，一个空的WinMain()函数是这样的：
int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){return(0);}
　　一个函数即使什么也没做，也应该返回一个值。是的，有好多东西我们不熟悉。首先的首先，WINAPI是个什么声明？WINAPI是在windows.h头文件中定义的一个宏，它把函数调用翻译成正确的调用约定。当我们在程序中需要用到汇编语言的时候，我们在来深究它好了，记住，如果要用WinMain()，就必须要有WINAPI。
　　下一步让我们来看看括号里的四个参数：
　　◎ HINSTANCE hinstance：HINSTANCE是一个句柄类型的标识符。变量hinstance是一个整数，用于标识程序实例。Windows设置这个参数的值，并把它传递给你的程序代码。很多Windows函数都要用到它。
　　◎ HINSTANCE hPreInstance：你不用担心这个参数，它已经被废掉了。它只是为古老的Windows版本服务的。你将还会看到类似的情况。
　　◎ LPSTR lpCmdLine：是一个指向字符串的指针，它仅在程序名是从DOS命令行输入或是从Run对话框中输入时才起作用。因此，很少被程序代码所用。 
　　◎ int nCmdShow：决定了窗口在初始显示时的状态。Windows通常给这个参数分配一个值。通常是SW_打头的一个常量。例如SW_SHOWNORMAL表示默认状态，SW_MAXINIZE或SW_MINIMIZE分别表示最大和最小模式等等。
　　消息
　　当你在DOS下编程的时候，你不必担心其它程序的运行，因为DOS是独占模式。但你在Windows平台上编程时，你不得不考虑其它正在运行的程序。鉴于此，Windows通过“消息”来连接操作申请和具体操作。简单的说，就是我们指示程序或程序本身向Windows发出诸如移动窗口、放大窗口、关闭窗口等地申请，Windows再根据申请，考察实地情况，拒绝或发出指令，让程序（计算机）作出相应的动作。再例如，鼠标随时向Windows发出消息，汇报光标位置，左键或右键是否按下等，Windows再根据消息作出相应的反应。总之，无论何时，Windows都要随时掌控所有的消息，而且，Windows是一直不断地接收到各种消息。
　　这种功能是通过一种被命名为CALLBACK函数类型实现的。不用害怕，消息的传递来，传递去都是由Windows自己完成的，你只要声明一个CALLBACK函数就可以了，就像WINAPI用在WinMain()前一样。如果还没有明白，不要紧，往下看你就明白了。现在，我要离开这个话题一会，因为你只有先建立窗口（Windows），传递消息才有可能实现。
　　窗口类
　　现在谈论一点C＋＋的知识，因为要想建立一个窗口，你就得先建立一个窗口类。窗口类包含所有的有关窗口的信息，如用什么样的鼠标符号，菜单样式等等。开发任何一个窗口程序，都离不开窗口类的建立。为了达到此目的，你必须填写WNDCLASSEX结构。EX的意思是“扩充”的意思，因为有一个老的结构叫作WNDCLASS，这里，我们将使用WNDCLASSEX结构，它的样子如下： 
typedef struct _WNDCLASSEX {
UINT cbSize;UINT style;WNDPROC lpfnWndProc;int cbClsExtra;int cbWndExtra;HANDLE hInstance;HICON hIcon;HCURSOR hCursor;HBRUSH hbrBackground;LPCTSTR lpszMenuName;LPCTSTR lpszClassName;HICON hIconSm;} WNDCLASSEX;
　　这个结构有不少成员，讨厌的是，你必须为窗口类设置每一个成员。莫发愁，纸老虎一个。让我们来个速成。
　　※ UINT cbSize：指定了以字节为单位的结构的大小。这个成员是通过sizeof(WNDCLASSEX)实现的。你将会经常看到它，尤其是你使用了DirectX。
　　※ UINT style：指定了窗口的风格。它经常被以CS_打头的符号常量定义。两种或两种以上的风格可以通过C语言中的“或”（&#124;）运算符加以组合。大多数情况我们只应用四种风格，出于对文章长度的考虑，我们只列出这四种。若你还需要其它的，到MSDN里找一下好了。别告诉我你用的不是Visual C＋＋啊！
　　◎ CS_HREDRAW：一旦移动或尺寸调整使客户区的宽度发生变化，就重新绘制窗口。
　　◎ CS_VREDRAW：一旦移动或尺寸调整使客户区的高度发生变化，就重新绘制窗口。 
　　◎ CS_OWNDC：为该类中的每一个窗口分配一个唯一的设备上下文。
　　◎ CS_DBLCLKS：当用户双击鼠标时向窗口过程发送双击消息。
　　※ [...]]]></description>
			<content:encoded><![CDATA[<p>Windows编程(1)</p>
<p>　　<br />简介</p>
<p>　　本文目的是介绍Windows编程基础。在本文结束时，你应该能够很好的工作了，虽然可能是简单的WIindows程序。你需要有C语言的基础知识，我很少将C＋＋的代码扩充到程序中。当然，由于Windows本身就是面向对象的，一点类的知识是不会对你有什么损害的。如果你不熟悉C＋＋，没有关系，我想你还是能从我这里学到大部分的东西。所有的程序代码都通过了Microsoft Visual C＋＋6.0的编译，如果你还没有合适的编译器，弄一个同我一样的好了，它还是很棒的。开动吧！</p>
<p>　　开始</p>
<p>　　多数的Windows程序都需要Windows.h和Windowsx.h这两个头文件，要确保使用它们。当然，你还需要其它的标准的C的头文件，象stdio.h，conio.h等。除了这些，你还会经常看到在程序的开始有这样一行代码：</p>
<p>#define WIN32_LEANAND_MEAN</p>
<p>　　它表示Windows的头文件中将拒绝接受MFC的东西，这将加速你的build时间。如果你从没有打算应用MFC在你的游戏编程中，那就使用它吧。如果你以前从没有看过这种声明类型——在#define后，直接加上一个“单词”，那么它的作用就是有条件编译。看看下面的例子： </p>
<p>#ifdef DEBUG_MODE<br />printf(&#8221;Debug mode is active!&#8221;);<br />#endif</p>
<p>　　意思是：如果程序的开始包含#define DEBUG_MODE，那么就printf()，否则退出。这个对于你跟踪程序的逻辑错误是很有帮助的。</p>
<p>　　WinMain()函数</p>
<p>　　DOS下的C语言从main()开始，Windows下的C语言从WinMain()开始，一个空的WinMain()函数是这样的：</p>
<p>int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)<br />{<br />return(0);<br />}</p>
<p>　　一个函数即使什么也没做，也应该返回一个值。是的，有好多东西我们不熟悉。首先的首先，WINAPI是个什么声明？WINAPI是在windows.h头文件中定义的一个宏，它把函数调用翻译成正确的调用约定。当我们在程序中需要用到汇编语言的时候，我们在来深究它好了，记住，如果要用WinMain()，就必须要有WINAPI。</p>
<p>　　下一步让我们来看看括号里的四个参数：</p>
<p>　　◎ HINSTANCE hinstance：HINSTANCE是一个句柄类型的标识符。变量hinstance是一个整数，用于标识程序实例。Windows设置这个参数的值，并把它传递给你的程序代码。很多Windows函数都要用到它。</p>
<p>　　◎ HINSTANCE hPreInstance：你不用担心这个参数，它已经被废掉了。它只是为古老的Windows版本服务的。你将还会看到类似的情况。</p>
<p>　　◎ LPSTR lpCmdLine：是一个指向字符串的指针，它仅在程序名是从DOS命令行输入或是从Run对话框中输入时才起作用。因此，很少被程序代码所用。 </p>
<p>　　◎ int nCmdShow：决定了窗口在初始显示时的状态。Windows通常给这个参数分配一个值。通常是SW_打头的一个常量。例如SW_SHOWNORMAL表示默认状态，SW_MAXINIZE或SW_MINIMIZE分别表示最大和最小模式等等。</p>
<p>　　消息</p>
<p>　　当你在DOS下编程的时候，你不必担心其它程序的运行，因为DOS是独占模式。但你在Windows平台上编程时，你不得不考虑其它正在运行的程序。鉴于此，Windows通过“消息”来连接操作申请和具体操作。简单的说，就是我们指示程序或程序本身向Windows发出诸如移动窗口、放大窗口、关闭窗口等地申请，Windows再根据申请，考察实地情况，拒绝或发出指令，让程序（计算机）作出相应的动作。再例如，鼠标随时向Windows发出消息，汇报光标位置，左键或右键是否按下等，Windows再根据消息作出相应的反应。总之，无论何时，Windows都要随时掌控所有的消息，而且，Windows是一直不断地接收到各种消息。</p>
<p>　　这种功能是通过一种被命名为CALLBACK函数类型实现的。不用害怕，消息的传递来，传递去都是由Windows自己完成的，你只要声明一个CALLBACK函数就可以了，就像WINAPI用在WinMain()前一样。如果还没有明白，不要紧，往下看你就明白了。现在，我要离开这个话题一会，因为你只有先建立窗口（Windows），传递消息才有可能实现。</p>
<p>　　窗口类</p>
<p>　　现在谈论一点C＋＋的知识，因为要想建立一个窗口，你就得先建立一个窗口类。窗口类包含所有的有关窗口的信息，如用什么样的鼠标符号，菜单样式等等。开发任何一个窗口程序，都离不开窗口类的建立。为了达到此目的，你必须填写WNDCLASSEX结构。EX的意思是“扩充”的意思，因为有一个老的结构叫作WNDCLASS，这里，我们将使用WNDCLASSEX结构，它的样子如下： </p>
<p>typedef struct _WNDCLASSEX {</p>
<p>UINT cbSize;<br />UINT style;<br />WNDPROC lpfnWndProc;<br />int cbClsExtra;<br />int cbWndExtra;<br />HANDLE hInstance;<br />HICON hIcon;<br />HCURSOR hCursor;<br />HBRUSH hbrBackground;<br />LPCTSTR lpszMenuName;<br />LPCTSTR lpszClassName;<br />HICON hIconSm;<br />} WNDCLASSEX;</p>
<p>　　这个结构有不少成员，讨厌的是，你必须为窗口类设置每一个成员。莫发愁，纸老虎一个。让我们来个速成。</p>
<p>　　※ UINT cbSize：指定了以字节为单位的结构的大小。这个成员是通过sizeof(WNDCLASSEX)实现的。你将会经常看到它，尤其是你使用了DirectX。</p>
<p>　　※ UINT style：指定了窗口的风格。它经常被以CS_打头的符号常量定义。两种或两种以上的风格可以通过C语言中的“或”（|）运算符加以组合。大多数情况我们只应用四种风格，出于对文章长度的考虑，我们只列出这四种。若你还需要其它的，到MSDN里找一下好了。别告诉我你用的不是Visual C＋＋啊！</p>
<p>　　◎ CS_HREDRAW：一旦移动或尺寸调整使客户区的宽度发生变化，就重新绘制窗口。</p>
<p>　　◎ CS_VREDRAW：一旦移动或尺寸调整使客户区的高度发生变化，就重新绘制窗口。 </p>
<p>　　◎ CS_OWNDC：为该类中的每一个窗口分配一个唯一的设备上下文。</p>
<p>　　◎ CS_DBLCLKS：当用户双击鼠标时向窗口过程发送双击消息。</p>
<p>　　※ WNDPROC lpfnWndProc：是指向窗口过程的指针。一般都指向CALLBACK函数。如果你没有用过函数指针，简单理解为函数的地址就是函数的名字，名字后面别带括号。</p>
<p>　　※ int cbClsExtra：它是为类保留的额外信息 。大多数程序员不用它，你在在写游戏程序时也不太可能用它，所以，设为0好了。</p>
<p>　　※ int cbWndExtra：同上一个差不多，设为0好了。</p>
<p>　　※ HANDLE hInstance：是指向窗口过程实例的句柄。同时也是WinMain（）函数的参数之一。应该设置为hinstance。</p>
<p>　　※ HICON hIcon：指向窗口图标的句柄，它通常被LoadIcon()函数设置。在你学会如何在你的程序中使用资源前，你先设置成如下样子：LoadIcon（NULL，IDI_WINLOGO）。当然，还有一些其它的IDI_打头的符号常量，你自己去帮助文件里找吧。</p>
<p>　　※ HCURSOR hCursor：指向窗口光标的句柄，它通常被LoadCursor（）函数设置，在你学会如何在你的程序中使用资源前，你先用Windows默认的吧，LoadCursor(NULL,IDC_ARROW)。</p>
<p>　　※ HBRUSH hbrBackground：当你的窗口过程得到消息，要求刷新（或重画）窗口时，至少要用一种纯色或“brush”（画刷）重画窗口区域，画刷是由</p>
]]></content:encoded>
			<wfw:commentRss>http://concom.org.ru/duanwen/154.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
