




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、我们在使用对话框窗体时,会有这样一种感受:当对话框窗体位于其它程序窗口界面上时,单击对话框外区域时,可使对话框窗体最小化;而当对话框窗体位于桌面上时,无论怎样单击对话框外区域,对话框均不能最小化,只能选择关闭。但有时我们在使用对话框时,还希望能根据需要使对话框具有最小化功能。本文的设计思想就是据此提出来的。1实例程序设计要点取得对话框标题栏位置和大小,在标题栏的适当位置绘制最小化按钮,并记住按钮的位置。在最小化按钮所在区域检测鼠标是否在该区域内、是否按下,是否发送最小化消息使对话框最小化,否则不变。将最小化按钮矩形区域向工具提示条控件注册,这样当鼠标在最小化按钮矩形区域时,显示提示文本。2实例
2、程序实现的步骤及说明准备二个位图,一个位图表示最小化按钮正常显示状态,另一个位图表示最小化按钮被按下时的状态。使用MFCAppWizard(exe创建工程名为MinButton的对话框窗体,如图所示,将二个按钮位图导入对话框的资源里。在CMinButtonDlg对话框类中进行变量定义和函数声明利用ClassWizard为对话框类添加消息WM_NCPAINTWM_ACTIVATEffiWM_NCMOUSEMOVE勺消息处理函数,在这三个函数中调用成员函数DrawButton()来绘制按钮。利用ClassWizar狈最小化按钮关联对应的消息WM_NCLBUTTONDOWN口消息处理函数OnNcLB
3、uttonDown(UINTnHitTest,CPointpoint)函数DrawButton()用于绘制按钮。由于最小化按钮并不是一个真实的按钮控件,而是一个画在标题栏上的位图。因此,为了在对话框窗体标题上绘画,必须创建一个窗口设备环境类(相当于创建一个画布,有了这个画布,才能在画布上绘画,也就是才能在标题栏上绘画。)调用函数GetWindowDCQ®得指向CDC的指针CDC*pDC;调用函数CreateCompatibleDC(CDC*pDCJ建一个内存设备环境,以便在内存中保存位图,并与指定的窗口设备环境相兼容;调用函数SelectObject(CBitmap*pBitmap)
4、,将位图选入内存设备环境中;调用函数BitBlt(intx,inty,intnWidth,intnHeight,CDC*pSrc,intxSrc,intySrc,DWORDdwRop)t位图复制到实际设备环境中。其中,参数x,y表示位图目标矩形左上角的x,y逻辑坐标值;nWidth,nHeight表示位图目标矩形的逻辑宽度和高度;pSrc表示源设备环境CDC指针;xSrc,ySrc|fe示位图源矩形的左上角的x,y逻辑坐标值;dwRop表示显示位图的光栅操作方式。光栅操作方式有多种,这里使用的是SRCCOPY表示将位图直接复制到目标内存设备环境中。这里要说明一点:函数BitBlt()只能乙比一
5、”示显示位图,如要任意缩放显示位图须使用函数StretchBlt(),该函数的使用方法,请参考相关书籍位图选入内存环境中显示后,应调用函数SelectObject(CBitmap*pOldBitmap)恢复原来的内存设备环境。提示条实质上是一个小的弹出窗口,在窗口中显示一行文本,用来描述工具(或区域)的用途或其它信息。在MFC中提供了工具提示条控件类CToolTipCtrl由它来管理提示条。在这里,我们从CToolTipCtrl类派生子类CToolTips在子类的定义中添加函数BOOLAddToolTip(UINTnID,LPRECTlpRect,LPCTSTRlpszTWt)数用于向工具提示
6、条控件注册按钮区域和提示文本,当鼠标在最小化按钮区域时,显示提示文本。3主要的程序代码在对话框类中定义相应的变量和函数声明classCMinButtonDlg:publicCDialogpublic:CRectm_rtButtMin;/记录最小化按钮位置voidDrawButton();/绘制最小化按钮BOOLm_BMPPressed;/R小化按钮状态标志CRectm_ButtMinTips;/记录最小化按钮区域protected:CToolTipsm_ToolTip;/定义工具提示条控件变量voidGetMinButRect();获取最小化按钮所在区域/消息处理函数afx_msgvoidOn
7、NcLButtonDown(UINTnHitTest,CPointpoint);afx_msgvoidOnNcPaint();afx_msgvoidOnActivate(UINTnState,CWnd*pWndOther,BOOLbMinimized);afx_msgvoidOnNcMouseMove(UINTnHitTest,CPointpoint);对话框类中三个消息处理函数定义如下:对应消息WM_NCPAINT的消息处理函数voidCMinButtonDlg:OnNcPaint()CDialog二OnNcPaint();DrawButton();/绘制最小化按钮/对应消息WM_ACTIV
8、ATE勺消息处理函数voidCMinButtonDlg:OnActivate(UINTnState,CWnd*pWndOther,BOOLbMinimized)CDialog:OnActivate(nState,pWndOther,bMinimized);DrawButton();/绘制最小化按钮/对应消息WM_NCMOUSEMOVE勺消息处理函数voidCMinButtonDlg二OnNcMouseMove(UINTnHitTest,CPointpoint)DrawButton();/绘制最小化按CDialog:OnNcMouseMove(nHitTest,point);绘制最小化按钮的函数
9、voidCMinButtonDlg二DrawButton()CDC*pDC=GetWindowDC();CDC*pMemDC=newCDC;CBitmap*pBitmap1=newCBitmap;CBitmap*pBitmap2=newCBitmap;CBitmap*pOldBitmap;CRectrtWnd,rtButtons,rtTitle;创建一个内存设备环境pMemDC->CreateCompatibleDC(pDC);if(!pDC)return;GetWindowRect(&rtWnd);取得标题栏的矩形rtTitle.left=GetSystemMetrics(SM
10、_CXFRAME);rtTitle.top=GetSystemMetrics(SM_CYFRAME);rtTitle.right=rtWnd.right-rtWnd.left-GetSystemMetrics(SM_CXFRAME);rtTitle.bottom=rtTitle.top+GetSystemMetrics(SM_CYSIZE);/计算最小化按钮的位置,位图大小为15X15rtButtons.top=rtTitle.top+1;rtButtons.bottom=rtButtons.top+15;rtButtons.right=rtTitle.right-20;rtButtons.l
11、eft=rtButtons.right-15;m_rtButtMin=rtButtons;pBitmap1->LoadBitmap(IDB_BITMAP1);倒入正常状态按钮的位图pBitmap2->LoadBitmap(IDB_BITMAP2);倜入按钮按下状态的位图m_rtButtMin.OffsetRect(rtWnd.TopLeft();记录最小化按钮的位置将按钮位图调入内存设备环境中,m_BMPPressed为TRUE调入正常状态按钮的位图pOldBitmap=pMemDC->SelectObject(m_BMPPressed?pBitmap1:pBitmap2);
12、将按钮位图复制到实际的内存设备环境中pDC->BitBlt(rtButtons.left,rtButtons.top,rtButtons.Width(),rtButtons.Height(),pMemDC,0,0,SRCCOPY);pMemDC->SelectObject(pOldBitmap);恢复原来的内存设备环境/释放资源ReleaseDC(pMemDC);ReleaseDC(pDC);deletepMemDC;deletepBitmapl;deletepBitmap2;对应鼠标左键的WM_NCLBUTTONDOWNf息处理函数voidCMinButtonDlg二OnNcLB
13、uttonDown(UINTnHitTest,CPointpoint)CDialog:OnNcLButtonDown(nHitTest,point);/检测是否在最小化按钮区域内按下按钮if(m_rtButtMin.PtInRect(point)m_BMPPressed=FALSE绘制按钮按下时的状态DrawButton();/绘制最小化按钮m_BMPPressed=TRUE;始制按钮的正常状态SendMessage(WM_SYSCOMMAND,SC_MINIMIZE,MAKELPARAM(point.x,point.y);发送最小化消息/在最小化按钮区域实现提示文本BOOLCToolTips
14、:AddToolTip(UINTnID,LPRECTlpRect,LPCTSTRlpszText)TOOLINFOTips;memset(&Tips,0,sizeof(TOOLINFO);Tips.cbSize=sizeof(TOOLINFO);Tips.hwnd=GetOwner()->GetSafeHwnd();Tips.uFlags=TTF_SUBCLASS;Tips.uId=nID;memcpy(&Tips.rect,lpRect,sizeof(RECT);Tips.lpszText=(LPSTR)lpszTextreturn(BOOL)SendMessage(TTM_ADDTOOL,0,(LPARAM)&Tips);在对话框初始化函数OnInitDialog()中添下列代码:m_ToolTip.Cre
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 制定科学的招聘与选拔流程计划
- 城市交通与城市规划理论创新研究重点基础知识点
- 城市交通规划政策研究重点基础知识点
- 社交媒体营销的季度目标与策略计划
- 2024年湛江市民政局招聘工作人员笔试真题
- 网络管理工具的优势及试题及答案
- 2024年江西长运科技有限公司招聘客服人员真题
- 2024年海南省地质局下属事业单位真题
- 2024年贵州省农业农村厅下属事业单位真题
- 2024年宁波慈溪市附海镇招聘笔试真题
- 2024年-惠州市中心人民医院招聘笔试真题
- 贵州省黔东南南苗族侗族自治州台江县2025年小升初数学综合练习卷含解析
- 《多样的中国民间美术》课件 2024-2025学年人美版(2024)初中美术七年级下册
- 《13洁净的水域》教学设计-2023-2024学年科学六年级下册苏教版
- 安全安全生产责任制度
- DB33-T 2383-2021 《公路工程强力搅拌就地固化设计与施工技术规范》
- 【物理】跨学科实践制作微型密度计 课件+2024-2025学年物理人教版八年级下册
- 2025年福建三明市中考模拟英语试题完整版(含答案+听力MP3)
- 知识产权代理人培训课件
- 《双碳背景下的绿色债券发展研究国内外文献综述》3000字
- 银行消保培训
评论
0/150
提交评论