⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chap43.htm

📁 经典的C入门教程,想学习VC的朋友们可以看一下
💻 HTM
字号:
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
<title>讯息使用范例二 在程式中使用材质背景</title>
<link rel="stylesheet" href="../../../include/style.css">
</head>

<body>
<font SIZE="2">

<p><small><a href="../../../index.htm">首页</a> &gt;&gt; <a href="../../program.htm">程序设计</a> 
  &gt;&gt; <a href="../cbuilder.htm">C++ Builder</a>&nbsp; &gt;&gt;&nbsp; </small>讯息使用范例二 
  在程式中使用材质背景<br>
</p>

<p align="left"><!--webbot bot="ImageMap" rectangle=" (40,1) (71, 23)  ../ch5/chap05.htm" rectangle=" (4,1) (36, 23)  chap42.htm" src="../ch1/NextBack.gif" width="72" height="24" alt="NextBack.gif (743字节)" border="0" startspan --><MAP NAME="FrontPageMap"><AREA SHAPE="RECT" COORDS="40, 1, 71, 23" HREF="../ch5/chap05.htm"><AREA SHAPE="RECT" COORDS="4, 1, 36, 23" HREF="chap42.htm"></MAP><a href="../../../_vti_bin/shtml.exe/program/C++/ch4/chap43.htm/map"><img ismap usemap="#FrontPageMap" border="0" height="24" alt="NextBack.gif (743字节)" src="../ch1/NextBack.gif" width="72"></a><!--webbot bot="ImageMap" endspan i-checksum="41821" --></p>
</font>

<p align="left"><font SIZE="2" color="#FF0000">讯息使用范例二 
在程式中使用材质背景</font></p>

<p><font SIZE="2">许多人在使用网际网路浏览器如Internet Explorer、Netscape上网站时,会发现许多网页上普遍使用了材质图案做为背景,大大加强了它的视觉效果,也使用网页看起来更为美仑美奂,这时也许你会想:这个材质背景是如何做出来的呢? 
</font></p>

<p><font SIZE="2">在以下的文章中,我会示范如何利用C++Builder做出上述的材质背景效果,让你的程式也可以做出如Browser般的效果。此程式的执行效果如图叁 
</font></p>

<p><img SRC="IMG00003.GIF" WIDTH="319" HEIGHT="280"> </p>

<p><font SIZE="2">图叁 具有材质片背景的Form<br>
</font></p>

<p><font SIZE="2">WM_ERASEBKGND讯息说明</font></p>

<p><font SIZE="2">WM_ERASEBGGN是在Windows背景将要被清除时,所触发的讯息。在此讯息发生时,会传入要清除的Windows的HDC 
( 还记这个SDK中用来绘图的重要角色吧?)。因此我们可以取得此HDC,然後将Canvas的Handle值设为该值,如此便可以在Canvas上作画了。</font> 
</p>

<p><font SIZE="2">宣告使用WM_ERASEGKGN</font></p>

<p><font SIZE="2">class TForm1 : public TForm</font> </p>

<p><font SIZE="2">{</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp; __published: // IDE-managed Components</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp; TPanel *Panel1;</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp; private: // User declarations</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp; public: // User declarations</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp; __fastcall TForm1(TComponent* Owner);</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp; void virtual __fastcall 
OnWMEraseBkgnd(TWMEraseBkgnd&amp; Msg);</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp; BEGIN_MESSAGE_MAP</font> </p>

<p><font SIZE="2"> 
&nbsp;&nbsp;&nbsp; MESSAGE_HANDLER(WM_ERASEBKGND,TWMEraseBkgnd,OnWMEraseBkgnd)</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp; END_MESSAGE_MAP(TForm)</font> </p>

<p><font SIZE="2">};</font></p>

<p><font SIZE="2">为了要拦截WM_ERASEBMGN讯息,因此我们必须利用前面谈过的巨集来宣告之,在此我们采用C++Builder为WM_ERASEBKGND定义的TWMEraseBkgnd讯息结构做为参数,同时定义了一个讯息处理函数 
OnWMEraseGkgnd。当然,它所传入的讯息参数是前述的TWMEraseBkgnd&amp;。 </font></p>

<p><font SIZE="2" color="#FF0000">以材质图案填满画面</font></p>

<p><font SIZE="2">在完成了讯息处理函数的定义之後,再来我们就必须撰写实际的程式码。为了在所传入的HDC中做画,我们必须new一个 
Canvas,然後自TWMEraseBkgnd中取得HDC的值。</font></p>

<p><font SIZE="2">接着为了要将材质背景载入,我们必须new一个Graphics::TBitmap 
(在这里加上Graphics:: 是因为尚有另一种Tbitmap ,是位於Windows的namespace中的,因此必须以Graphics:: 
来区别它的名称空间)。然後,我们就可以利用LoadFromFile将材质背景图案载入。 
</font></p>

<p><font SIZE="2">在完成了以上两个必要的准备动作之後,我们就可以正式将材质背景画在Canvas上面了,首先当然要计算所画的次数,然後利用回圈以Canvas的Draw指令,将它填满整个萤幕。最後不要忘了将new产生的物件,以delete删除之。以下为其程式列表: 
</font></p>

<p><font SIZE="2">void __fastcall TForm1::OnWMEraseBkgnd(TWMEraseBkgnd&amp; Msg)</font> </p>

<p><font SIZE="2">{</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp; TCanvas* canvas = new TCanvas;</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp; Graphics::TBitmap* bitmap = new Graphics::TBitmap;</font> 
</p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp; bitmap-&gt;LoadFromFile(&quot;back.bmp&quot;);</font> 
</p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp; canvas-&gt;Handle = Msg.DC;</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp; int cx = ClientWidth/bitmap-&gt;Width + 1;</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp; int cy = ClientHeight/bitmap-&gt;Height + 1;</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp; for (int i=0; i&lt;cy; i++)</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int j=0; j&lt;cx; j++)</font> 
</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <small>{</small></p>

<p><font SIZE="2"> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; canvas-&gt;Draw(j*bitmap-&gt;Height,i*bitmap-&gt;Width,bitmap);</font> 
</p>

<p><font SIZE="2"> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Msg.Result = true;</font> 
</p>

<p><font SIZE="2"> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delete bitmap;</font> </p>

<p><font SIZE="2"> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delete canvas;</font> </p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <small>}</small></p>

<p><font SIZE="2">}</font></p>

<p><font SIZE="2">怎麽样?不错吧!其实只要多多充实关於Windows讯息的知识,虽然在C++Builder中直接使用Windows讯息的机会并不多,但是在某些时候,它却可以发挥小兵立大功的效果,在像本节所举的例子一般。</font> 
</p>

<p><font SIZE="2" color="#FF0000">结论</font></p>

<p><font SIZE="2">在本文中我为你示范了在C++Builder中处理讯息的方法,同时以一个实际的自定标题棒视窗及材质背景图为范例,仔细说明了其中之技巧。除此之外,在Windows系统中,讯息(Message)是无所不在的,它是许多传统的视窗元件用以互相沟通的元件,因此除非你能保证你永远不会使用到别的标准元件,否则你就必须具备讯息处理的能力。所以说,了解Windows讯息是你不可或缺的技巧,唯有如此,你才能『百尺竿头,更进一步』,不会被RAD给局限住。 
</font></p>

<p align="right"><font SIZE="2"><!--webbot bot="ImageMap" rectangle=" (40,1) (71, 23)  ../ch5/chap05.htm" rectangle=" (4,1) (36, 23)  chap42.htm" src="../ch1/NextBack.gif" width="72" height="24" alt="NextBack.gif (743字节)" border="0" startspan --><MAP NAME="FrontPageMap1"><AREA SHAPE="RECT" COORDS="40, 1, 71, 23" HREF="../ch5/chap05.htm"><AREA SHAPE="RECT" COORDS="4, 1, 36, 23" HREF="chap42.htm"></MAP><a href="../../../_vti_bin/shtml.exe/program/C++/ch4/chap43.htm/map1"><img ismap usemap="#FrontPageMap1" border="0" height="24" alt="NextBack.gif (743字节)" src="../ch1/NextBack.gif" width="72"></a><!--webbot bot="ImageMap" endspan i-checksum="14960" --></font></p>

<p><font SIZE="2"><small><a href="../../../index.htm">首页</a> &gt;&gt; <a href="../../program.htm">程序设计</a> 
  &gt;&gt; <a href="../cbuilder.htm">C++ Builder</a>&nbsp; &gt;&gt;&nbsp; </small>讯息使用范例二 
  在程式中使用材质背景</font></p>
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -