• 考古:MFC界面的自适应缩放(代码示例)


    初级代码游戏的专栏介绍与文章目录-CSDN博客

            MFC窗体的控件的自适应缩放早期VS开发环境是不支持的,后来VS开发环境提供了支持但也简单,或者固定的缩放比例不符合要求。我一向坚持一个理念:“不支持缩放的窗口不是好窗口”,所以需要有一个自定义的缩放处理。机制不复杂,就是重载OnSize处理窗口大小变化。

            这是对话框的OnSize,MFC会自动生成这个函数的框架:

    1. void CMyDlg::OnSize(UINT nType, int cx, int cy)
    2. {
    3. CDialog::OnSize(nType, cx, cy);
    4. // TODO: Add your message handler code here
    5. switch(nType)
    6. {
    7. case SIZE_MAXIMIZED:
    8. break;
    9. case SIZE_RESTORED:
    10. break;
    11. case SIZE_MINIMIZED:
    12. ShowWindow(SW_HIDE);
    13. break;
    14. default:
    15. return;
    16. }
    17. MoveCtrl(cx,cy);//这个函数是自己写的,重新设定控件位置
    18. }

            MoveCtrl是自己定义的函数,在里面重新计算布局,设置空间位置即可。之所以要写成个函数,是因为这个函数在OnInitDialog里也需要执行一次,以便完成初始布局,这样设计对话框的时候就不用那么精确了,控件随便摆一下就行了。

            OnInitDialog的处理:

    1. RECT rect;
    2. //初始化控件
    3. GetClientRect(&rect);
    4. MoveCtrl(rect.right, rect.bottom);

            因为子控件都是基于父窗口的客户区的,所以用对话框的客户区的大小为基准来设置子控件。

            这是MoveCtrl的一个示例:

    1. int CProxyDlg::MoveCtrl(int cx, int cy)
    2. {
    3. RECT rect;
    4. //工具栏,顶
    5. if(IsWindow(m_MainToolBar))
    6. {
    7. m_MainToolBar.MoveWindow(0,0,cx,toolbarhigh);
    8. }
    9. //系统,中,左
    10. if(IsWindow(m_Tab_Sys.m_hWnd) && IsWindow(m_Tree_Sys.m_hWnd) && IsWindow(m_Tree_User.m_hWnd))
    11. {
    12. rect.left=bdry;
    13. rect.right=bdry+tabsyswide;
    14. rect.top=toolbarhigh;
    15. rect.bottom=cy-statehigh;
    16. m_Tab_Sys.MoveWindow(&rect);
    17. m_Tab_Sys.GetWindowRect(&rect);
    18. m_Tab_Sys.SendMessage(TCM_ADJUSTRECT,(WPARAM)FALSE,(LPARAM)&rect);
    19. ScreenToClient(&rect);
    20. m_Tree_Sys.MoveWindow(&rect);
    21. m_Tree_User.MoveWindow(&rect);
    22. }
    23. //当前连接,中,右
    24. if(IsWindow(m_Tree.m_hWnd))
    25. {
    26. rect.left=bdry+tabsyswide+sepwide;
    27. rect.right=cx-bdry;
    28. rect.top=toolbarhigh;
    29. rect.bottom=cy-statehigh;
    30. m_Tree.MoveWindow(&rect);
    31. }
    32. //状态栏,底
    33. if(IsWindow(m_Static_State.m_hWnd))
    34. {
    35. rect.left=0;
    36. rect.right=cx;
    37. rect.top=cy-statehigh;
    38. rect.bottom=cy;
    39. m_Static_State.MoveWindow(&rect);
    40. }
    41. return 1;
    42. }

            主要用到IsWindow来判断控件是否已经创建、MoveWindow来移动控件,其余就是各种布局计算。

            有兴趣可以自己写一套布局类,不过真正理想的界面除了自适应缩放,还应该能拉伸调整,这就困难些了,别的高级语言或类库,直接提供了split面板,不用自己写。

    (这里是结束)

  • 相关阅读:
    骨传导耳机对大脑有影响吗?骨传导耳机到底好不好
    seaborn学习笔记(四):箱型图、小提琴图
    Dubbo高手之路2,6种扩展机制详解
    基于堆叠⾃编码器的时间序列预测 深层神经网络
    CData Arc v22API工作流
    337. 打家劫舍 III
    前端vue使用onlyoffice控件实现word在线编辑、预览(仅列出前端部分需要做的工作,不包含后端部分)
    数据结构与算法之美读书笔记11
    word模板内容替换
    Java 效率工具, 大幅度提高开发效率
  • 原文地址:https://blog.csdn.net/2301_77171572/article/details/133785963