VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 709|回复: 2

MFC自绘按钮,如何实现放大和还原功能

[复制链接]
89_avatar_middle
最佳答案
2 
在线会员 发表于 2024-3-6 14:38:35 | 显示全部楼层 |阅读模式
10驿站币
如题,用MFC对话框上自绘标题栏和按钮,想实现点击m_btnMax按钮放大,再点击m_btnMax按钮还原,具体代码如下:

  1. BEGIN_MESSAGE_MAP(CTestDlg, CDialogEx)
  2.         ON_WM_PAINT()
  3.         ON_BN_CLICKED(IDC_BTN_MAX_CLICKED, &CTestDlg::OnBnClickedBtnMax)
  4.         //...
  5.         ON_WM_SIZE()
  6. END_MESSAGE_MAP()

  7. BOOL CTestDlg::OnInitDialog()
  8. {
  9.         //...
  10.        
  11.         m_btnExit.Create(_T(""), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(812, 23, 827, 38), this, IDC_BTN_CLOSE_CLICKED);
  12.         m_btnExit.SetImagePng(IDB_BTN_CLOSE_NOR, IDB_BTN_CLOSE_PRE, IDB_BTN_CLOSE_PRE);
  13.         m_btnExit.ShowWindow(SW_SHOW);

  14.         m_btnMax.Create(_T(""), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(770, 23.5, 790, 38.5), this, IDC_BTN_MAX_CLICKED);
  15.         m_btnMax.SetImagePng(IDB_BTN_MAX_NOR, IDB_BTN_MAX_PRE, IDB_BTN_MAX_NOR);
  16.         m_btnMax.ShowWindow(SW_SHOW);

  17.         m_btnMin.Create(_T(""), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(728, 24.5, 748, 27.5), this, IDC_BTN_MIN_CLICKED);
  18.         m_btnMin.SetImagePng(IDB_BTN_MIN_NOR, IDB_BTN_MIN_PRE, IDB_BTN_MIN_NOR);
  19.         m_btnMin.ShowWindow(SW_SHOW);
  20.        
  21.         MoveWindow(0, 0, 850, 605);
  22.         CenterWindow();
  23.        
  24.         return TRUE;
  25. }

  26. void CTestDlg::OnPaint()
  27. {
  28.         CPaintDC dc(this);

  29.         CRect rect, fillrect;
  30.         CBrush brush;
  31.         brush.CreateSolidBrush(RGB(255, 255, 255));
  32.         GetClientRect(&rect);
  33.         dc.FillRect(&rect, &brush); //用FillRect成员函数利用笔刷填充指定区域
  34.         brush.DeleteObject();

  35.         CPen NewPen, *pO1dPen;
  36.         NewPen.CreatePen(PS_SOLID, 2, RGB(155, 179, 217));
  37.         pO1dPen = dc.SelectObject(&NewPen);
  38.         dc.MoveTo(0, 60);
  39.         dc.LineTo(rect.Width(), 60);
  40.         dc.SelectObject(pO1dPen);
  41.         NewPen.DeleteObject();
  42.        
  43.         if (m_hWnd)
  44.         {
  45.                 CBrush Brush(RGB(155, 179, 217));
  46.                 CBrush* pOldBrush = dc.SelectObject(&Brush);
  47.                                 CRect rect;
  48.                 GetClientRect(&rect);

  49.                 int borderWidth = 1;

  50.                 // 绘制边框  
  51.                 dc.PatBlt(rect.left, rect.top, borderWidth, rect.Height(), /*BLACKNESS*/PATCOPY); // 上边框  
  52.                 dc.PatBlt(rect.left + rect.Width() - borderWidth, rect.top, borderWidth, rect.Height(), /*BLACKNESS*/PATCOPY); // 下边框  
  53.                 dc.PatBlt(rect.left, rect.top, rect.Width(), borderWidth, /*BLACKNESS*/PATCOPY); // 左边框  
  54.                 dc.PatBlt(rect.left, rect.top + rect.Height() - borderWidth, rect.Width(), borderWidth, /*BLACKNESS*/PATCOPY); // 右边框  

  55.                 // 恢复原始画刷  
  56.                 dc.SelectObject(pOldBrush);
  57.         }

  58. }

  59. void CTestDlg::OnBnClickedBtnMax()
  60. {
  61.         //SendMessage(WM_SYSCOMMAND, SC_MAXIMIZE, 0);
  62.         //SendMessage(WM_SYSCOMMAND,SC_RESTORE,0);//还原
  63.         if (m_bMaximized)
  64.         {
  65.                 // 还原对话框  
  66.                 ShowWindow(SW_RESTORE);
  67.                 m_bMaximized = FALSE;
  68.         }
  69.         else
  70.         {
  71.                 // 最大化对话框  
  72.                 ShowWindow(SW_SHOWMAXIMIZED);
  73.                 m_bMaximized = TRUE;
  74.         }
  75.         UpdateWindow(); // 更新窗口显示  
  76. }

  77. void CTestDlg::OnSize(UINT nType, int cx, int cy)
  78. {
  79.         CDialog::OnSize(nType, cx, cy);
  80.         if (nType == SIZE_MAXIMIZED)
  81.         {
  82.                 CRect rect;
  83.                 GetClientRect(&rect);
  84.                 int width = rect.Width();
  85.                 int height = rect.Height();
  86.                 CRect btnExitRect(rect.Width() - 38, 23, 15, 15); //放大后,关闭按钮为什么没有显示呢?
  87.                 m_btnExit.MoveWindow(&btnExitRect, TRUE);
  88.                 //.....

  89.         }
  90.         else if (nType == SIZE_RESTORED)
  91.         {
  92.                 CRect rect;
  93.                 GetClientRect(&rect);
  94.                 if (m_btnExit.m_hWnd)
  95.                 {
  96.                         CRect btnExitRect(rect.Width() - 38, 23, 15, 15);
  97.                         m_btnExit.MoveWindow(&btnExitRect, TRUE);
  98.                 }
  99.         }
  100. }

复制代码

如上代码运行后,遇到两个问题,想求助一下各位有经验的大佬们,第一个问题:点击按钮放大后,正常尺寸下OnPaint绘制的边框还在,有什么办法让它消失,即在放大的边框处自绘边框呢?第二个问题:自绘按钮起初的位置是通过CRect给定的,放大后,通过MoveWindow也移动,为什么没有显示界面呢?欢迎各位大佬们指点一二,小弟感激不尽!!!





上一篇:提示无法解析呢
下一篇:msscript.ocx 注册成功,C++ 控制台下调用成功,但MFC下提示组件未注册
89_avatar_middle
最佳答案
2 
ico_lz  楼主| 发表于 2024-3-8 09:33:22 | 显示全部楼层
自己已解决!!
67_avatar_middle
最佳答案
0 
在线会员 发表于 2024-3-14 03:56:40 | 显示全部楼层
lwei2 发表于 2024-3-8 09:33
自己已解决!!

6 驿站好像没人了,我来晚了啊,MFC自绘按钮,如何实现放大和还原功能 都末期了
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2024-4-21 04:03

Powered by CcTry.CoM

© 2009-2021 cctry.com

快速回复 返回顶部 返回列表