科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件VC为对话框添加最小化按钮和提示条

VC为对话框添加最小化按钮和提示条

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

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

作者:张 钟 来源:ahcit 2007年10月19日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
主要的程序代码

  ⑴ 在对话框类中定义相应的变量和函数声明

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,"最小化");

  结束语

  实例程序的测试环境为Windows 98、PⅡ350,效果良好。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章