比如在对话框CTestDlg上放置一个CTabCtrl控件,现在想根据CTestDlg对话框的尺寸来设置CTabCtrl控件的尺寸,以及该控件在CTestDlg上的位置?

解决方案 »

  1.   


    在窗口的WM_SIZE中控制,当改变窗口大小时,会随着改变。
      

  2.   

    CRect rectclient;
    GetClientRect(&rectclient);m_ctrlTab.MoveWindow(0,0,rectclient.Width()/2,rectclient.Height()/2)  //m_ctrlTab为TabCtrl关联变量
      

  3.   

    首先确定好对话框客户区与控件的大小比例或者边缘留出的宽度和高度,然后响应对话框的WM_SIZE消息,根据参数中给出的新的客户区宽度和高度计算出控件的宽度和高度,然后设置控件尺寸。
      

  4.   

    ls都对,比例需要计算,然后再moveWindow
      

  5.   

    高人帮忙看看下面代码,仅仅是一个对话框上加一个按钮,然后用WM_SIZE来响应对话框大小变化,然后在OnSize()中改变按钮的大小。但是运行不了,为什么?// xxTabRectDlg.cpp : implementation file
    //#include "stdafx.h"
    #include "xxTabRect.h"
    #include "xxTabRectDlg.h"#ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif/////////////////////////////////////////////////////////////////////////////
    // CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialog
    {
    public:
    CAboutDlg();// Dialog Data
    //{{AFX_DATA(CAboutDlg)
    enum { IDD = IDD_ABOUTBOX };
    //}}AFX_DATA // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CAboutDlg)
    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    //}}AFX_VIRTUAL// Implementation
    protected:
    //{{AFX_MSG(CAboutDlg)
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
    };CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
    {
    //{{AFX_DATA_INIT(CAboutDlg)
    //}}AFX_DATA_INIT
    }void CAboutDlg::DoDataExchange(CDataExchange* pDX)
    {
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CAboutDlg)
    //}}AFX_DATA_MAP
    }BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
    //{{AFX_MSG_MAP(CAboutDlg)
    // No message handlers
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
    // CXxTabRectDlg dialogCXxTabRectDlg::CXxTabRectDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CXxTabRectDlg::IDD, pParent)
    {
    //{{AFX_DATA_INIT(CXxTabRectDlg)
    // NOTE: the ClassWizard will add member initialization here
    //}}AFX_DATA_INIT
    // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }void CXxTabRectDlg::DoDataExchange(CDataExchange* pDX)
    {
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CXxTabRectDlg)
    // NOTE: the ClassWizard will add DDX and DDV calls here
    //}}AFX_DATA_MAP
    }BEGIN_MESSAGE_MAP(CXxTabRectDlg, CDialog)
    //{{AFX_MSG_MAP(CXxTabRectDlg)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_WM_SIZE()
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
    // CXxTabRectDlg message handlersBOOL CXxTabRectDlg::OnInitDialog()
    {
    CDialog::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range.
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
    CString strAboutMenu;
    strAboutMenu.LoadString(IDS_ABOUTBOX);
    if (!strAboutMenu.IsEmpty())
    {
    pSysMenu->AppendMenu(MF_SEPARATOR);
    pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
    }
    } // Set the icon for this dialog.  The framework does this automatically
    //  when the application's main window is not a dialog
    SetIcon(m_hIcon, TRUE); // Set big icon
    SetIcon(m_hIcon, FALSE); // Set small icon

    // TODO: Add extra initialization here
    CRect rect;
    this->GetClientRect(&rect); CWnd *pWnd;
    pWnd=GetDlgItem(IDC_BUTTON1);
    pWnd->MoveWindow(5,5,rect.Width()/3,rect.Height()/3);

    return TRUE;  // return TRUE  unless you set the focus to a control
    }void CXxTabRectDlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
    CAboutDlg dlgAbout;
    dlgAbout.DoModal();
    }
    else
    {
    CDialog::OnSysCommand(nID, lParam);
    }
    }// If you add a minimize button to your dialog, you will need the code below
    //  to draw the icon.  For MFC applications using the document/view model,
    //  this is automatically done for you by the framework.void CXxTabRectDlg::OnPaint() 
    {
    if (IsIconic())
    {
    CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle
    int cxIcon = GetSystemMetrics(SM_CXICON);
    int cyIcon = GetSystemMetrics(SM_CYICON);
    CRect rect;
    GetClientRect(&rect);
    int x = (rect.Width() - cxIcon + 1) / 2;
    int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon
    dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
    CDialog::OnPaint();
    }
    }// The system calls this to obtain the cursor to display while the user drags
    //  the minimized window.
    HCURSOR CXxTabRectDlg::OnQueryDragIcon()
    {
    return (HCURSOR) m_hIcon;
    }void CXxTabRectDlg::OnSize(UINT nType, int cx, int cy) 
    {
    CDialog::OnSize(nType, cx, cy);

    // TODO: Add your message handler code here
    CRect rcDlg(0,0,cx,cy);
    GetDlgItem(IDC_BUTTON1)->MoveWindow(0,0,rcDlg.Width(),rcDlg.Height());
    }
      

  6.   

    先判断nType==0再设置按钮大小。
    另外,OnInitDialog中的代码应该是不需要的。OnSize中MoveWindow的参数怎么与OnInitDialog中的不同?
      

  7.   

    还有一点,MoveWindow要给屏幕坐标。
      

  8.   

    可以用ClientToScreen把相对坐标转为屏幕坐标。
      

  9.   

    如果我先建立一个主对话框CTestDlg,在其上放置一个CTabCtrl控件,Insert两个Tab页CTabDlg1,CTabDlg2,
    然后在CTabDlg1上放置一个static组框。
    现在希望当主对话框CTestDlg大小变化时,CTabCtrl控件随之改变大小,而CTabDlg1和CTabDlg2也随之改变,并且static组框也随之改变。这样的案例该怎么弄了,我试的总达不到目的.......
      

  10.   

    自动扩大按钮的代码在你的知道下已经成功了,然后我把相同的道理用在这个案例上时,CTabCtrl可以随窗口改变大小,但是static没有变化
      

  11.   

    所有控件都要一起改变,CTabCtrl、CTabDlg1、CTabDlg2、CStatic都要重新调整尺寸。
      

  12.   

    我测试改了改
    关键在于第一次还没有resize时会出错
    所以要先判断一下是不是空句柄void CCstest11Dlg::OnSize(UINT nType, int cx, int cy) 
    {
    CDialog::OnSize(nType, cx, cy);

    // TODO: Add your message handler code here
    CRect rect(0,0,cx,cy);
    CWnd* pWnd=GetDlgItem(IDC_BUTTON1);
    if(pWnd->GetSafeHwnd())
    {
    pWnd->MoveWindow(rect,true); }
      

  13.   

    在窗口的WM_SIZE中控制,当改变窗口大小时,计算改变大小,然后MoveWindow。
      

  14.   

    用Jruler(一个工具)量屏幕,然后用MoveWindows移动控件