我现在做一个项目,有一个大的对话框.
我的子模块是一个小的对话框,嵌套在这个大对话框里面的,
现在要随着主程序的对话框的大小变化.就是主程序的大对话框如果最大化,或者被拖动了.
而我的这个子模块里面的2个控件,也要随着这个对话框的大小而变动.
一个是树形控件,一个是列表框控件,
有没有高手指教下,不知道我是否说清了!

解决方案 »

  1.   

    在OnSize消息函数中,不断更新设置那两个控件的大小和位置不就OK咯?
      

  2.   

    http://www.codeproject.com/KB/dialog/easysize.aspx楼主请看
      

  3.   

    响应OnSize消息,在该函数中根据主窗口的大小设置子窗口的大小和子窗口控件的大小及位置。这样每次主窗口变化时子窗口就会自动调整。
      

  4.   

    主对话框大小变化的时候,也就是在主对话框的OnSize消息响应里面,给你的那个模块对话框发消息(包括发送主对话框变化的参数比例),你在消息响应函数里调整你控件的大小,刚做过这个东西
      

  5.   

    呵呵  顶  movewindow()什么的 用上
      

  6.   

    这个意思吧
    http://blog.csdn.net/xianglitian/archive/2010/06/12/5667015.aspx
      

  7.   


    //全局变量声明
    //主对话框的窗口句柄
    HWND g_hWnd = NULL;
    //对话框改变之前的大小
    SIZE g_siDlg = {0};//函数声明
    //对话框过程函数
    INT_PTR CALLBACK 
    DlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
    //对话框命令响应
    void OnCommand(WPARAM wp, LPARAM lp);
    //WM_SIZE消息响应
    void OnSize(WPARAM wp, LPARAM lp);
    //按照指定规则移动某个控件
    void MoveCtrl(UINT nID, int x, int y, BOOL bLeft, BOOL bTop, BOOL bRight, BOOL bBottom);
    //将屏幕坐标转换为窗体坐标
    void ScreenToClientRect(LPRECT prc);//应用程序的入口函数
    int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow)
    {
    //弹出一个模式对话框,并等待对话框结束
    DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, DlgProc);
    return 0;
    }
    //对话框过程函数
    INT_PTR CALLBACK 
    DlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
    switch(uMsg) 
    {
    case WM_INITDIALOG: //对话框初始化
    {
    //保存窗口原始尺寸
    RECT rc = {0};
    GetClientRect(hwndDlg, &rc);
    g_siDlg.cx = rc.right - rc.left;
    g_siDlg.cy = rc.bottom - rc.top;
    //保存窗口句柄
    g_hWnd = hwndDlg;
    return 1;
    }
    case WM_COMMAND: //发生命令
    OnCommand(wParam, lParam);
    return 1;
    case WM_CLOSE: //关闭对话框
    EndDialog(hwndDlg, 0);
    return 1;
    case WM_SIZE: //对话框大小改变
    OnSize(wParam, lParam);
    return 1;
    default:
    break;
    }
    //默认返回0
    return 0;
    }
    //对话框命令响应
    void OnCommand(WPARAM wp, LPARAM lp)
    {
    int nID = LOWORD(wp);
    switch(nID)
    {
    //单击“确定”或“取消”按钮时结束对话框
    case IDOK:
    case IDCANCEL:
    SendMessage(g_hWnd, WM_CLOSE, 0, 0);
    break;
    }
    }
    //WM_SIZE消息响应
    void OnSize(WPARAM wp, LPARAM lp)
    {
    //只处理必要的消息,对于非必要消息直接返回
    switch(wp)
    {
    case SIZE_MAXHIDE:
    case SIZE_MAXSHOW:
    case SIZE_MINIMIZED:
    return;
    }
    //取得对话框的新大小
    int nWidth = LOWORD(lp);
    int nHeight = HIWORD(lp);
    //获得改变的差值
    int x, y;
    x = nWidth - g_siDlg.cx;
    y = nHeight - g_siDlg.cy;
    //移动“确定”按钮
    MoveCtrl(IDOK, x, y, TRUE, FALSE, TRUE, FALSE);
    //移动“取消”按钮
    MoveCtrl(IDCANCEL, x, y, TRUE, FALSE, TRUE, FALSE);
    //移动文本框
    MoveCtrl(IDC_EDT_TEST, x, y, FALSE, FALSE, TRUE, TRUE);
    //移动静态文本控件
    MoveCtrl(IDC_BOTTOM, x, y, FALSE, TRUE, FALSE, TRUE);
    //刷新整个窗口
    InvalidateRect(g_hWnd, NULL, FALSE);
    //保存当前大小
    g_siDlg.cx = nWidth;
    g_siDlg.cy = nHeight;
    }
    //按照指定规则移动某个控件
    void MoveCtrl(UINT nID, int x, int y, BOOL bLeft, BOOL bTop, BOOL bRight, BOOL bBottom)
    {
    //获取控件句柄
    HWND hCtrl = GetDlgItem(g_hWnd, nID);
    //取得控件位置和大小
    RECT rc = {0};
    GetWindowRect(hCtrl, &rc);
    //将屏幕坐标转换为窗口坐标
    ScreenToClientRect(&rc);
    //根据选项改变位置和大小
    if(bLeft)
    rc.left += x;
    if(bTop)
    rc.top += y;
    if(bRight)
    rc.right += x;
    if(bBottom)
    rc.bottom += y;
    //移动控件
    MoveWindow(hCtrl, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, FALSE);
    }
    //将屏幕坐标转换为窗体坐标
    void ScreenToClientRect(LPRECT prc)
    {
    ScreenToClient(g_hWnd, (LPPOINT)prc);
    ScreenToClient(g_hWnd, ((LPPOINT)prc) + 1);
    }
      

  8.   

    只能在 onsize 的时候  计算窗体大小 然后按比例 挪动控件位置和大小  
    movewindow