论文网首页|会计论文|管理论文|计算机论文|医药学|经济学论文|法学论文|社会学论文|文学论文|教育论文|理学论文|工学论文|艺术论文|哲学论文|文化论文|外语论文|论文格式
中国论文网

用户注册

设为首页

您现在的位置: 中国论文网 >> 计算机论文 >> 计算机理论论文 >> 正文 会员中心
 计算机应用论文   计算机理论论文   计算机网络论文   电子商务论文   软件工程论文   操作系统论文   通信技术论文
用VC++6.0为对话框添加最小化按钮和提示条

摘  要 本文通过实例介绍了用vc++6.0为对话框添加最小化按钮和提示条的方法和原理

关键词 对话框  最小化按钮  提示条

我们在使用对话框窗体时,会有这样一种感受:当对话框窗体位于其它程序窗口界面上时,单击对话框外区域时,可使对话框窗体最小化;而当对话框窗体位于桌面上时,无论怎样单击对话框外区域,对话框均不能最小化,只能选择关闭。但有时我们在使用对话框时,还希望能根据需要使对话框具有最小化功能。本文的设计思想就是据此提出来的。
1       实例程序设计要点
⑴ 取得对话框标题栏位置和大小,在标题栏的适当位置绘制最小化按钮,并记住按钮的位置。
⑵ 在最小化按钮所在区域检测鼠标是否在该区域内、是否按下,是否发送最小化消息使对话框最小化,否则不变。
⑶ 将最小化按钮矩形区域向工具提示条控件注册,这样当鼠标在最小化按钮矩形区域时,显示提示文本。
2  实例程序实现的步骤及说明
⑴ 准备二个位图,一个位图表示最小化按钮正常显示状态,另一个位图表示最小化按钮被按下时的状态。
⑵ 使用mfc appwizard(exe)创建工程名为minbutton的对话框窗体,如图所示,将二个按钮位图导入对话框的资源里。
 
⑶ 在cminbuttondlg对话框类中进行变量定义和函数声明。
⑷ 利用classwizard为对话框类添加消息wm_ncpaint,wm_activate和wm_ncmousemove的消息处理函数,在这三个函数中调用成员函数drawbutton()来绘制按钮。wwW.11665.com
⑸ 利用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,效果良好。

  • 上一个计算机论文:
  • 下一个计算机论文:
  •  作者:佚名 [标签: 对话框 提示 ]
    姓 名: *
    E-mail:
    评 分: 1分 2分 3分 4分 5分
    评论内容:
    发表评论请遵守中国各项有关法律法规,评论内容只代表网友个人观点,与本网站立场无关。
    基于ARM控制的1KW零电压零电流全桥DC/DC变换
    氟康唑治疗复杂型外阴阴道假丝酵母菌病(VV
    LabWindows/CVI的应用特点
    计算机软件之模具CAD/CAM软件的应用与开发现
    Visual C++与Delphi/C++Builder之比较及未来
    基于XML的三层C/S模型
    uC/OS-II内核超时等待机制的分析
    Intel C++ 9.0编译器优化效果测试
    基于MVC设计模式的WEB应用框架研究
    MVC设计模式在通用报表系统中的应用
    基于MVC模式的Struts框架在财务系统中的应用
    对C++中指针的深入研究
    | 设为首页 | 加入收藏 | 联系我们 | 网站地图 | 手机版 | 论文发表

    Copyright 2006-2013 © 毕业论文网 All rights reserved 

     [中国免费论文网]  版权所有