用VC60为对话框添加最小化按钮和提示条.doc

上传人:本田雅阁 文档编号:2531980 上传时间:2019-04-05 格式:DOC 页数:11 大小:33.52KB
返回 下载 相关 举报
用VC60为对话框添加最小化按钮和提示条.doc_第1页
第1页 / 共11页
用VC60为对话框添加最小化按钮和提示条.doc_第2页
第2页 / 共11页
用VC60为对话框添加最小化按钮和提示条.doc_第3页
第3页 / 共11页
用VC60为对话框添加最小化按钮和提示条.doc_第4页
第4页 / 共11页
用VC60为对话框添加最小化按钮和提示条.doc_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《用VC60为对话框添加最小化按钮和提示条.doc》由会员分享,可在线阅读,更多相关《用VC60为对话框添加最小化按钮和提示条.doc(11页珍藏版)》请在三一文库上搜索。

1、用VC+60为对话框添加最小化按钮和提示条.txt41滴水能穿石,只因为它永远打击同一点。42火柴如果躲避燃烧的痛苦,它的一生都将黯淡无光。用VC+6.0为对话框添加最小化按钮和提示条摘 要本文通过实例介绍了用VC+6.0为对话框添加最小化按钮和提示条的方法和原理关键词对话框 最小化按钮 提示条我们在使用对话框窗体时,会有这样一种感受:当对话框窗体位于其它程序窗口界面上时,单击对话框外区域时,可使对话框窗体最小化;而当对话框窗体位于桌面上时,无论怎样单击对话框外区域,对话框均不能最小化,只能选择关闭。但有时我们在使用对话框时,还希望能根据需要使对话框具有最小化功能。本文的设计思想就是据此提出来

2、的。1 实例程序设计要点取得对话框标题栏位置和大小,在标题栏的适当位置绘制最小化按钮,并记住按钮的位置。在最小化按钮所在区域检测鼠标是否在该区域内、是否按下,是否发送最小化消息使对话框最小化,否则不变。将最小化按钮矩形区域向工具提示条控件注册,这样当鼠标在最小化按钮矩形区域时,显示提示文本。2 实例程序实现的步骤及说明准备二个位图,一个位图表示最小化按钮正常显示状态,另一个位图表示最小化按钮被按下时的状态。使用MFCAppWizard(exe)创建工程名为MinButton的对话框窗体,如图所示,将二个按钮位图导入对话框的资源里。 在CMinButtonDlg对话框类中进行变量定义和函数声明。

3、利用ClassWizard为对话框类添加消息WM_NCPAINT,WM_ACTIVATE和WM_NCMOUSEMOVE的消息处理函数,在这三个函数中调用成员函数DrawButton()来绘制按钮。利用ClassWizard为最小化按钮关联对应的消息WM_NCLBUTTONDOWN和消息处理函数OnNcLButtonDown(UINTnHitTest,CPointpoint)。函数DrawButton()用于绘制按钮。由于最小化按钮并不是一个真实的按钮控件,而是一个画在标题栏上的位图。因此,为了在对话框窗体标题上绘画,必须创建一个窗口设备环境类(相当于创建一个画布,有了这个画布,才能在画布上绘画

4、,也就是才能在标题栏上绘画。) 调用函数GetWindowDC()取得指向CDC的指针CDC*pDC;调用函数CreateCompatibleDC(CDC*pDC)创建一个内存设备环境,以便在内存中保存位图,并与指定的窗口设备环境相兼容;调用函数SelectObject(CBitmap*pBitmap),将位图选入内存设备环境中;调用函数BitBlt(intx,inty,intnWidth,intnHeight,CDC*pSrc,intxSrc,intySrc,DWORDdwRop)将位图复制到实际设备环境中。其中,参数x,y表示位图目标矩形左上角的x,y逻辑坐标值;nWidth,nHeigh

5、t表示位图目标矩形的逻辑宽度和高度;pSrc表示源设备环境CDC指针;xSrc,ySrc表示位图源矩形的左上角的x,y逻辑坐标值;dwRop表示显示位图的光栅操作方式。光栅操作方式有多种,这里使用的是SRCCOPY,表示将位图直接复制到目标内存设备环境中。这里要说明一点:函数BitBlt()只能“一比一”的显示位图,如要任意缩放显示位图须使用函数StretchBlt(),该函数的使用方法,请参考相关书籍。位图选入内存环境中显示后,应调用函数SelectObject(CBitmap*pOldBitmap)恢复原来的内存设备环境。提示条实质上是一个小的弹出窗口,在窗口中显示一行文本,用来描述工具(

6、或区域)的用途或其它信息。在MFC中提供了工具提示条控件类CToolTipCtrl,由它来管理提示条。在这里,我们从CToolTipCtrl类派生子类CToolTips。在子类的定义中添加函数BOOLAddToolTip(UINTnID,LPRECTlpRect,LPCTSTRlpszText),该函数用于向工具提示条控件注册按钮区域和提示文本,当鼠标在最小化按钮区域时,显示提示文本。用VC+6.0为对话框添加最小化按钮和提示条(2)3 主要的程序代码在对话框类中定义相应的变量和函数声明classCMinButtonDlg:publicCDialog public: CRectm_rtButt

7、Min;/记录最小化按钮位置 voidDrawButton();/绘制最小化按钮 BOOLm_BMPPressed;/最小化按钮状态标志 CRectm_ButtMinTips;/记录最小化按钮区域protected: CToolTipsm_ToolTip;/定义工具提示条控件变量 voidGetMinButRect();/获取最小化按钮所在区域 /消息处理函数afx_msgvoidOnNcLButtonDown(UINTnHitTest,CPointpoint); afx_msgvoidOnNcPaint(); afx_msgvoidOnActivate(UINTnState,CWnd*pWn

8、dOther,BOOLbMinimized); afx_msgvoidOnNcMouseMove(UINTnHitTest,CPointpoint);;对话框类中三个消息处理函数定义如下:/对应消息WM_NCPAINT的消息处理函数voidCMinButtonDlg:OnNcPaint() CDialog:OnNcPaint(); DrawButton();/绘制最小化按钮 /对应消息WM_ACTIVATE的消息处理函数voidCMinButtonDlg:OnActivate(UINTnState,CWnd*pWndOther,BOOLbMinimized) CDialog:OnActivat

9、e(nState,pWndOther,bMinimized); DrawButton();/绘制最小化按钮 /对应消息WM_NCMOUSEMOVE的消息处理函数voidCMinButtonDlg:OnNcMouseMove(UINTnHitTest,CPointpoint) DrawButton();/绘制最小化按 CDialog:OnNcMouseMove(nHitTest,point);绘制最小化按钮的函数voidCMinButtonDlg:DrawButton() CDC*pDC=GetWindowDC(); CDC*pMemDC=newCDC; CBitmap*pBitmap1=new

10、CBitmap; CBitmap*pBitmap2=newCBitmap; CBitmap*pOldBitmap; CRectrtWnd,rtButtons,rtTitle; /创建一个内存设备环境 pMemDC-CreateCompatibleDC(pDC); if(!pDC)return; GetWindowRect(&rtWnd); /取得标题栏的矩形 rtTitle.left=GetSystemMetrics(SM_CXFRAME); rtTitle.top=GetSystemMetrics(SM_CYFRAME); rtTitle.right=rtWnd.right-rtWn

11、d.left-GetSystemMetrics(SM_CXFRAME); rtTitle.bottom=rtTitle.top+GetSystemMetrics(SM_CYSIZE); /计算最小化按钮的位置,位图大小为15X15 rtButtons.top=rtTitle.top+1; rtButtons.bottom=rtButtons.top+15; rtButtons.right=rtTitle.right-20; rtButtons.left=rtButtons.right-15; m_rtButtMin=rtButtons; pBitmap1-LoadBitmap(IDB_BITM

12、AP1);/调入正常状态按钮的位图 pBitmap2-LoadBitmap(IDB_BITMAP2); /调入按钮按下状态的位图 m_rtButtMin.OffsetRect(rtWnd.TopLeft();/记录最小化按钮的位置 /将按钮位图调入内存设备环境中,m_BMPPressed为TRUE/调入正常状态按钮的位图 pOldBitmap=pMemDC-SelectObject(m_BMPPressed?pBitmap1:pBitmap2); /将按钮位图复制到实际的内存设备环境中 pDC-BitBlt(rtButtons.left,rtButtons.top,rtButtons.Widt

13、h(), rtButtons.Height(),pMemDC,0,0,SRCCOPY); pMemDC-SelectObject(pOldBitmap);/恢复原来的内存设备环境 /释放资源 ReleaseDC(pMemDC); ReleaseDC(pDC); deletepMemDC; deletepBitmap1; deletepBitmap2; 对应鼠标左键的WM_NCLBUTTONDOWN消息处理函数voidCMinButtonDlg:OnNcLButtonDown(UINTnHitTest,CPointpoint) CDialog:OnNcLButtonDown(nHitTest,p

14、oint); /检测是否在最小化按钮区域内按下按钮 if(m_rtButtMin.PtInRect(point) m_BMPPressed=FALSE;/绘制按钮按下时的状态 DrawButton();/绘制最小化按钮 m_BMPPressed=TRUE;/绘制按钮的正常状态 SendMessage(WM_SYSCOMMAND,SC_MINIMIZE,MAKELPARAM(point.x,point.y);/发送最小化消息 /在最小化按钮区域实现提示文本BOOLCToolTips:AddToolTip(UINTnID,LPRECTlpRect,LPCTSTRlpszText ) TOOLINF

15、OTips; 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)lpszText return(BOOL)SendMessage(TTM_ADDTOOL,0,(LPARAM)&Tips);在对话框初始化函数OnInitDialog()中添下列代码:m_ToolTip.Create(this,TTS_ALWAYSTIP);/创建工具提示控件,TTS_ALWAYSTIP表示,/不论控件所属窗体是否活动,提示条始终有效 GetMinButRect(); ScreenToClient(&m_ButtMinTips);/屏幕坐标转换为窗体坐标 m_ToolTip.AddToolTip(1,&m_ButtMinTips,最小化);4 结束语 实例程序的测试环境为Windows98、P350,效果良好。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1