对话框为WS_POPUP的,Border为Resizing有最大化按钮,窗口在创建的时候是先发WM_INITDIALOG消息还是先发WM_SIZE消息啊?
我在窗口中有个Group Box控件,想使他随窗口大小的改变而改变自己的大小来适应窗口。在窗口类中定义了一个CRect m_rectDlgClient;并在OnInitDialog()中
GetClientRect(&m_rectDlgClient);然后在OnSize函数中加入
void CXXXDlg::OnSize(UINT nType, int cx, int cy) 
{ CDialog::OnSize(nType, cx, cy);
CRect rect;
if ((m_rectDlgClient.Width() != 0) && (m_rectDlgClient.Height() != 0) && (nType != SIZE_MINIMIZED))
{
GetDlgItem(IDC_GROUPBOX)->GetWindowRect(&rect);
ScreenToClient(&rect);
rect.SetRect(rect.left,rect.top,rect.right+cx-m_rectDlgClient.Width(),rect.bottom);
GetDlgItem(IDC_GROUPBOX)->MoveWindow(&rect);

}
if (nType != SIZE_MINIMIZED) 
{
GetClientRect(&m_rectDlgClient);
}
}
为什么我在Debug模式下面运行就是正常的,而在Release模式下运行的时候说
内存不能读啊?在这一句GetDlgItem(IDC_GROUPBOX)->GetWindowRect(&rect);
的时候出错
而把窗口风格改成Overlapped就可以正常运行,Popup的对话框和Overlapped的对话框有什么区别吗?我在Release下在OnInitDialog和OnSize函数中设置断点时,程序是先在OnSize中先断的,请问大家是怎么回事啊?能不能给一个关于对话框的OnSize处理的例程,谢谢大家了

解决方案 »

  1.   

    先发WM_SIZE
    在OnSize中判断窗口是否被创建出来即可
    void CXXXDlg::OnSize(UINT nType, int cx, int cy) 
    {
        if (m_wndStatus.GetSafeHwnd() != NULL)
        {......}
    }
      

  2.   

    最大化按钮,窗口在创建的时候是先发WM_INITDIALOG消息还是先发WM_SIZE消息啊?
    --------------
    可以自己做个试验啊。分别在里面设置断点,然后test啊试验结果先进入WM_SIZE  再到WM_INITDIALOG
      

  3.   

    你的代码中
    要判断GetDlgItem(IDC_GROUPBOX)的返回值是否为NULL,或者直接判断对话框是否被创建完成GetSafeHwnd() == NULL .....如果创建完成再调用GetDlgItem(IDC_GROUPBOX)
      

  4.   

    http://www.codeproject.com/dialog/easysize.asp
      

  5.   

    建议响应OnWindowPosChanged,void CMyDlg::OnWindowPosChanged(WINDOWPOS* lpwndpos)
    {
    CDialog::OnWindowPosChanged(lpwndpos); // TODO: 在此处添加消息处理程序代码
    CRect rc(0, 0, 0, 0);
    GetClientRect(&rc);
    GetDlgItem(IDC_MY)->MoveWindow(&rc);
    }
      

  6.   

    if ((cx > 0) && (cy > 0))
    {
    CRect rect;
    if (m_ctrlweb.m_hWnd != NULL)
    {
    m_ctrlweb.GetWindowRect(rect);
    ScreenToClient(rect);
    m_ctrlweb.MoveWindow(rect.left, rect.top,
    cx-(2*rect.left), cy-rect.top-rect.left);
    }
    }
      

  7.   

    int cx, int cy代表窗口的宽度和高度。
      

  8.   

    先发WM_SIZE。很简单啊,你在OnSize和OnInitDialog中分别加断点就可以知道了。在对话框启动时,先走OnSize。一般要先判断对话框句柄是否存在。不存在的情况下,不能进行控件操作,否则就会失败。
      

  9.   

    可以在OnInitDialog置一个BOOL变量,然后在OnSize中来判断这个变量,也可以判断对话框中其中某个控件的句柄是否为NULL也是一样的,但是如果来判断对话框本身的句柄好像是不行的,因为这时候对话框本身的句柄已经存在了!
      

  10.   

    先发WM_SIZE
    在OnSize中判断窗口是否被创建出来即可
    void CXXXDlg::OnSize(UINT nType, int cx, int cy) 
    {
        if (m_wndStatus.GetSafeHwnd() != NULL)
        {......}
    }