关于对话框的OnSize的问题

Crazyrebel 2004-04-23 10:27:20
对话框为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处理的例程,谢谢大家了
...全文
852 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
lichin 2004-07-22
  • 打赏
  • 举报
回复
可以在OnInitDialog置一个BOOL变量,然后在OnSize中来判断这个变量,也可以判断对话框中其中某个控件的句柄是否为NULL也是一样的,但是如果来判断对话框本身的句柄好像是不行的,因为这时候对话框本身的句柄已经存在了!
快乐鹦鹉 2004-07-22
  • 打赏
  • 举报
回复
先发WM_SIZE。很简单啊,你在OnSize和OnInitDialog中分别加断点就可以知道了。在对话框启动时,先走OnSize。一般要先判断对话框句柄是否存在。不存在的情况下,不能进行控件操作,否则就会失败。
huaboy408 2004-07-22
  • 打赏
  • 举报
回复
int cx, int cy代表窗口的宽度和高度。
huaboy408 2004-07-22
  • 打赏
  • 举报
回复
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);
}
}
habao 2004-07-22
  • 打赏
  • 举报
回复
建议响应OnWindowPosChanged,

void CMyDlg::OnWindowPosChanged(WINDOWPOS* lpwndpos)
{
CDialog::OnWindowPosChanged(lpwndpos);

// TODO: 在此处添加消息处理程序代码
CRect rc(0, 0, 0, 0);
GetClientRect(&rc);
GetDlgItem(IDC_MY)->MoveWindow(&rc);
}
lixiaosan 2004-07-22
  • 打赏
  • 举报
回复
http://www.codeproject.com/dialog/easysize.asp
宝_爸 2004-07-22
  • 打赏
  • 举报
回复
你的代码中
要判断GetDlgItem(IDC_GROUPBOX)的返回值是否为NULL,

或者直接判断对话框是否被创建完成GetSafeHwnd() == NULL .....

如果创建完成再调用GetDlgItem(IDC_GROUPBOX)
lixiaosan 2004-07-22
  • 打赏
  • 举报
回复
最大化按钮,窗口在创建的时候是先发WM_INITDIALOG消息还是先发WM_SIZE消息啊?
--------------
可以自己做个试验啊。分别在里面设置断点,然后test啊

试验结果先进入WM_SIZE 再到WM_INITDIALOG
宝_爸 2004-07-22
  • 打赏
  • 举报
回复
先发WM_SIZE
在OnSize中判断窗口是否被创建出来即可
void CXXXDlg::OnSize(UINT nType, int cx, int cy)
{
if (m_wndStatus.GetSafeHwnd() != NULL)
{......}
}
evlon 2004-07-22
  • 打赏
  • 举报
回复
UP
syy64 2004-07-22
  • 打赏
  • 举报
回复
先初始化,后OnSize
aoosang 2004-07-22
  • 打赏
  • 举报
回复
先发WM_SIZE
在OnSize中判断窗口是否被创建出来即可
void CXXXDlg::OnSize(UINT nType, int cx, int cy)
{
if (m_wndStatus.GetSafeHwnd() != NULL)
{......}
}

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧