📄 chap09.html
字号:
<P>				if (dc.GetPixel(i, j)==cr)</P>
<P>				{</P>
<P>					dc.SetPixelV(i, j, RGB(192-192*(i-nWidth/2)/nLen, </P>
<P>					 192-192*(i-nWidth/2)/nLen, 192-192*(i-nWidth/2)/nLen));</P>
<P>				}</P>
<P>			}</P>
<P>		}</P>
<P>	}</P>
<P>}</P>
<P>// 消息 WM_NCPAINT 的处理成员函数</P>
<P>void CMyWnd::OnNcPaint()</P>
<P>{</P>
<P>	CFrameWnd::OnNcPaint();</P>
<P>	// 检查当前窗口是否为激活窗口</P>
<P>	if (::GetActiveWindow()==GetSafeHwnd())</P>
<P>		PaintTitleBar(TRUE);</P>
<P>	else</P>
<P>		PaintTitleBar(FALSE);</P>
<P>}</P>
<P>// 消息 WM_NCACTIVATE 的处理成员函数</P>
<P>BOOL CMyWnd::OnNcActivate(BOOL bActive)</P>
<P>{</P>
<P>	CFrameWnd::OnNcActivate(bActive);</P>
<P>	// 根据不同的激活状态按不同的方式绘制窗口标题条</P>
<P>	if (bActive)</P>
<P>	{</P>
<P>		PaintTitleBar(TRUE);</P>
<P>		return FALSE;</P>
<P>	}</P>
<P>	else</P>
<P>	{</P>
<P>		PaintTitleBar(FALSE);</P>
<P>		return FALSE;</P>
<P>	}</P>
<P>}</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">下面补充说明一下应用程序</FONT><FONT SIZE=3>MulticlrdCaption</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的创建。由于该应用程序的结构比较简单,因此我们不打算使用</FONT><FONT SIZE=3>AppWizard</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>来创建框架应用程序。这里,我们先创建一个</FONT><FONT SIZE=3>Win32 Application</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>工程,然后添加一个</FONT><FONT SIZE=3>C++ source file</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,在该源代码文件中输入上面的代码。这个过程已经在本书前面的章节中使用过,因此你应该能够很轻松的完成它。下面我们来分析这个应用程序。首先,我们在类</FONT><FONT SIZE=3>CMyWnd</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中添加一个成员函数</FONT><FONT SIZE=3>PaintTitleBar</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。该成员函数用来绘制窗口的标题条,其参数</FONT><FONT SIZE=3>bActive</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>给出了窗口的激活状态。如果当前窗口正处于激活状态,我们使用从红色到绿色再到蓝色的渐变颜色来绘制应用程序的标题条,如果当前窗口正处于非激活状态,我们使用从黑色到灰色再到黑色的渐变色来绘制标题条。</P>
<P ALIGN="JUSTIFY">由于我们需要通过设备上下文在窗口的非客户区</FONT><FONT SIZE=3>(</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>这里指窗口的标题条区域</FONT><FONT SIZE=3>)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>在进行绘制,所以我们选用了</FONT><FONT SIZE=3>CWindowDC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>类。在类</FONT><FONT SIZE=3>CWindowDC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>构造函数中自动调用了</FONT><FONT SIZE=3>GetWindowDC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数,在其析构函数中自动调用了</FONT><FONT SIZE=3>ReleaseDC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数。类</FONT><FONT SIZE=3>CWindowDC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的构造函数使用了一个指向</FONT><FONT SIZE=3>CWnd</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>对象的指针作为其参数,通过所创建的</FONT><FONT SIZE=3>CWindowDC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>对象可以在窗口的非客户区进行图形输出。</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">在创建了类型为</FONT><FONT SIZE=3>CWindowDC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的设备上下文对象</FONT><FONT SIZE=3>dc</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>之后,我们调用</FONT><FONT SIZE=3>API</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数</FONT><FONT SIZE=3>GetSystemMetrics</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>来获得当前窗口的边框高度和宽度以及标题条的高度。这里我们指出一点,即这些度量值仅适用于具有常规样式的窗口,对于一些特殊的窗口可能不成立,如对于工具条窗口,其标题条高度要小得多。这是上面的应用程序的一个局限,但不可以对一个仅用来讲解</FONT><FONT SIZE=3>CWindowDC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>对象的使用的示例过于苛求,否则我们就不得不花篇幅去介绍很多完善整个应用程序所需要的额外代码。这种对应用程序的简化的处理方法下面还会遇到。通过使用不同的参数调用</FONT><FONT SIZE=3>GetSystemMetrics</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数可以得到不同的系统度量。我们所使用的仅仅是这些度量值中的很少一部分。</P>
<P ALIGN="JUSTIFY">如果窗口是处于激活状态,我们使用参数</FONT><FONT SIZE=3>COLOR_ACTIVECAPTION</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>调用</FONT><FONT SIZE=3>API</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数</FONT><FONT SIZE=3>GetSysColor</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>得到当前系统颜色设置中激活状态条使用的颜色</FONT><FONT SIZE=3>(</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>我们不能假定用户的</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>窗口在激活时都使用标准的蓝色标题条,因此用户可以很方便的使用控制面板或通过右击桌面选择“属性”来更改这些设置</FONT><FONT SIZE=3>)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。然后,我们调用在类</FONT><FONT SIZE=3>CWindowDC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的基类</FONT><FONT SIZE=3>CDC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中定义的成员函数</FONT><FONT SIZE=3>GetPixel</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>来获得标题条上的每一点的颜色值,如果这一点的颜色值等于当前使用的激活标题条颜色的话,就调用函数</FONT><FONT SIZE=3>SetPixelV</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>将该点的颜色设置为新的值。这种方式不会不正确的擦除当前标题条上的标题文本、应用程序图标以及窗口右上角最大化、最小化和关闭按钮,但是,由于在新的</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>操作系统</FONT><FONT SIZE=3>Windows 98</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>以及</FONT><FONT SIZE=3>Windows NT 5.0</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中,标题条的颜色在默认情况下是渐变的,因此应用程序将不能正确工作。类</FONT><FONT SIZE=3>CDC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的成员函数</FONT><FONT SIZE=3>GetPixel</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>返回一个</FONT><FONT SIZE=3>COLORREF</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>值以指示位于指定坐标的点的颜色值。成员函数</FONT><FONT SIZE=3>SetPixelV</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>将位于指定坐标的点的颜色设置为新的值,另一个成员函数</FONT><FONT SIZE=3>SetPixel</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>可以完成同样的功能,并且更常用。但是,与成员函数</FONT><FONT SIZE=3>SetPixel</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>不同,</FONT><FONT SIZE=3>SetPixelV</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>不需要返回设置的实际颜色值,因此它要比</FONT><FONT SIZE=3>SetPixel</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>快。尽管如此,上面的程序仍只能作为一个示例程序出现,因为这种一个点一个点的描绘的方法实在是太慢,在作者的具有</FONT><FONT SIZE=3>64M</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>内存和</FONT><FONT SIZE=3>K6/200</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的</FONT><FONT SIZE=3>CPU</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的计算机上,更新一个常规大小的窗口的标题条的颜色需要大约</FONT><FONT SIZE=3>0.3</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>秒的时间,在这样长的时间段内,用户还是可以清楚的看到标题条一点一点绘制的过程。提高应用程序的绘制速度的一种方案是使用位图来内存中对位图进行变换和处理,然而再使用位图来更新标题条。由于位图的绘制速度要比一个点一个点的描快得多,从而有可能大幅度的提高标题条的重绘速度,但是这种算法要使用到我们在这里不打算深入讲述的一些概念和技巧,为了便于理解,我们还是采用了上面给出的算法。</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">下面要做的事是处理两个重要的非客户区消息,</FONT><FONT SIZE=3>WM_NCPAINT</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>和</FONT><FONT SIZE=3>WM_NCACTIVATE</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。第一个消息</FONT><FONT SIZE=3>WM_NCPAINT</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>在非客户区的全部或一部分需要重绘时由操作系统发送。如果试图给窗口绘制特殊的边框或标题条,处理这个消息是必要的。</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>在</FONT><FONT SIZE=3>CWnd</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中定义了该消息的默认处理函数</FONT><FONT SIZE=3>OnNcPaint</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,该成员函数对</FONT><FONT SIZE=3>WM_NCPAINT</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的默认处理绘制了窗口的正常边框。我们在类</FONT><FONT SIZE=3>CMyWnd</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中重载了该成员函数。由于我们只是绘制了窗口的标题条,因此在此之前有必要调用一下基类中的默认实现绘制窗口的边框。然后,通过判断由</FONT><FONT SIZE=3>API</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数</FONT><FONT SIZE=3>GetActiveWindow</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>返回的窗口句柄</FONT><FONT SIZE=3>(</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>它代表了当前激活窗口</FONT><FONT SIZE=3>)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>和当前窗口的句柄是否相等来以不同的参数调用</FONT><FONT SIZE=3>PaintTitleBar</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>成员函数来绘制窗口处于激活状态和非激活状态的标题条。</P>
<P ALIGN="JUSTIFY">另一个必须考虑的事件是当窗口的激活状态发生改变时正确绘制窗口的标题条以反映窗口的新的激活状态。这时窗口将会收到</FONT><FONT SIZE=3>WM_NCACTIVATE</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>消息,该消息所带的参数给出了窗口新的激活状态。</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>在</FONT><FONT SIZE=3>CWnd</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中定义了该消息的默认处理函数</FONT><FONT SIZE=3>OnNcActivate</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。我们在类</FONT><FONT SIZE=3>CMyWnd</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中重载了该成员函数。该函数根据窗口新的激活状态调用了</FONT><FONT SIZE=3>PaintTitleBar</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>来绘制新的窗口标题条以反映激活状态的改变。</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">整个应用程序使用了典型的</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的结构,代码也比较简单和清晰,这里我们就不多作的介绍了。你可以根据上面的源代码清单和本书前面章节中讲述的内容来完成该应用程序。</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">完成上面的步骤之后我们就可以编译并试运行该应用程序了。在编译之前我们需要做一些额外的工作:</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">1.	</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>单击</FONT><FONT SIZE=3>Project</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>菜单下的</FONT><FONT SIZE=3>Settings</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>命令或按下快捷键</FONT><FONT SIZE=3>Alt+F7</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,打开如图</FONT><FONT SIZE=3>9.1</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>所示的工程设置对话框。</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER"><IMG SRC="Image312.gif" tppabs="http://166.111.167.223/computer/cai/visual_c++_5.0_programming/Image312.gif" WIDTH=440 HEIGHT=289></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER">图</FONT><FONT SIZE=1>9. 1 </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>设置应用程序的工程属性</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">2.	</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>在</FONT><FONT SIZE=3>General</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>选项卡中的</FONT><FONT SIZE=3>Microsoft Foundation Classes</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>下拉列表框中选择</FONT><FONT SIZE=3>Use MFC in a Shared DLL</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>或</FONT><FONT SIZE=3>Use MFC in a Static Library (</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>仅适用于</FONT><FONT SIZE=3>Visual C++ 5.0</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的专业版和企业版</FONT><FONT SIZE=3>)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。你需要对应用程序的调试版本和发行版本各重复一次上面的设置过程。如果忽略此步设置的话,在链接应用程序的过程中会出现错误。</P>
<P ALIGN="JUSTIFY">现在就可以编译并运行上面的程序了。其运行结果如图</FONT><FONT SIZE=3>9.2</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>所示。</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER"><IMG SRC="Image313.gif" tppabs="http://166.111.167.223/computer/cai/visual_c++_5.0_programming/Image313.gif" WIDTH=390 HEIGHT=267></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER">图</FONT><FONT SIZE=1>9. 2 </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>具有五彩标题条的窗口</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">上面的程序还有其它的一些局限性。比如当窗口处于非激状态时,如果使用鼠标在窗口上移动其它窗口,窗口的标题条将会变成标准的灰色;还有,如果应用程序通过调用。要完善这些功能需要考虑更多的问题和处理更多的消息。这并不是本书在这里引入上面的示例程序的目的,我们只是为了演示一下</FONT><FONT SIZE=3>CWindowDC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>对象的使用,而不是编写一个功能完善的应用程序。当然,你可以使用更好和更完善的方法来实现该应用程序并将它用于你的其它应用程序。一个特殊的标题条常常会给程序带来一些吸引人的东西,但是过分花哨的用户界面可能会使用户感到不适应甚至招至用户的反感。</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">使用</FONT><FONT SIZE=3>CClientDC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的应用程序与此类似,只不过我们通常在一些需要直接在窗口的客户区进行绘制的场合创建和使用该设置上下文对象。比如在一些使用鼠标绘图的应用程序中,当用户在客户区中单击鼠标时,我们通常需要直接在客户区中绘制出相应的图形,而不必等到</FONT><FONT SIZE=3>WM_PAINT</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>消息发送。对于这样的应用程序,我们一般在鼠标的移动和单击事件的处理函数中创建类型为</FONT><FONT SIZE=3>CClientDC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的设置上下文对象,并通过该设备上下文对象进行绘制。如果使用了</FONT><FONT SIZE=3>AppWizard</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>来生成</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>应用程序的话,我们一般使用</FONT><FONT SIZE=3>ClassWizard</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>来完成添加这些消息处理成员函数和相应的消息映射项。</P>
<P ALIGN="JUSTIFY">如前所述,在</FONT><FONT SIZE=3>WM_PAINT</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>消息的处理函数中,我们一般不使用</FONT><FONT SIZE=3>CClientDC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>对象,而应该使用</FONT><FONT SIZE=3>CPaintDC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>对象。</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">在下面的小节中,我们将讲述</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中的</FONT><FONT SIZE=3>GDI</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>绘图对象类的使用。</P>
</FONT><FONT FACE="仿宋_GB2312" LANG="ZH-CN" SIZE=4><P ALIGN="CENTER"><A NAME="_Toc425698470">第二节</FONT><FONT SIZE=4> </FONT><FONT FACE="仿宋_GB2312" LANG="ZH-CN" SIZE=4>画笔对象</A></P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>类</FONT><FONT SIZE=3>CPen</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>封装了</FONT><FONT SIZE=3>GDI</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中的画笔对象,画笔对象代表了进行绘制时所用的线条。我们一般通过两个步骤来创建画笔对象:首先构造一个</FONT><FONT SIZE=3>CPen</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>对象,再调用对象的</FONT><FONT SIZE=3>CreatePen</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>成员函数。成员函数</FONT><FONT SIZE=3>CreatePen</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>按指定的样式、宽度等属性创建一个逻辑画笔,然后将该画笔与</FONT><FONT SIZE=3>CPen</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>对象相关联。</P>
</FONT><FONT FACE="Arial"><P>9.2.1 </FONT><FONT FACE="黑体" LANG="ZH-CN">创建画笔</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">成员函数</FONT><FONT SIZE=3>CreatePen</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>有两种形式。第一种形式的如下:</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>BOOL CreatePen( int nPenStyle, int nWidth, COLORREF crColor );</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">参数</FONT><FONT SIZE=3>nPenStyle</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>代表了画笔的样式,可以为下列值之一:</P></FONT>
<P ALIGN="RIGHT"><TABLE CELLSPACING=0 BORDER=0 CELLPADDING=7 WIDTH=538>
<TR><TD WIDTH="27%" VALIGN="TOP">
<FONT SIZE=3><P ALIGN="JUSTIFY">PS_SOLID</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:</FONT></TD>
<TD WIDTH="73%" VALIGN="TOP">
<FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">创建一个实线画笔</FONT></TD>
</TR>
<TR><TD WIDTH="27%" VALIGN="TOP">
<FONT SIZE=3><P ALIGN="JUSTIFY">PS_DASH</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:</FONT></TD>
<TD WIDTH="73%" VALIGN="TOP">
<FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">创建一个虚线画笔。一个虚线画笔的宽度不能超过一个设备单位。</FONT></TD>
</TR>
<TR><TD WIDTH="27%" VALIGN="TOP">
<FONT SIZE=3><P ALIGN="JUSTIFY">PS_DOT</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:</FONT></TD>
<TD WIDTH="73%" VALIGN="TOP">
<FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">创建一个点线画笔。一个点划线画笔的宽度不能超过一个设备单位。</FONT></TD>
</TR>
<TR><TD WIDTH="27%" VALIGN="TOP">
<FONT SIZE=3><P ALIGN="JUSTIFY">PS_DASHDOT</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:</FONT></TD>
<TD WIDTH="73%" VALIGN="TOP">
<FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">创建一个点划线画笔。同样,这种样式的画笔宽度也不能超过一个设备单位。</FONT></TD>
</TR>
<TR><TD WIDTH="27%" VALIGN="TOP">
<FONT SIZE=3><P ALIGN="JUSTIFY">PS_DASHDOTDOT</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:</FONT></TD>
<TD WIDTH="73%" VALIGN="TOP">
<FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">创建一个双点划线画笔。这种样式的画笔宽度也不能超过一个设备单位</FONT></TD>
</TR>
<TR><TD WIDTH="27%" VALIGN="TOP">
<FONT SIZE=3><P ALIGN="JUSTIFY">PS_NULL</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:</FONT></TD>
<TD WIDTH="73%" VALIGN="TOP">
<FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">创建一个空画笔</FONT></TD>
</TR>
<TR><TD WIDTH="27%" VALIGN="TOP">
<FONT SIZE=3><P ALIGN="JUSTIFY">PS_INSIDEFRAME</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:</FONT></TD>
<TD WIDTH="73%" VALIGN="TOP">
<FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">对于那些指定一个边界矩形的</FONT><FONT SIZE=3>GDI</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>输出函数,具有这种样式的画笔将线条绘制到输出形状框架的内侧。而对于那些没有指定边界矩形的</FONT><FONT SIZE=3>GDI</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>输出函数,这种画笔的绘制区域则不受框架的限制。</FONT></TD>
</TR>
</TABLE>
</P>
<FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">参数</FONT><FONT SIZE=3>nWidth</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>以逻辑单位给出画笔的宽度。如果参数</FONT><FONT SIZE=3>nWidth</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>为零,则无论当前使用何种映射模式,所创建和画笔的宽度都为一个象素。参数</FONT><FONT SIZE=3>crColor</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>为画笔的颜色,这里可以使用</FONT><FONT SIZE=3>RGB</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>宏来生成合适的颜色值。</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">另一种形式的</FONT><FONT SIZE=3>CreatePen</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数使用如下的参数:</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>BOOL CreatePen( int nPenStyle, int nWidth, const LOGBRUSH* pLogBrush, </P>
<P>	int nStyleCount = 0, const DWORD* lpStyle = NULL );</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">这种形式的</FONT><FONT SIZE=3>CreatePen</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>可以创建一个具有指定的宽度、样式和刷子属性的逻辑修饰</FONT><FONT SIZE=3>(cosmetic)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>或几何</FONT><FONT SIZE=3>(geometric)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>画笔。参数</FONT><FONT SIZE=3>nPenStyle</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>指定了画笔的样式,它可以为</FONT><FON
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -