首页 > 文秘写作 > 毕业设计 / 正文
对话框最小化 [用VC++6.0为对话框添加最小化按钮]
2019-12-01 07:38:50 ℃我们在使用对话框窗体时,会有这样一种感受:当对话框窗体位于其它程序窗口界面上时,单击对话框外区域时,可使对话框窗体最小化;而当对话框窗体位于桌面上时,无论怎样单击对话框外区域,对话框均不能最小化,只能选择关闭。但有时我们在使用对话框时,还希望能根据需要使对话框具有最小化功能。本文的设计思想就是据此提出来的。
1实例程序设计要点
⑴取得对话框标题栏位置和大小,在标题栏的适当位置绘制最小化按钮,并记住按钮的位置。
⑵在最小化按钮所在区域检测鼠标是否在该区域内、是否按下,是否发送最小化消息使对话框最小化,否则不变。
⑶将最小化按钮矩形区域向工具提示条控件注册,这样当鼠标在最小化按钮矩形区域时,显示提示文本。
2实例程序实现的步骤及说明
⑴准备二个位图,一个位图表示最小化按钮正常显示状态,另一个位图表示最小化按钮被按下时的状态。
⑵使用MFCAppWizard(exe)创建工程名为MinButton的对话框窗体,如图所示,将二个按钮位图导入对话框的资源里。
⑶在CMinButtonDlg对话框类中进行变量定义和函数声明。
⑷利用ClassWizard为对话框类添加消息WM_NCPAINT,WM_ACTIVATE和WM_NCMOUSEMOVE的消息处理函数,在这三个函数中调用成员函数DrawButton()来绘制按钮。
⑸利用ClassWizard为最小化按钮关联对应的消息WM_NCLBUTTONDOWN和消息处理函数OnNcLButtonDown(UINTnHitTest,CPointpoint)。
⑹函数DrawButton()用于绘制按钮。由于最小化按钮并不是一个真实的按钮控件,而是一个画在标题栏上的位图。因此,为了在对话框窗体标题上绘画,必须创建一个窗口设备环境类(相当于创建一个画布,有了这个画布,才能在画布上绘画,也就是才能在标题栏上绘画。)
①调用函数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,nHeight表示位图目标矩形的逻辑宽度和高度;pSrc表示源设备环境CDC指针;xSrc,ySrc表示位图源矩形的左上角的x,y逻辑坐标值;dwRop表示显示位图的光栅操作方式。光栅操作方式有多种,这里使用的是SRCCOPY,表示将位图直接复制到目标内存设备环境中。这里要说明一点:函数BitBlt()只能一比一的显示位图,如要任意缩放显示位图须使用函数StretchBlt(),该函数的使用方法,请参考相关书籍。
⑤位图选入内存环境中显示后,应调用函数SelectObject(CBitmap*pOldBitmap)恢复原来的内存设备环境。
⑺提示条实质上是一个小的弹出窗口,在窗口中显示一行文本,用来描述工具(或区域)的用途或其它信息。在MFC中提供了工具提示条控件类CToolTipCtrl,由它来管理提示条。在这里,我们从CToolTipCtrl类派生子类CToolTips。在子类的定义中添加函数BOOLAddToolTip(UINTnID,LPRECTlpRect,LPCTSTRlpszText),该函数用于向工具提示条控件注册按钮区域和提示文本,当鼠标在最小化按钮区域时,显示提示文本。
3主要的程序代码
⑴在对话框类中定义相应的变量和函数声明
classCMinButtonDlg:publicCDialog
{
public:
CRectm_rtButtMin;//记录最小化按钮位置
voidDrawButton();//绘制最小化按钮
BOOLm_BMPPressed;//最小化按钮状态标志
CRectm_ButtMinTips;//记录最小化按钮区域
protected:
CToolTipsm_ToolTip;//定义工具提示条控件变量
voidGetMinButRect();//获取最小化按钮所在区域
//消息处理函数
afx_msgvoidOnNcLButtonDown(UINTnHitTest,CPointpoint);
afx_msgvoidOnNcPaint();
afx_msgvoidOnActivate(UINTnState,CWnd*pWndOther,BOOLbMinimized);
afx_msgvoidOnNcMouseMove(UINTnHitTest,CPointpoint);
};
⑵对话框类中三个消息处理函数定义如下:
//对应消息WM_NCPAINT的消息处理函数
voidCMinButtonDlg::OnNcPaint()
{
CDialog::OnNcPaint();
DrawButton();//绘制最小化按钮
}
//对应消息WM_ACTIVATE的消息处理函数
voidCMinButtonDlg::OnActivate(UINTnState,CWnd*pWndOther,BOOLbMinimized)
{
CDialog::OnActivate(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=newCBitmap;
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-rtWnd.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_BITMAP1);//调入正常状态按钮的位图
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.Width(),
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,point);
//检测是否在最小化按钮区域内按下按钮
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)
{
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)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、PⅡ350,效果良好。
猜你喜欢
- 2023-11-03 2023年度药学毕业实习总结14篇(完整文档)
- 2023-11-03 毕业工程实习总结系列3篇
- 2023-11-03 毕业大学生实习报告8篇
- 2023-11-03 有关设计类的实习报告6篇(范文推荐)
- 2023-11-03 2023年大专毕业个人实习总结14篇
- 2023-11-02 2023年优秀毕业实习总结11篇【通用文档】
- 2023-11-01 2023年度毕业实习汇报总结15篇(范例推荐)
- 2023-11-01 大学生毕业实训总结报告15篇
- 2023-10-31 大学生毕业实习工作总结13篇
- 2023-10-31 2023年品牌与ci设计5篇
- 搜索
-
- 党课讲稿:坚持政治建警全面从严治警 08-22
- “两新”组织党支部建设标准(试行) 11-11
- 3篇党员学习第三次中央新疆工作座谈会 09-28
- 《工程质量安全手册(试行)》(建质〔 08-26
- 基层党支部民主生活会批复 07-21
- 党员领导干部政治素质个人自评报告(范 06-10
- 党支部纪检委员职责 06-14
- 党支部组织生活会议内容 09-22
- 新任会长在协会换届选举大会上的讲话 03-25
- 工会会员(代表)大会选举办法 03-13
- 11-25国庆70周年庆典晚会 庆典晚会串词
- 11-25办公室礼仪的十大原则 浅谈办公室的电话礼仪
- 01-17用心灵轻轻地歌唱_心灵的歌唱
- 01-17也许你不是我一生的唯一|也许不是我
- 01-17爱了,请珍惜;不爱,趁早放手|爱就珍惜不爱就放手
- 01-17岁月带走的是记忆,但回忆会越来越清晰|有趣又有深意的句子
- 01-17曾经的美好只是曾经,我只想珍惜身边的人|我只想珍惜你
- 01-18从容不惊 [学会笑眼去看世界,不惊不乍,淡定从容]
- 02-03当代大学生学习态度调查报告
- 02-03常用护患英语会话
- 标签列表