• MFC 控件布局随窗口大小自动变化大小 位置


    参考抄袭:

    控件布局通用解决方案

    在stdafx.h中增加代码,目的是在哪都容易调用

      1 // CtrlId           : 控件ID
      2 // LeftChangeMode   : 0:与窗口客户区左边的距离不变; 1:按比例变化; 2:保持控件宽度不变;
      3 // RightChangeMode  : 0:与窗口客户区右边的距离不变; 1:按比例变化; 2:保持控件宽度不变;
      4 // TopChangeMode    : 0:与窗口客户区上边的距离不变; 1:按比例变化; 2:保持控件高度不变;
      5 // BottomChangeMode : 0:与窗口客户区下边的距离不变; 1:按比例变化; 2:保持控件高度不变;
      6 #ifndef AUTO_SET_CONTROL_POS
      7 
      8 // LeftChangeMode取值宏定义
      9 #define LEFT_CHANGE_MODE_FIXED_LEFTPADDING    0
     10 #define LEFT_CHANGE_MODE_RATIO                1
     11 #define LEFT_CHANGE_MODE_FIXED_WIDTH          2
     12 
     13 // RightChangeMode取值宏定义
     14 #define RIGHT_CHANGE_MODE_FIXED_RIGHTPADDING  0
     15 #define RIGHT_CHANGE_MODE_RATIO               1
     16 #define RIGHT_CHANGE_MODE_FIXED_WIDTH         2
     17 
     18 // TopChangeMode取值宏定义
     19 #define TOP_CHANGE_MODE_FIXED_TOPPADDING      0
     20 #define TOP_CHANGE_MODE_RATIO                 1
     21 #define TOP_CHANGE_MODE_FIXED_HEIGHT          2
     22 
     23 // BottomChangeMode取值宏定义
     24 #define BOTTOM_CHANGE_MODE_FIXED_LEFEPADDING  0
     25 #define BOTTOM_CHANGE_MODE_RATIO              1
     26 #define BOTTOM_CHANGE_MODE_FIXED_HEIGHT       2
     27 
     28 #define AUTO_SET_CONTROL_POS(CtrlId, LeftChangeMode, RightChangeMode, TopChangeMode, BottomChangeMode)
     29 {
     30     static int   nFirstCtrlId = -1; 
     31     static CRect rectLastClientWindow; 
     32     static CRect rectLastClientWindowTmp; 
     33 if (-1 == nFirstCtrlId)
     34     {
     35     nFirstCtrlId = CtrlId; 
     36     }
     37 if (nFirstCtrlId == CtrlId)
     38     {
     39     rectLastClientWindowTmp = rectLastClientWindow; 
     40     }
     41     rectLastClientWindow.right = cx; 
     42     rectLastClientWindow.bottom = cy; 
     43     CWnd *pWndDlgItem = GetDlgItem(CtrlId); 
     44 if (pWndDlgItem)
     45     {
     46     CRect rectDlgItem; 
     47     pWndDlgItem->GetWindowRect(rectDlgItem); 
     48     ScreenToClient(rectDlgItem); 
     49     
     50     static int   nDefaultLeftPadding_##CtrlId = rectDlgItem.left; 
     51     static float fDefaultLeftRatio_##CtrlId = (float)rectDlgItem.left
     52     / rectLastClientWindowTmp.right; 
     53     static int   nDefaultRightPadding_##CtrlId = rectLastClientWindowTmp.right
     54     - rectDlgItem.right; 
     55     static float fDefaultRightRatio_##CtrlId = (float)rectDlgItem.right
     56     / rectLastClientWindowTmp.right; 
     57     static int   nDefaultCtrlWidth_##CtrlId = rectDlgItem.right - rectDlgItem.left; 
     58     int          nXChangeMode = (LeftChangeMode << 8) + RightChangeMode; 
     59     
     60     static int   nDefaultTopPadding_##CtrlId = rectDlgItem.top; 
     61     static float fDefaultTopRatio_##CtrlId = (float)rectDlgItem.top
     62     / rectLastClientWindowTmp.bottom; 
     63     static int   nDefaultBottomPadding_##CtrlId = rectLastClientWindowTmp.bottom
     64     - rectDlgItem.bottom; 
     65     static float fDefaultBottomRatio_##CtrlId = (float)rectDlgItem.bottom
     66     / rectLastClientWindowTmp.bottom; 
     67     static int   nDefaultCtrlHeight_##CtrlId = rectDlgItem.bottom - rectDlgItem.top; 
     68     int          nYChangeMode = (TopChangeMode << 8) + BottomChangeMode; 
     69     
     70 if (0x0000 == nXChangeMode)
     71         {
     72         rectDlgItem.right = cx - nDefaultRightPadding_##CtrlId; 
     73         }
     74         else if (0x0001 == nXChangeMode)
     75         {
     76         rectDlgItem.right = fDefaultRightRatio_##CtrlId * cx; 
     77         }
     78         else if (0x0002 == nXChangeMode)
     79         {
     80         /*这里不用更改*/
     81         }
     82         else if (0x0100 == nXChangeMode)
     83         {
     84         rectDlgItem.left = fDefaultLeftRatio_##CtrlId * cx; 
     85         rectDlgItem.right = cx - nDefaultRightPadding_##CtrlId; 
     86         }
     87         else if (0x0101 == nXChangeMode)
     88         {
     89         rectDlgItem.left = fDefaultLeftRatio_##CtrlId * cx; 
     90         rectDlgItem.right = fDefaultRightRatio_##CtrlId * cx; 
     91         }
     92         else if (0x0102 == nXChangeMode)
     93         {
     94         rectDlgItem.left = fDefaultLeftRatio_##CtrlId * cx; 
     95         rectDlgItem.right = rectDlgItem.left + nDefaultCtrlWidth_##CtrlId; 
     96         }
     97         else if (0x0200 == nXChangeMode)
     98         {
     99         rectDlgItem.right = cx - nDefaultRightPadding_##CtrlId; 
    100         rectDlgItem.left = rectDlgItem.right - nDefaultCtrlWidth_##CtrlId; 
    101         }
    102         else if (0x0201 == nXChangeMode)
    103         {
    104         rectDlgItem.right = fDefaultRightRatio_##CtrlId * cx; 
    105         rectDlgItem.left = rectDlgItem.right - nDefaultCtrlWidth_##CtrlId; 
    106         }
    107         else if (0x0202 == nXChangeMode)
    108         {
    109         /*这里不用更改*/
    110         }
    111         
    112         
    113 if (0x0000 == nYChangeMode)
    114         {
    115         rectDlgItem.bottom = cy - nDefaultBottomPadding_##CtrlId; 
    116         }
    117         else if (0x0001 == nYChangeMode)
    118         {
    119         rectDlgItem.bottom = fDefaultBottomRatio_##CtrlId * cy; 
    120         }
    121         else if (0x0002 == nYChangeMode)
    122         {
    123         /*这里不用更改*/
    124         }
    125         else if (0x0100 == nYChangeMode)
    126         {
    127         rectDlgItem.top = fDefaultTopRatio_##CtrlId * cy; 
    128         rectDlgItem.bottom = cy - nDefaultBottomPadding_##CtrlId; 
    129         }
    130         else if (0x0101 == nYChangeMode)
    131         {
    132         rectDlgItem.top = fDefaultTopRatio_##CtrlId * cy; 
    133         rectDlgItem.bottom = fDefaultBottomRatio_##CtrlId * cy; 
    134         }
    135         else if (0x0102 == nYChangeMode)
    136         {
    137         rectDlgItem.top = fDefaultTopRatio_##CtrlId * cy; 
    138         rectDlgItem.bottom = rectDlgItem.top + nDefaultCtrlHeight_##CtrlId; 
    139         }
    140         else if (0x0200 == nYChangeMode)
    141         {
    142         rectDlgItem.bottom = cy - nDefaultBottomPadding_##CtrlId; 
    143         rectDlgItem.top = rectDlgItem.bottom - nDefaultCtrlHeight_##CtrlId; 
    144         }
    145         else if (0x0201 == nYChangeMode)
    146         {
    147         rectDlgItem.bottom = fDefaultBottomRatio_##CtrlId * cy; 
    148         rectDlgItem.top = rectDlgItem.bottom - nDefaultCtrlHeight_##CtrlId; 
    149         }
    150         else if (0x0202 == nYChangeMode)
    151         {
    152         /*这里不用更改*/
    153         }
    154         pWndDlgItem->MoveWindow(rectDlgItem); 
    155     }
    156 }
    157 #endif

    增加对话框的WM_SIZE消息处理函数

    1 AUTO_SET_CONTROL_POS(IDC_xxx, LEFT_CHANGE_MODE_RATIO, RIGHT_CHANGE_MODE_RATIO, TOP_CHANGE_MODE_RATIO, BOTTOM_CHANGE_MODE_RATIO);

    每一个控件都要调用这个宏,参数调试调试看看参数说明

  • 相关阅读:
    Golang Gin使用模板及框架下返回Json
    Golang Web下返回HTML内容处理方法
    Golang net.http和Gin框架下的模板--View调用后台方法 --view接收后台数据的运用 及 嵌套模板和继承模板的使用
    设置oracle编辑的快捷方式
    oracle中的异常处理方法
    游标的使用
    网站登录界面包数据库异常
    在PLSQL中不能使用中文作为查询条件查询数据
    oracle错误一览表
    oracle导入时报错
  • 原文地址:https://www.cnblogs.com/ckrgd/p/14135413.html
Copyright © 2020-2023  润新知