遗留MFC工程上调整对话框大小

28 篇文章 0 订阅
23 篇文章 0 订阅

在遗留MFC工程上,调整对话框对象,以达到隐藏不关注的那些控件。

诉求:一个老的工程上,现在只需要其中很小一部分功能,想偷懒,不需要全部重写,不想大规模改写。比如如果直接去删除对话框上的一些控件,那么这些控件映射的成员变量、消息处理,都需要考虑。

偷懒的做法:把不需要的控件全部给扔到对话框的下面,要用到的部分布局到对话框的左上角。在对话框初始化的时候调整窗口大小,隐藏掉那些用不到的控件。

示例:

原来的样子如下,现在只需要保留上面3个控件(2个编辑框加一个文本框)。

before

即希望的样子:

after

对话框资源:

IDD_CHANGEWINDOWSIZE_DIALOG DIALOGEX 0, 0, 222, 153
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_APPWINDOW
CAPTION "ChangeWindowSize"
FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
    GROUPBOX        "All Controls",IDC_GROUP,14,7,192,139
    PUSHBUTTON      "First",IDC_FIRST,26,20,77,20,WS_DISABLED
    PUSHBUTTON      "Second",IDC_SECOND,117,20,77,20
    EDITTEXT        IDC_THIRD,26,52,168,20,ES_AUTOHSCROLL
    PUSHBUTTON      "Fourth",IDC_FOURTH,26,85,77,20,WS_DISABLED
    PUSHBUTTON      "Fifth",IDC_FIFTH,118,85,77,20,WS_DISABLED
    EDITTEXT        IDC_SOME_OTHERS,25,112,168,20,ES_AUTOHSCROLL | WS_DISABLED
END

在隐藏下半部分的时候,需要注意Group控件的显示效果,即要完整地显示这个group,而不是显示一个残缺的样子:

Error

思路:

  • 先确定要显示的编辑框的bottom坐标
  • 基于此,调整Group控件的bottom坐标
  • 调整对话框的bottom坐标

代码:

void CChangeWindowSizeDlg::ChangeWindowSize()
{
    CRect rect;

    GetDlgItem(IDC_THIRD)->GetWindowRect(&rect);
    int bottom = rect.bottom;

    GetDlgItem(IDC_GROUP)->GetWindowRect(&rect);
    rect.bottom = bottom + 10;
    ScreenToClient(&rect);
    GetDlgItem(IDC_GROUP)->MoveWindow(&rect);

    GetClientRect(&rect);
    rect.bottom = bottom + 20;
    MoveWindow(&rect);
}

在OnInitDialog()中调用这个函数。

还需要主要的是:对话框的Border不能是Resizing属性,否则用户通过调整对话框的大小,就可以看到下面本该隐藏的部分。

Border

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值