



下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
用VC++实现自绘按钮控制MicrosoftWindows以其丰富一致的图形用户界面,简单灵便的操作,被广大用户所接受。对话框就是其中一个非常重要的界面形式,并且Windows为其应用程序的开发者提供了相当丰富的界面资源,许多控制可以方便地加入对话框中。但当我们需要编写一个商业应用,需要一个更友好的图形用户界面时,就会发现资源的贫乏。VisualC++提供了一个CBitmapButton类在一定程序上缓解了增加新资源的要求。但当我们要求在程序中能动态地改变图形时,我们就不得不考虑放弃CBitmapButton类,而坐下来自己做一点工作了。一个可行的办法就是重载CButton类(即按钮控制)。这样对这块区域的大小、位置和ID号都可以通过AppStadio方便地制作。当然这样作最大的好处还是在于充分利用C++的特性把绘制控制的代码封装了起来,既避免了重复性开发,又使程序变得更简洁,增强了代码的可读性。现在我们就通过创建一个名叫CColorButton的类来学习这种方法。虽然这是一个功能非常简单的类,通过调用成员函数ChangeColor可改变其颜色,鼠标点中时则高亮边框表示选中。但利用这种思路我们只需添加几个数据成员和重载一个函数就可以方便地实现你所需要的功能。在创建这个类之前,我们必须先了解WM_DRAWITEM消息。当按钮、组合框、列表框或菜单的某一视觉状况发生变化时,系统就会发送一条WM_DRAWITEM消息给这些控制的拥有者窗口。这个消息的wParam指出这个控制的id号,而IParam则是一个指向DRAWITEMSTRUCT结构的指针,该结构存放有关要绘制的项的信息以及绘制所需的类型。DRAWITEMSTRUCT结构具有如下格式。typedefstructtagDRAWITEMSTRUCT{UINTCtlType;//控制类型UINTCtlID;//控制的ID号UNITitemID;//菜单项的索引UINTitemAction;//说明需要的绘图操作UINTitemState;//指明绘图后的可见状态HWNDhwndItem;//控制的窗口句柄HDChDC;//相关的设备环境RECTrcItem;//被画控制的边框DWORDitemData;//指定与菜单项相联系的应用程序定义的32位值}DRAWITEMSTRUCT;其中itemAction和itemState决定了需要的绘图操作。itemAction说明需要的绘图操作,可为下列值中的一个或多个;值含义ODA_DRAWENTIRE需要重来全部控制时ODA_FOCUS获得或失去输入焦点ODA_SELECT选择状态改变itemState指明当前绘图动作发生之后,项的可见状态。下面是状态标志:值含义ODS_CHECKD只用于菜单中ODS_DISABLE该项被屏蔽ODS_FOCUS该项具有输入焦点ODS_GRAYED只用于菜单中ODS_SELECT该项处于被选中状态利用VC++编程会发现,当按钮控制接收到WM_DRMAWITEM消息时会调用Cbotton类的Drawitem函数。因此我们要做的就是利用C++的多态性通过重载CButton类的Drawitem函数来响应MW—DRAWITEM消息。下面我们就实际构造一个CColorButton类。classccolorButton:publicCButton{private:COLORREFm_color:public:CColorButton():CButton(),m_color(0){};〃构造函数voidChangeColor(COLORREFcolor);〃改变颜色virtualvoidDrawitem(LPDRAWITEMSTRUCTlpDrawitemStruct)〃重载的函数};〃重载的虚函数voidCColorButton::Drawitem(LPDRAWITEMSTRUCTlpDrawitemtruct){CDCdc;dc.Attach(lpDrawitemStruct->hDC);//得到绘制的设备环境CDCVERIFY(lpDrawitemStruct->CtlType==ODT_BUTTON);if(lpDrawitemStruct->itemAction&ODA_DRAWENTIRE){//重绘整个控制CBrushbrush(color);dc.FillRect(&(lpDrawitemStruct->rcitem),&brush);}if((lpDrawitemStruct->itemState&ODS_SELECTED)&&(lpDrawitemStruct->itemAction&(ODA_SELECTIODA_DRAWENTIRE))){〃选中了本控制===>高亮边框COLORREFfc=RGB(255,0,255);CBrushbrush(fc);dc.FrameRect(&(lpDrawitemStruct->rcitem),&brush);}if(!(lpDrawitemStruct->itemState&ODS_SELECTED)&&(lpDrawitemStruct->itemAction&ODA_SELECT)){//控制的选中状态结束===>去掉边框CBrushbrush(color);dc.FrameRect(&lpDrawItemStruct->rcItem,&brush);}dc.Detach();}//用于改变颜色的成员函数voidCColorButton::ChangeColor(COLORREFcolor){CRectrect;m_color=color;GetClientRect(&rect);}m_colorChangeColor(COLORREFcolor)color,WM_DRAWITEM上面代码中数据成员m_color和来保存按钮的颜色。ChangeColor(COLORREFcolor)函数负责改变按钮颜色值为color,然后通过使控制的客户区无效而激发WM_DRAWITEM消息。现在这个按钮控制类就算搭好了。下面我们把它加入到对话框中来试验一下:首先通过AppWizard创建一个单文档的应用。紧接着启动AppStadi。创建一个对话框。添加一个按钮控制,并将其ID设置为IDC-COLORBUTTONo最后一定要记住将pushButtonProperties对话框中的OwnerDraw检查框置上检查标志。3.在AppStadio内运行ClassWizzand来产生CTestDialog类。然后在CTestdialog类中加入数据成员,在CTestDialog类说明加入如下的private型数据成员:private:ccolorButtonm_ColorButton;4.现在剩下的问题是到底要怎样才能使m_ColorButton的DrawItem函数能响应系统发往ID值为IDC-COLORBUTTON的按钮控制的WM_DRAWITEM消息。这时就要用到CWnd类的成员函数BOOLCWnd::SubclassDlgItem(UINTnID,CWnd*pParent)。通过调用这个函数,我们可以动态地接管从对话框模板产生的控制,并把它隶属于CWnd对象。即用当前的CWnd对象接管发向隶属于pParent的ID号为nID的控制的一切消息。对于按钮控制而言,它把当前的按钮控制的位置和大小也清成和nID对应的按钮控制一样。于是我们对CTestDialog的源文件进行如下的编辑:BOOLCTestDialog::OnInitDialog(){CDialog::OnInitDialog();//TODO:Addextrainitializationherem_ColorButton.SubclassDlgtem(IDC—COLORBUTTON,this);//接管消息m_ColorButton.ChangeColor(RGB(255,0,0);〃设置为红色(可设为任何颜色)return(TRUE);}接着通过ClassWizzard在CTestDialog中加入一个响应鼠标点击IDC—COLORBUTTON按钮的消息的函数:voidCTestDialog::OnColerbutton(){//TODO:Addyourcontrolnotificationhandlercodehereintr=int(((float)rand()/RAND—MAX)*255intg=int(((float)rand()/RAND—MAX)*255intb=int(((float)rand()/RAND—MAX)*255m_ColorButton.ChangeColor(RGB(r,g,b));}最后,利用ClassWizzard为View加入一个响应WM_LBUTTONDOWN的函数,以便激活对话框。请按如下代码对其进行编辑。voidCTestView::OnLButtonDown(UINTnflags,POINTpoint){CTestDialogdlg;dlg.Domodal();}编译并测试该程序。当鼠标在落视窗中时,按下鼠标左键应能弹出一个对话框。在对话框中的红色矩形区域内按下鼠标左键就会使其边框变成高亮状态,若在这块区域内释放左键则这城区域就会改变颜色且颜色是随机的。只需更改DrawItem函数中的重绘代码,就可以得到自己的需要图形按钮。int*intArray;inti,j,k,temp;time_tt;intArray=malloc(m*sizeof(int));srand((unsigned)time(&t));/*依次产生m个随机数*/for(i=0;i<m;i++)(temp=rand()%n;/*查找temp原先的“真实”编号*/for(j=0;j<i;j++)if(temp>=intArray[j])temp++;else(/*temp应插在k位置处,这样数组intArray就实现了排序,同时得到了temp原先的编号*/k=j-1;break;}for(j=i-1;j>k;j--)intArray[j+1]=intArray[j];intArray[k]=temp;①/*以下根据题号产生题库部分省略*/}free(intArray);load图形voidCOnlineMonitorView::OnDraw(CDC*pDC){COnlineMonitorDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);//TODO:adddr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年保安证考试概要试题及答案
- 应试指南保安证试题及答案
- 光伏发电项目可行性研究报告编制规程
- 内江师范学院《飞机航空电子系统》2023-2024学年第二学期期末试卷
- 安全防范知识试题及答案
- 2025年保安证考试信息整合试题及答案
- 江西师范大学科学技术学院《生物医学传感器原理》2023-2024学年第二学期期末试卷
- 2025年保安证行业动态试题及答案
- 深入学习的保安证考试试题及答案
- 2025届河南省郑州市重点中学第五次月考高三数学试题含解析
- 春季传染病预防课件动态课件
- 绿化苗木组织供应及售后服务方案
- 家居家具保养与清洁指导书
- 2023年员工手册范本(适用于公司全体员工手册)
- 2024版北京市家庭居室装饰装修工程施工合同
- 不间断电源UPS知识培训
- 5.1中国外交政策的形成与发展 课件高中政治统编版选择性必修一当代国际政治与经济
- 主题活动一 奇妙的绳结(教学设计)内蒙古版六年级上册综合实践活动
- GB/T 23576-2024抛喷丸设备通用技术规范
- 2024-2030年中国大气预浓缩仪市场营销策略建议与未来趋势预测研究报告
- 机动车检测站质量手册(根据补充技术要求修订)
评论
0/150
提交评论