大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> 程序开发 -> 用VC++实现自绘按钮控制

用VC++实现自绘按钮控制

时间: 2021-07-31 作者:daque

四川 曾 志microsoft windows以其充分普遍的图形用户界面,大略精巧的操纵,被宏大用户所接收。对话框即是个中一个特殊要害的界面情势,而且windows为其运用步调的开拓者供给了十分充分的界面资源,很多遏制不妨简单地介入对话框中。但当咱们须要编写一个贸易运用,须要一个更和睦的图形用户界面时,就会创造资源的单薄。visual c++供给了一个cbitmap button类在确定步调上缓和了减少新资源的诉求。但当咱们诉求在步调中能动静地变换图形时,咱们就不得不商量停止cbitmapbutton类,而坐下来本人做一点处事了。一个可行的方法即是重载cbutton类(即按钮遏制)。如许对这块地区的巨细、场所和id号都不妨经过appstadio简单地创造。固然如许作最大的长处仍旧在乎充溢运用c++的个性把绘制遏制的代码封装了起来,既制止了反复性开拓,又使步调变得更简略,巩固了代码的可读性。此刻咱们就经过创造一个名叫ccolorbutton的类来进修这种本领。固然这是一个功效特殊大略的类,经过挪用分子因变量changecolor可变换其脸色,鼠圈点中时则高亮边框表白选中。但运用这种思绪咱们只需增添几个数据分子和重载一个因变量就不妨简单地实行你所须要的功效。在创造这个类之前,咱们必需先领会wm_drawitem动静。当按钮、拉拢框、列表框或菜单的某一视觉情景爆发变革时,体例就会发送一条wm_drawitem动静给那些遏制的具有者窗口。这个动静的wparam指出这个遏制的 id 号,而iparam则是一个指向drawitemstruct构造的南针,该构造寄存相关要绘制的项的消息以及绘制所需的典型。drawitem?struct构造具备如次方法。typedef struct tagdrawitem?struct{uint ctltype; // 遏制典型uint ctlid;// 遏制的id号unit itemid;//菜单项的索引uint itemaction;// 证明须要的画图操纵uint itemstate; // 指明画图后的看来状况hwnd hwnditem; // 遏制的窗口句柄hdc hdc; // 关系的摆设情况rect rcitem;//被画遏制的边框dword itemdata;// 指定与菜单项相接洽的运用步调设置的32位值}drawitemstruct;个中itemaction 和 itemstate确定了须要的画图操纵。itemaction 证明须要的画图操纵,可为下列值中的一个或多个; 值 含 义oda_drawentire 须要重来十足遏制时 oda_focus 赢得或遗失输出中心 oda_select 采用状况变换itemstate指明暂时画图举措爆发之后,项的看来状况。底下是状况标记: 值 含 义 ods_checkd 只用来菜单中 ods_disable 该项被樊篱 ods_focus 该项具备输出中心 ods_grayed 只用来菜单中 ods_select 该项居于被选中状况(上) □成都 曾志用VC++实现自绘按钮控制运用vc++编制程序会创造,当按钮遏制接受到wm-drmawitem动静时会挪用cbotton类的drawitem因变量。所以咱们要做的即是运用c++的多态性经过重载cbutton类的drawitem因变量来相应mw-drawitem动静。底下咱们就本质结构一个ccol?orbutton类。class ccolorbutton:public cbutton{ private:colorref m-color:public:ccolorbutton():cbutton(),m-color(0){}; //结构因变量void changecolor(colorref color); //变换脸色virtual void drawitem(lpdrawitemstruct lpdrawitemstruct);//重载的因变量};//重载的虚因变量void ccolorbutton::drawitem(lpdrawitemstruct lpdrawitemtruct){cdc dc;dc.attach(lpdrawitemstruct->hdc); //获得绘制的摆设情况cdcverify( lpdrawitemstruct->ctltype==odt-button);if (lpdrawitemstruct->itemaction & oda-drawentire){//重绘所有遏制 cbrush brush(m-color);dc.fillrect(&(lpdrawitemstruct->reitem),&brush);} if ((lpdrawitemstruct->itemstate & ods-selected) &&(lpdrawitemstruct->itemaction &(oda-select | oda-drawentire))) { //选中了本遏制===>高亮边框colorref fc=rgb(255-getrvalue(m-color), 255-getgvalue(m-color), 255-getbvalue(m-color));cbrush brush(fc);dc.framerect(&(lpdrawitemstruct->rcitem),&brush);} if (!(lpdrawitemstruct->itemstate & ods-selected) &&(lpdrawitemstruct->itemaction & oda-select)){//遏制的选中状况中断===>去掉边框cbrush brush(m-color);dc.framerect(&lpdrawitemstruct->rcitem,&brush);} dc.detach();} //用来变换脸色的分子因变量void ccolorbutton::changecolor(colorref color) { crect rect; m-color=color; getclientrect(&rect); }m-colorchangecolor(colorref color)color,wm-drawitem上头代码中数据分子m-color和来生存按钮的脸色。changecolor(colorref color)因变量控制变换按钮脸色值为color,而后经过使遏制的存户区失效而激励wm-drawitem动静。此刻这个按钮遏制类就算搭好了。底下咱们把它介入到对话框中来考查一下(中) 用VC++实现自绘按钮控制1.开始经过appwizard创造一个单文书档案的运用。2.紧接着启用appstadio创造一个对话框。增添一个按钮遏制,并将其id树立为 idc-colorbutton。结果确定要记取将push button properties对话框中的owner draw查看框置上查看标记。3.在appstadio内运转classwiz?zand来爆发ctestdialog类。而后在ctestdialog类中介入数据分子,在ctestdialog类证明介入如次的private型数据分子:private:ccolorbutton m-colorbutton;4.此刻剩下的题目是究竟要还好吗本领使m-colorbutton的drawitem因变量能相应体例发往id值为idc-colorbutton的按钮遏制的wm-drawitem动静。这时候就要用到cwnd类的分子因变量bool cwnd::subclassdlgitem(uint nid,cwnd *pparent)。经过挪用这个因变量,咱们不妨动静地接收从对话框沙盘爆发的遏制,并把它从属于cwnd东西。即用暂时的cwnd东西接收发向从属于pparent的id号为nid的遏制的十足动静。对于按钮遏制而言,它把暂时的按钮遏制的场所和巨细也清成和nid对应的按钮遏制一律。所以咱们对ctestdialog的源文献举行如次的编纂:bool ctestdialog::oninitdialog(){ cdialog::oninitdialog();//todo:add extra initialization herem-colorbutton.subclassdlgtem(idc-colorbutton,this);//接收动静m-colorbutton.changecolor(rgb(255,0,0);//树立为赤色(可设为任何脸色)return(true);}接着经过classwizzard在ctestdialog中介入一个相应鼠圈点击idc-colorbutton按钮的动静的因变量:void ctestdialog::oncolerbutton(){ //todo:add your control notification handler code hereint r=int(((float)rand()/rand-max)*255int g=int(((float)rand()/rand-max)*255int b=int(((float)rand()/rand-max)*255m-colorbutton.changecolor(rgb(r,g,b));}5.结果,运用classwizzard为view介入一个相应wm-lbuttondown的因变量,再不激活对话框。请按如次代码对其举行编纂。void ctestview::onlbutton?down(uint nflags,point point){ ctestdialog dlg;dlg.domodal();}6.编写翻译并尝试该步调。当鼠标在落视窗中时,按下鼠标左键应能弹出一个对话框。在对话框中的赤色矩形地区内按下鼠标左键就会使其边框形成高亮状况,若在这块地区内开释左键则这城地区就会变换脸色且脸色是随机的。只需变动drawitem因变量中的重绘代码,就不妨获得本人的须要图形按钮。 

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.