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

📄 00000003.htm

📁 水木清华关于C++Builder程序的代码
💻 HTM
📖 第 1 页 / 共 2 页
字号:
RECT&nbsp;rc;&nbsp;&nbsp;<BR>∶<I>:SetRect(&amp;rc,0,0,ClientWidth,ClientHeight);&nbsp;&nbsp;</I><BR>DrawButtonFace(Canvas,rc,1);&nbsp;&nbsp;<BR>Canvas-&gt;Pen-&gt;Color=clGreen;&nbsp;&nbsp;<BR>Canvas-&gt;Brush-&gt;Color=clGreen;&nbsp;&nbsp;<BR>Canvas-&gt;Rectangle(0,0,20,ClientHeight);&nbsp;&nbsp;<BR>∶<I>//&nbsp;以下略去&nbsp;&nbsp;</I><BR>∶<I>&nbsp;&nbsp;</I><BR>}&nbsp;<BR>&nbsp;<BR>你可以看到,我们画出一个宽为20,颜色为绿色的标题棒。因此我们&nbsp;<BR>处理WM_NCHITTEST讯息的处理函式也必须做相对应的修改:&nbsp;&nbsp;<BR>&nbsp;<BR>void&nbsp;__fastcall&nbsp;TForm1::OnNcHitTest(TMessage&amp;&nbsp;Msg)&nbsp;&nbsp;<BR>{&nbsp;&nbsp;<BR>TPoint&nbsp;pt;&nbsp;&nbsp;<BR>pt.x=LOWORD(Msg.LParam);&nbsp;&nbsp;<BR>pt.y=HIWORD(Msg.LParam);&nbsp;&nbsp;<BR>pt&nbsp;=ScreenToClient(pt);&nbsp;&nbsp;<BR>RECT&nbsp;rc;&nbsp;&nbsp;<BR>∶<I>:SetRect(&amp;rc,0,0,20,ClientHeight);&nbsp;&nbsp;</I><BR>if&nbsp;(PtInRect(&amp;rc,pt))&nbsp;&nbsp;<BR>Msg.Result&nbsp;=&nbsp;HTCAPTION;&nbsp;&nbsp;<BR>else&nbsp;&nbsp;<BR>DefaultHandler(&amp;Msg);&nbsp;&nbsp;<BR>}&nbsp;<BR>&nbsp;<BR>OnNcHitTest函式首先取得目前滑鼠所在点,注意,WM_NCHITTEST讯&nbsp;<BR>息所传入的点为相对於萤幕的绝对座标,因此在取得该点後必须利用&nbsp;<BR>ScreenToClient函数将它转为TForm的相对座标值,然後再据以判断&nbsp;<BR>是否落於我们所定义的标题棒范围内,若是则传回HTCAPTION值,否&nbsp;<BR>则就交由内定的处理函式DefaultHandler来处理。如此就完成了一个&nbsp;<BR>位於左方的标题棒了。&nbsp;&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>旋转文字的输出&nbsp;<BR>&nbsp;<BR>仔细观察图一,你会发现它所使用的标题字元的方向,已经因应标题&nbsp;<BR>棒的转向而成为90旋转的文字,这是如何达成的呢?&nbsp;&nbsp;<BR>&nbsp;<BR>其实说穿了没什麽,只是利用传统SDK的绘图方法来画出来的。因为&nbsp;<BR>在C++Builder的TFont物件并没有定义文字旋转的属性,所以我们只&nbsp;<BR>好透过传统的GDI绘图方法来达成这个目标。&nbsp;&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>char*&nbsp;msg=Caption.c_str();&nbsp;&nbsp;<BR>LOGFONT&nbsp;fontRec;&nbsp;&nbsp;<BR>memset(&amp;fontRec,0,sizeof(LOGFONT));&nbsp;&nbsp;<BR>fontRec.lfHeight&nbsp;=&nbsp;-13;&nbsp;&nbsp;<BR>fontRec.lfWeight&nbsp;=&nbsp;FW_NORMAL;&nbsp;&nbsp;<BR>fontRec.lfEscapement&nbsp;=&nbsp;900;&nbsp;//&nbsp;旋转文字的关键&nbsp;&nbsp;<BR>lstrcpy(fontRec.lfFaceName,&quot;细明体&quot;);&nbsp;&nbsp;<BR>HFONT&nbsp;hFont=CreateFontIndirect(&amp;fontRec);&nbsp;&nbsp;<BR>HFONT&nbsp;hOld=::SelectObject(Canvas-&gt;Handle,hFont);&nbsp;&nbsp;<BR>∶<I>:SetRect(&amp;rc,0,0,20,ClientHeight);&nbsp;&nbsp;</I><BR>∶<I>:SetTextColor(Canvas-&gt;Handle,RGB(255,255,255));&nbsp;&nbsp;</I><BR>∶<I>:TextOut(Canvas-&gt;Handle,3,ClientHeight-3,msg,lstrlen(msg));&nbsp;&nbsp;</I><BR>∶<I>:SelectObject(Canvas-&gt;Handle,hOld);&nbsp;&nbsp;</I><BR>∶<I>:DeleteObject(hFont);&nbsp;</I><BR>&nbsp;<BR>以上的程式我不打算详加说明,简单地说,它就是建立一个旋转90度&nbsp;<BR>的字形,然後将字串以此字形画於萤幕上,此段程式码的关键在於你&nbsp;<BR>必须知道Canvas-&gt;Handle即是代表GDI绘图的HDC。其馀的函式说明&nbsp;<BR>你都可以在一般讲解传统Windows&nbsp;&nbsp;<BR>SDK绘图的书籍中找到。&nbsp;<BR>&nbsp;<BR>由此我们也可以得到一个经验:虽然C++Builder的快速程式发展环境&nbsp;<BR>已经取代了传统SDK式的程式设计中大部份的工作,然而通晓一些必&nbsp;<BR>要的SDK程式技巧却可以使你上一层楼。所以我建议你在『行有馀力』&nbsp;<BR>时,不妨可以看看SDK相关书籍,充实基础知识。或许我们可以名之&nbsp;<BR>为『立足&nbsp;&nbsp;<BR>BCB,放眼&nbsp;SDK』的学习态度吧!&nbsp;<BR>&nbsp;<BR>其他说明&nbsp;<BR>&nbsp;<BR>在本程式中因为TForm的BorderStyle性质为bsNone。因此并没有外&nbsp;<BR>框,为了美化视窗,所以我写了几个辅助函式来绘出立体框。若你在&nbsp;<BR>其他程式中有类似的需求,也可以使用之。&nbsp;&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>void&nbsp;DoRect(TCanvas*&nbsp;Canvas,RECT&amp;&nbsp;rect,COLORREF&nbsp;&nbsp;<BR>cTopColor,COLORREF&nbsp;cBottomColor)&nbsp;&nbsp;<BR>&nbsp;<BR>{&nbsp;&nbsp;<BR>POINT&nbsp;p[3];&nbsp;&nbsp;<BR>p[0].x&nbsp;=&nbsp;rect.right;&nbsp;&nbsp;<BR>p[0].y&nbsp;=&nbsp;rect.top;&nbsp;&nbsp;<BR>p[1].x&nbsp;=&nbsp;rect.left;&nbsp;&nbsp;<BR>p[1].y&nbsp;=&nbsp;rect.top;&nbsp;&nbsp;<BR>p[2].x&nbsp;=&nbsp;rect.left;&nbsp;&nbsp;<BR>p[2].y&nbsp;=&nbsp;rect.bottom;&nbsp;&nbsp;<BR>Canvas-&gt;Pen-&gt;Color=TColor(cTopColor);&nbsp;&nbsp;<BR>Canvas-&gt;Polyline(p,3);&nbsp;&nbsp;<BR>p[1].x&nbsp;=&nbsp;rect.right;&nbsp;&nbsp;<BR>p[1].y&nbsp;=&nbsp;rect.bottom;&nbsp;&nbsp;<BR>p[2].x--;&nbsp;&nbsp;<BR>Canvas-&gt;Pen-&gt;Color=TColor(cBottomColor);&nbsp;&nbsp;<BR>Canvas-&gt;Polyline(p,3);&nbsp;&nbsp;<BR>}&nbsp;<BR>&nbsp;<BR>void&nbsp;Frame3D(TCanvas*&nbsp;Canvas,RECT&amp;&nbsp;rect,COLORREF&nbsp;&nbsp;<BR>cTopColor,COLORREF&nbsp;&nbsp;<BR>cBottomColor,int&nbsp;iColWidth)&nbsp;&nbsp;<BR>{&nbsp;&nbsp;<BR>rect.bottom--;&nbsp;rect.right--;&nbsp;&nbsp;<BR>while&nbsp;(iColWidth&nbsp;&gt;&nbsp;0)&nbsp;&nbsp;<BR>{&nbsp;&nbsp;<BR>iColWidth--;&nbsp;&nbsp;<BR>DoRect(Canvas,rect,cTopColor,cBottomColor);&nbsp;&nbsp;<BR>InflateRect(&amp;rect,-1,-1);&nbsp;&nbsp;<BR>}&nbsp;&nbsp;<BR>rect.bottom++;&nbsp;rect.right++;&nbsp;&nbsp;<BR>}&nbsp;<BR>&nbsp;<BR>void&nbsp;DrawButtonFace(TCanvas*&nbsp;Canvas,RECT&amp;&nbsp;rect,int&nbsp;nBevelWidth)&nbsp;&nbsp;<BR>{&nbsp;&nbsp;<BR>Canvas-&gt;Brush-&gt;Color=clBtnFace;&nbsp;&nbsp;<BR>Canvas-&gt;FillRect(TRect(rect));&nbsp;&nbsp;<BR>Frame3D(Canvas,rect,::GetSysColor(COLOR_BTNSHADOW),::GetSysCo&nbsp;<BR>lor(COLOR_WINDOWFRAME),nBevelWidth);&nbsp;&nbsp;<BR>&nbsp;<BR>Frame3D(Canvas,rect,::GetSysColor(COLOR_BTNHIGHLIGHT),::GetSy&nbsp;<BR>sColor(COLOR_BTNSHADOW),nBevelWidth);&nbsp;&nbsp;<BR>&nbsp;<BR>}&nbsp;<BR>&nbsp;<BR>这三个函式中最重要的就是&nbsp;&nbsp;<BR>DrawButtonFace,它是用来在一个矩形范围中画出一个类似Button的&nbsp;<BR>立体方框,在本程式中我用它来画出TForm的边框。你可以由图一看&nbsp;<BR>出它的视觉效果。&nbsp;&nbsp;<BR>&nbsp;<BR>程式的改进&nbsp;<BR>&nbsp;<BR>前面我们提到改进bsNone视窗视觉效果的方式是利用自行撰写的&nbsp;<BR>DrawButtonFace函式来达成,它虽不失为一个解决问题的方法,但是&nbsp;<BR>却也因此增加了程式的复杂度,再来我为你示范一种利用改写&nbsp;<BR>CreateParams函式的技巧来达成类似功能的方法。&nbsp;&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>CreateParams是一个虚拟函式,你可以经由它来修改windows的&nbsp;<BR>style,因为原先在C++Builder中所定义的Form是一个Dialog(交谈&nbsp;<BR>窗),而交谈窗的外形内定是有标题棒的,然而如果我们如前面的方法&nbsp;<BR>将外框设为bsNone&nbsp;&nbsp;<BR>的话,那就必须自行画出假的视窗外框,否则看起来不好看。&nbsp;<BR>&nbsp;<BR>但是在Windows系统中除了前面的Dialog式的视窗之外,还提供了另&nbsp;<BR>一种POPUP式的视窗,只不过在C++Builder并未提供该选项罢了。因&nbsp;<BR>此我们其实可以透过改写CreateParams的方式来产生WS_POPUP形式&nbsp;<BR>的视窗,如此一来我们就不必煞费周章地撰写画外框的函式了。它的&nbsp;<BR>程式其实很简单,只是将Params.Style的WS_DLGFRAME&nbsp;&nbsp;<BR>(代表使用Dialog外框),改成另一种WS_POPUP&nbsp;(弹出式视窗)。要&nbsp;<BR>做到以上效果,只要利用and及or运算就可以达到了。以下即为其程&nbsp;<BR>式码:&nbsp;&nbsp;<BR>&nbsp;<BR>void&nbsp;__fastcall&nbsp;TForm1::CreateParams(TCreateParams&amp;&nbsp;Params)&nbsp;&nbsp;<BR>{&nbsp;&nbsp;<BR>TForm::CreateParams(Params);&nbsp;&nbsp;<BR>Params.Style&nbsp;|=&nbsp;WS_POPUP;&nbsp;&nbsp;<BR>Params.Style&nbsp;^=&nbsp;WS_DLGFRAME;&nbsp;&nbsp;<BR>}&nbsp;<BR>&nbsp;<BR>图二为改写後的程式执行结果,不仅程式简洁了许多,而且外观也较&nbsp;<BR>好看,那是因为我们在画标题棒时,不会像前面一样将外框盖住的缘&nbsp;<BR>故。&nbsp;&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;<BR>图二&nbsp;利用CreateParams技巧的新程式。&nbsp;<BR>&nbsp;<BR>讯息使用范例二&nbsp;在程式中使用材质背景&nbsp;<BR>&nbsp;<BR>许多人在使用网际网路浏览器如Internet&nbsp;&nbsp;<BR>Explorer、Netscape上网站时,会发现许多网页上普遍使用了材质图&nbsp;<BR>案做为背景,大大加强了它的视觉效果,也使用网页看起来更为美仑&nbsp;<BR>美奂,这时也许你会想:这个材质背景是如何做出来的呢?&nbsp;&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>在以下的文章中,我会示范如何利用C++Builder做出上述的材质背景&nbsp;<BR>效果,让你的程式也可以做出如Browser般的效果。此程式的执行效&nbsp;<BR>果如图三&nbsp;&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;<BR>图三&nbsp;具有材质片背景的Form&nbsp;<BR>&nbsp;<BR>WM_ERASEBKGND讯息说明&nbsp;<BR>&nbsp;<BR>WM_ERASEBGGN是在Windows背景将要被清除时,所触发的讯息。在此&nbsp;<BR>讯息发生时,会传入要清除的Windows的HDC&nbsp;(&nbsp;&nbsp;<BR>还记这个SDK中用来绘图的重要角色吧?)。因此我们可以取得此HDC,&nbsp;<BR>然後将Canvas的Handle值设为该值,如此便可以在Canvas上作画了。&nbsp;&nbsp;<BR>宣告使用WM_ERASEGKGN&nbsp;<BR>&nbsp;<BR>class&nbsp;TForm1&nbsp;:&nbsp;public&nbsp;TForm&nbsp;&nbsp;<BR>{&nbsp;&nbsp;<BR>__published:&nbsp;//&nbsp;IDE-managed&nbsp;Components&nbsp;&nbsp;<BR>TPanel&nbsp;*Panel1;&nbsp;&nbsp;<BR>private:&nbsp;//&nbsp;User&nbsp;declarations&nbsp;&nbsp;<BR>public:&nbsp;//&nbsp;User&nbsp;declarations&nbsp;&nbsp;<BR>__fastcall&nbsp;TForm1(TComponent*&nbsp;Owner);&nbsp;&nbsp;<BR>void&nbsp;virtual&nbsp;__fastcall&nbsp;OnWMEraseBkgnd(TWMEraseBkgnd&amp;&nbsp;Msg);&nbsp;&nbsp;<BR>BEGIN_MESSAGE_MAP&nbsp;&nbsp;<BR>MESSAGE_HANDLER(WM_ERASEBKGND,TWMEraseBkgnd,OnWMEraseBkgnd)&nbsp;&nbsp;<BR>END_MESSAGE_MAP(TForm)&nbsp;&nbsp;<BR>};&nbsp;<BR>&nbsp;<BR>为了要拦截WM_ERASEBMGN讯息,因此我们必须利用前面谈过的巨集来&nbsp;<BR>宣告之,在此我们采用C++Builder为WM_ERASEBKGND定义的&nbsp;<BR>TWMEraseBkgnd讯息结构做为叁数,同时定义了一个讯息处理函数&nbsp;&nbsp;<BR>OnWMEraseGkgnd。当然,它所传入的讯息叁数是前述的&nbsp;<BR>TWMEraseBkgnd&amp;。&nbsp;&nbsp;<BR>&nbsp;<BR>以材质图案填满画面&nbsp;<BR>&nbsp;<BR>在完成了讯息处理函数的定义之後,再来我们就必须撰写实际的程式&nbsp;<BR>码。为了在所传入的HDC中做画,我们必须new一个&nbsp;&nbsp;<BR>Canvas,然後自TWMEraseBkgnd中取得HDC的值。&nbsp;<BR>&nbsp;<BR>接着为了要将材质背景载入,我们必须new一个Graphics::TBitmap&nbsp;(在&nbsp;<BR>这里加上Graphics::&nbsp;是因为尚有另一种Tbitmap&nbsp;&nbsp;<BR>,是位於Windows的namespace中的,因此必须以Graphics::&nbsp;&nbsp;<BR>来区别它的名称空间)。然後,我们就可以利用LoadFromFile将材质&nbsp;<BR>背景图案载入。&nbsp;&nbsp;<BR>&nbsp;<BR>在完成了以上两个必要的准备动作之後,我们就可以正式将材质背景&nbsp;<BR>画在Canvas上面了,首先当然要计算所画的次数,然後利用

⌨️ 快捷键说明

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