论如何用VC++6.0为对话框添加最小化按钮和提示条

来源:期刊VIP网所属分类:计算机信息管理发布时间:2014-02-19浏览:

  摘 要 我们在使用对话框窗体时,会有这样一种感受:当对话框窗体位于其它程序窗口界面上时,单击对话框外区域时,可使对话框窗体最小化;而当对话框窗体位于桌面上时,无论怎样单击对话框外区域,对话框均不能最小化,只能选择关闭。但有时我们在使用对话框时,还希望能根据需要使对话框具有最小化功能。本文的设计思想就是据此提出来的。

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

  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;

  memcp

期刊VIP网,您身边的高端学术顾问

文章名称: 论如何用VC++6.0为对话框添加最小化按钮和提示条

文章地址: http://www.qikanvip.com/jisuanjixinxiguanli/11811.html