VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 491|回复: 2

VC++高级班之窗口篇-[16]实现对话框的自适应最大化功能

[复制链接]
51_avatar_middle
online_admins Syc 发表于 2018-3-6 01:27:47 | 显示全部楼层 |阅读模式
------------------------------------------ Begin ----------------------------------------
①、说明:
单文档等文档视图类结构程序默认可以自适应大小的改变,比如系统自带的记事本,但是对话框程序就没有这个功能了,
需要我们自己做处理!原理就是利用 MoveWindow、SetWindowPos 等函数进行窗口内各个控件大小及位置的改变!
===================================================
②、建立工程:
新建一对话框工程,布置好相应的控件,如具体程序:
为对话框按钮添加“最大化”按钮,看看尴尬的现象……
===================================================
③、响应 WM_SIZE 消息,进行各个控件位置的调整:
  1. void CDrawTestDlg::OnSize(UINT nType, int cx, int cy)
  2. {
  3.         CDialog::OnSize(nType, cx, cy);

  4.         CEdit *pEdit = (CEdit *)GetDlgItem(IDC_PATH_EDIT);
  5.         CButton *pBrowseBtn = (CButton *)GetDlgItem(IDC_BROWSE_BTN);
  6.         CButton *pStartBtn = (CButton *)GetDlgItem(IDC_START_BTN);
  7.         CListCtrl *pListCtrl = (CListCtrl *)GetDlgItem(IDC_LIST);

  8.         if (bStarted){
  9.                 /////////////////////////////////////////////////////////////////////
  10.                 //以下是编辑框控件的变化
  11.                 CRect editRect1, editRect2;
  12.                 pEdit->GetWindowRect(&editRect1);
  13.                 pEdit->SetWindowPos(NULL, 0, 0, cx-180, editRect1.Height(), SWP_NOMOVE|SWP_NOZORDER);
  14.                 pEdit->GetWindowRect(&editRect2);
  15.                 int off = editRect2.Width()-editRect1.Width();
  16.                 /////////////////////////////////////////////////////////////////////
  17.                 //以下是按钮控件的变化
  18.                 CRect browseRect;
  19.                 pBrowseBtn->GetWindowRect(&browseRect);
  20.                 ScreenToClient(&browseRect);

  21.                 CRect startRect;
  22.                 pStartBtn->GetWindowRect(&startRect);
  23.                 ScreenToClient(&startRect);

  24.                 pBrowseBtn->SetWindowPos(NULL, browseRect.left+off, browseRect.top, 0, 0, SWP_NOSIZE|SWP_NOZORDER);
  25.                 pStartBtn->SetWindowPos(NULL, startRect.left+off, startRect.top, 0, 0, SWP_NOSIZE|SWP_NOZORDER);
  26.                 /////////////////////////////////////////////////////////////////////
  27.                 //以下是高级列表控件的变化
  28.                 CRect listRect;
  29.                 pListCtrl->GetWindowRect(&listRect);
  30.                 ScreenToClient(&listRect);

  31.                 pStartBtn->GetWindowRect(&startRect);
  32.                 ScreenToClient(&startRect);

  33.                 listRect.right = startRect.right;
  34.                 listRect.bottom = cy-10;
  35.                 pListCtrl->SetWindowPos(NULL, 0, 0, listRect.Width(), listRect.Height(), SWP_NOMOVE|SWP_NOZORDER);
  36.                 Invalidate(TRUE);
  37.         }
  38. }
复制代码

===================================================
④、让对话框支持动态拉伸:
对话框的 Border 属性设置为:Resizing 就可以了!
===================================================
⑤、控制窗口最大化时的大小:响应 WM_GETMINMAXINFO 消息
  1. void CDrawTestDlg::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
  2. {
  3.         //lpMMI->ptMinTrackSize.x = m_WndRect.Width();
  4.         //lpMMI->ptMinTrackSize.y = m_WndRect.Height();

  5.         int screenWidth = GetSystemMetrics(SM_CXSCREEN);
  6.         //int screenHeight = GetSystemMetrics(SM_CYSCREEN);

  7.         lpMMI->ptMaxSize.x = screenWidth;
  8.         lpMMI->ptMaxSize.y = 300;

  9.         CRect mRect;
  10.         GetWindowRect(&mRect);
  11.         lpMMI->ptMaxPosition.x =(screenWidth-lpMMI->ptMaxSize.x)/2;
  12.         lpMMI->ptMaxPosition.y = mRect.top;

  13.         CDialog::OnGetMinMaxInfo(lpMMI);
  14. }
复制代码

===================================================
※※※ 小作业:对话框大小发生变化时,动态调整 ListCtrl 控件的各个列的宽度!
------------------------------------- End -------------------------------------------------

相关课程演示细节还请观看视频教程!
本套教程由VC驿站原创,提供视频教程+售后答疑服务!
教程介绍及详情请见:https://www.cctry.com/static/vip/index.html
VC驿站Vip会员详情请见:https://www.cctry.com/static/vip/index.html




上一篇:VC++高级班之窗口篇-[15]实现不规则半透明的窗口
下一篇:VC++高级班之窗口篇-[17]实现任务栏托盘与气泡提示

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

97_avatar_middle
在线会员 kuroro 发表于 2018-3-12 11:39:03 | 显示全部楼层
我还等着这大佬坐小作业呢 ,几天了都没人来

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

51_avatar_middle
ico_lz  楼主| Syc 发表于 2018-3-12 11:42:34 | 显示全部楼层
kuroro 发表于 2018-3-12 11:39
我还等着这大佬坐小作业呢 ,几天了都没人来

这个是VC驿站之前的教程,现在发出来只是想再次做下宣传推广,让百度更好的收录下!VC++高级班之窗口篇-[16]实现对话框的自适应最大化功能

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

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

GMT+8, 2018-12-15 20:53

Powered by Discuz! X3.4

© 2009-2018 cctry.com

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