移动按钮位置的疑问

baobaodediaozhui 2012-01-06 10:18:05
我在对话框里拖放添加了3个按钮,都要移动到相应的位置。先其中对一个按钮移动。
private:
CButton m_startButton;//.h
void Cpage1::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(Cpage1)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
DDX_Control(pDX, IDC_StartBUTTON, m_startButton);
}
void Cpage1::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
CRect drawrect;
GetClientRect(drawrect);//获得画图区的大小
drawrect.DeflateRect(42,62);
// CWnd *pWnd=GetDlgItem(IDC_StartBUTTON);
if(m_bIsInit)//判断是否初始化
{ m_progress.MoveWindow(CRect(drawrect.left,drawrect.bottom+22,drawrect.right,drawrect.bottom+42));
m_startBueeon.MoveWindow(CRect(10,10,200,200)); //移动button
// pWnd->SetWindowPos( NULL,50,80,0,0,SWP_NOZORDER | SWP_NOSIZE ); //把按钮
}
}
现在的问题是,我仅仅定义一个CButton m_startButton这个对象,其他的注释掉,就直接说什么未处理的异常,跳到winocc.cpp里的DWORD CWnd::GetStyle() const。
请教这是为什么呢?还有正确的做法是什么?

...全文
258 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
baobaodediaozhui 2012-01-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 yang79tao 的回复:]

OnSize调用时,有可能子窗口还未创建(父窗子创建了,所以它可以调用)。
所以执行你代码的时候,要判断一下。比如用IsWindow什么的,具体搜一下吧。

有个简单的办法可以验证我所的,你把你的代码剪切到一个按钮点击响应函数里面执行,就没问题了,因为点击按钮的时候,保证了所有窗口都已经创建了。
[/Quote]
我先前在这个对话框里添了个进度条,就是同样的用法m_progress.MoveWindow()这句话,就可以。if(m_bIsInit)//判断是否初始化,这个m_bIsInit变量就是来判断是否初始化的。在构造函数里为FALSE,Cpage1::OnInitDialog()为TRUE。可是这个按钮这样用却不行。
youngwolf 2012-01-06
  • 打赏
  • 举报
回复
OnSize调用时,有可能子窗口还未创建(父窗子创建了,所以它可以调用)。
所以执行你代码的时候,要判断一下。比如用IsWindow什么的,具体搜一下吧。

有个简单的办法可以验证我所的,你把你的代码剪切到一个按钮点击响应函数里面执行,就没问题了,因为点击按钮的时候,保证了所有窗口都已经创建了。
baobaodediaozhui 2012-01-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 gis_wudi 的回复:]

调用堆栈看看程序崩到了什么地方
void Cpage1::OnSize(UINT nType, int cx, int cy)
这个函数是什么时候调用的,如果一启动就调用,按钮还没有创建
movewindow之前做一个安全检查就不会有问题
if(m_startBueeon.GetSafeHwnd())
{
m_startBueeon.MoveWindow(CRect(10,10,2……
[/Quote]
void Cpage1::OnSize(UINT nType, int cx, int cy)这个函数是响应的程序最大化的响应函数。
liangbina07 2012-01-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 gis_wudi 的回复:]
调用堆栈看看程序崩到了什么地方
void Cpage1::OnSize(UINT nType, int cx, int cy)
这个函数是什么时候调用的,如果一启动就调用,按钮还没有创建
movewindow之前做一个安全检查就不会有问题
if(m_startBueeon.GetSafeHwnd())
{
m_startBueeon.MoveWindow(CRect(10,10,20……
[/Quote]

IDC_StartBUTTON 宏中有小写不提倡 楼上为正解 具体在代码中才能发现
GIS_wudi 2012-01-06
  • 打赏
  • 举报
回复
调用堆栈看看程序崩到了什么地方
void Cpage1::OnSize(UINT nType, int cx, int cy)
这个函数是什么时候调用的,如果一启动就调用,按钮还没有创建
movewindow之前做一个安全检查就不会有问题
if(m_startBueeon.GetSafeHwnd())
{
m_startBueeon.MoveWindow(CRect(10,10,200,200));
}
baobaodediaozhui 2012-01-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 gameslq 的回复:]

没看出程序和CWnd::GetStyle代码有啥关系
查看下栈回朔,找到程序里错误处
[/Quote]
怎么查你说的栈回朔呢?我很菜哈,就是程序出了错,不知道怎么查错,很纠结。
gameslq 2012-01-06
  • 打赏
  • 举报
回复
没看出程序和CWnd::GetStyle代码有啥关系
查看下栈回朔,找到程序里错误处
baobaodediaozhui 2012-01-06
  • 打赏
  • 举报
回复
谢谢各位的回答了,问题原因貌似是我的VS2005安装有点问题。。。。。,因为我把程序拷到别人的电脑上编译运行就没什么问题。囧。。。。。。。。。
lumingming 2012-01-06
  • 打赏
  • 举报
回复
645458512@qq.com
幸福官 2012-01-06
  • 打赏
  • 举报
回复
我单独建立一个对话框工程测试你这个问题,但是没有出现。
是不是因为你用的是“属性页”类啊?
baobaodediaozhui 2012-01-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 yang79tao 的回复:]

OnSize调用时,有可能子窗口还未创建(父窗子创建了,所以它可以调用)。
所以执行你代码的时候,要判断一下。比如用IsWindow什么的,具体搜一下吧。

有个简单的办法可以验证我所的,你把你的代码剪切到一个按钮点击响应函数里面执行,就没问题了,因为点击按钮的时候,保证了所有窗口都已经创建了。
[/Quote]
我现在用了这个方法,还是不行。
if (IsWindow(m_hWnd))
{
CRect drawrect;
GetClientRect(drawrect);//获得画图区的大小
drawrect.DeflateRect(42,62);
// if(m_startButton.GetSafeHwnd())
// m_startButton.MoveWindow(CRect(10,10,200,200));

if(m_bIsInit)
{
m_progress.MoveWindow(CRect(drawrect.left,drawrect.bottom+22,drawrect.right,drawrect.bottom+42));
m_startButton.MoveWindow(CRect(10,10,30,30));
}
}
求解,谢谢。

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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