计算机理论

计算机网络
计算机理论
计算机应用
电子商务

本类阅读TOP10

·Frontpage网页制作
·C#做的ASP.NET登錄篇
·C语言实现串行通信接口程序
·Foxpro DBF数据库转换成SQL Server 6.5表的几种方法
·企业信息化的新选择——Intranet
·动态哈夫曼编码的改进
·论计算机网络中服务的概念
·Visual C++中的开放数据库连接技术
·关于烟汽应用计算机信息技术加强企业管理的调查报告
·Solaris下PRO*C和OCI程序设计分析与比较

分类导航
演讲致辞党团范文
心得体会领导讲话
经验介绍事迹材料
总结汇报计划方案
常用范文写作指南
证券金融银行管理
债务市场保险租赁
金融研究证券投资
财务管理投资决策
财务分析融资决策
财务管理市场营销
会计审计会计审计
成本会计管理会计
CPA行业管理学
战略竞争旅游管理学
成本管理管理学理论
物流管理人力资源管理
财政税收财政政策
财税法规税务研讨
税收理论国债研究
财政研究经济学
中国经济经济学理论
新经济学产业经济
国际经济经济学相关
地方经济发展战略
国际贸易公共管理
公共政策行政管理
经济管理企业战略
管理理论市场营销
企业研究企业文化
文化类西方文化
传统文化社会学相关
艺术学美学
音乐影视
艺术理论社会学
伦理道德环境保护
人口问题农村研究
教育学历史学
教育学国学
理工科理科相关
统计学物理学
工业设计交通
土建水利学材料工程学
电子学通信学
化工计算机
计算机网络计算机理论
计算机应用电子商务
文学外国语
人物研究哲学
哲学相关思想哲学
科技哲学中国哲学
西方哲学逻辑学
政治政治相关
民族主义资本主义
社会主义马克思主义
法律行政法
法学理论司法制度
经济法民法
医学医学
临床医学药学
其他文秘
公务员考试最新资讯
考试资料复习指导
面试指南教育教学
用VC++6.0为对话框添加最小化按钮和提示条

作者:未知 来源:应用文写作网 加入时间:2005-12-29 月光软件站

摘 要 本文通过实例介绍了用VC++6.0为对话框添加最小化按钮和提示条的方法和原理
关键词 对话框 最小化按钮 提示条
我们在使用对话框窗体时,会有这样一种感受:当对话框窗体位于其它程序窗口界面上时,单击对话框外区域时,可使对话框窗体最小化;而当对话框窗体位于桌面上时,无论怎样单击对话框外区域,对话框均不能最小化,只能选择关闭。但有时我们在使用对话框时,还希望能根据需要使对话框具有最小化功能。本文的设计思想就是据此提出来的。
1 实例程序设计要点
⑴ 取得对话框标题栏位置和大小,在标题栏的适当位置绘制最小化按钮,并记住按钮的位置。
⑵ 在最小化按钮所在区域检测鼠标是否在该区域内、是否按下,是否发送最小化消息使对话框最小化,否则不变。
⑶ 将最小化按钮矩形区域向工具提示条控件注册,这样当鼠标在最小化按钮矩形区域时,显示提示文本。
2 实例程序实现的步骤及说明
⑴ 准备二个位图,一个位图表示最小化按钮正常显示状态,另一个位图表示最小化按钮被按下时的状态。
⑵ 使用MFC AppWizard(exe)创建工程名为MinButton的对话框窗体,如图所示,将二个按钮位图导入对话框的资源里。

⑶ 在CMinButtonDlg对话框类中进行变量定义和函数声明。
⑷ 利用ClassWizard为对话框类添加消息WM_NCPAINT,WM_ACTIVATE和WM_NCMOUSEMOVE的消息处理函数,在这三个函数中调用成员函数DrawButton()来绘制按钮。
⑸ 利用ClassWizard为最小化按钮关联对应的消息WM_NCLBUTTONDOWN和消息处理函数OnNcLButtonDown(UINT nHitTest, CPoint point)。
⑹ 函数DrawButton()用于绘制按钮。由于最小化按钮并不是一个真实的按钮控件,而是一个画在标题栏上的位图。因此,为了在对话框窗体标题上绘画,必须创建一个窗口设备环境类(相当于创建一个画布,有了这个画布,才能在画布上绘画,也就是才能在标题栏上绘画。)
① 调用函数GetWindowDC()取得指向CDC的指针 CDC* pDC;
② 调用函数 CreateCompatibleDC(CDC* pDC)创建一个内存设备环境,以便在内存中保存位图,并与指定的窗口设备环境相兼容;
③ 调用函数SelectObject(CBitmap *pBitmap),将位图选入内存设备环境中;
④ 调用函数 BitBlt(int x, int y, int nWidth, int nHeight, CDC *pSrc, int xSrc, int ySrc, DWORD dwRop)将位图复制到实际设备环境中。其中,参数x, y 表示位图目标矩形左上角的x, y 逻辑坐标值;nWidth, nHeight 表示位图目标矩形的逻辑宽度和高度;pSrc 表示源设备环境CDC指针;xSrc, ySrc 表示位图源矩形的左上角的x, y 逻辑坐标值;dwRop 表示显示位图的光栅操作方式。光栅操作方式有多种,这里使用的是SRCCOPY,表示将位图直接复制到目标内存设备环境中。这里要说明一点:函数BitBlt()只能“一比一”的显示位图,如要任意缩放显示位图须使用函数StretchBlt(),该函数的使用方法,请参考相关书籍。
⑤ 位图选入内存环境中显示后,应调用函数SelectObject(CBitmap *pOldBitmap)恢复原来的内存设备环境。
⑺ 提示条实质上是一个小的弹出窗口,在窗口中显示一行文本,用来描述工具(或区域)的用途或其它信息。在MFC中提供了工具提示条控件类CToolTipCtrl,由它来管理提示条。在这里,我们从CToolTipCtrl类派生子类CToolTips。在子类的定义中添加函数BOOL AddToolTip( UINT nID, LPRECT lpRect, LPCTSTR lpszText),该函数用于向工具提示条控件注册按钮区域和提示文本,当鼠标在最小化按钮区域时,显示提示文本。
3 主要的程序代码
⑴ 在对话框类中定义相应的变量和函数声明
class CMinButtonDlg : public CDialog
{
…………
public:
CRect m_rtButtMin; //记录最小化按钮位置
void DrawButton(); //绘制最小化按钮
BOOL m_BMPPressed;//最小化按钮状态标志
CRect m_ButtMinTips;//记录最小化按钮区域
protected:
CToolTips m_ToolTip;//定义工具提示条控件变量
void GetMinButRect();//获取最小化按钮所在区域
//消息处理函数
afx_msg void OnNcLButtonDown(UINT nHitTest, CPoint point);
afx_msg void OnNcPaint();
afx_msg void OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized);
afx_msg void OnNcMouseMove(UINT nHitTest, CPoint point);
…………
};
⑵ 对话框类中三个消息处理函数定义如下:
//对应消息WM_NCPAINT的消息处理函数
void CMinButtonDlg::OnNcPaint()
{
CDialog::OnNcPaint();
DrawButton(); //绘制最小化按钮
}
//对应消息WM_ACTIVATE的消息处理函数
void CMinButtonDlg::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)
{
CDialog::OnActivate(nState, pWndOther, bMinimized);
DrawButton(); //绘制最小化按钮
}
//对应消息WM_NCMOUSEMOVE的消息处理函数
void CMinButtonDlg::OnNcMouseMove(UINT nHitTest, CPoint point)
{
DrawButton(); //绘制最小化按钮
CDialog::OnNcMouseMove(nHitTest, point);
}
⑶ 绘制最小化按钮的函数
void CMinButtonDlg::DrawButton()
{

CDC* pDC = GetWindowDC();
CDC* pMemDC=new CDC;
CBitmap *pBitmap1=new CBitmap;
CBitmap *pBitmap2=new CBitmap;
CBitmap *pOldBitmap;
CRect rtWnd, 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);
delete pMemDC;
delete pBitmap1;
delete pBitmap2;
}
⑷ 对应鼠标左键的WM_NCLBUTTONDOWN消息处理函数
void CMinButtonDlg::OnNcLButtonDown(UINT nHitTest, CPoint point)
{
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));//发送最小化消息
}
}
⑸ //在最小化按钮区域实现提示文本
BOOL CToolTips::AddToolTip( UINT nID, LPRECT lpRect, LPCTSTR lpszText )
{
TOOLINFO Tips;
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 结束语
实例程序的测试环境为Windows 98、PⅡ350,效果良好。



相关文章

相关软件