对话框变化大小后。CBCGPListCtrl、CListCtrl重新显示行数列数m_list_.Arrange(LVA_ALIGNTOP);

h文件中

afx_msg void OnSize(UINT nType, int cx, int cy);

void ResizeUI();

vector<CRect> m_vec_rect_;

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
BEGIN_MESSAGE_MAP(CDlgXXX, CBCGPDialog)
    ON_WM_SIZE()
     
END_MESSAGE_MAP()
 
BOOL CDlgXXX::OnInitDialog()
{
    CBCGPDialog::OnInitDialog();
    EnableVisualManagerStyle(TRUE,TRUE);
 
******
 
    //获取区域
    CRect rect;
    GetWindowRect(&rect);
    m_vec_rect_.push_back(rect);
    CWnd* pWnd = GetWindow(GW_CHILD);//获取子窗体 
    while (pWnd)
    {
        pWnd->GetWindowRect(rect);
        m_vec_rect_.push_back(rect);
        pWnd = pWnd->GetNextWindow();
    }
     
    return TRUE;
}
 
 
void CDlgXXX::OnSize(UINT nType, int cx, int cy)
{
    CBCGPDialog::OnSize(nType, cx, cy);
    if (nType != SIZE_MINIMIZED)
    {
        ResizeUI();
    }
}
 
void CDlgXXX::ResizeUI()
{
    if (m_vec_rect_.size() > 0)
    {
        CRect rect;
        GetWindowRect(&rect);
        ScreenToClient(rect);
 
        //第一个保存的是对话框的Rect 
        CRect saveRect = m_vec_rect_[0];
        //根据当前和之前保存的对话框的宽高求比例 
        float x = rect.Width() * 1.0f / saveRect.Width();
        float y = rect.Height() * 1.0f / saveRect.Height();
 
        int iSize = m_vec_rect_.size();
        int idx = 1;
        ClientToScreen(rect);
        CRect saveChild;
        CWnd* pWnd = GetWindow(GW_CHILD);
        while (pWnd && idx < iSize)
        {
            saveChild = m_vec_rect_[idx];
            //根据比例调整控件上下左右距离对话框的距离 
            saveChild.left = rect.left + (saveChild.left - saveRect.left) * x;
            saveChild.right = rect.right + (saveChild.right - saveRect.right) * x;
            saveChild.top = rect.top + (saveChild.top - saveRect.top) * y;
            saveChild.bottom = rect.bottom + (saveChild.bottom - saveRect.bottom) * y;
            ScreenToClient(saveChild);
            pWnd->MoveWindow(saveChild);
 
            pWnd = pWnd->GetNextWindow();
            ++idx;
        }
 
        if (m_list_.m_hWnd)
        {
            m_list_.Arrange(LVA_ALIGNTOP);
        }
    }
}

  

if (m_list_.m_hWnd)
{
m_list_.Arrange(LVA_ALIGNTOP);
}

posted @   曦花  阅读(44)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示