MoveWindow()运行出错!!

wjwlzl 2011-06-02 08:29:54
大家好,我想使单文档CFromview中 的控件随窗口变化,我新编了一个CSynname类,保存了CFromview中控件的地址,在onsize中调控件大小

OnSize(UINT nType, int cx, int cy)
{
// CFormView::OnSize(nType, cx, cy);
//m_m_pControlArray是CPtrArray存放控件的信息
// TODO: Add your message handler code here
if (kong==TRUE)
{

int nIncrementX = cx - m_nWinWidth;
int nIncrementY = cy - m_nWinHeight;
int i=0;
int nMoveXPercent = ((CSynname*)m_pControlArray.GetAt(i))->m_nMoveXPercent;
int nMoveYPercent = ((CSynname*)m_pControlArray.GetAt(i))->m_nMoveYPercent;
int nZoomXPercent = ((CSynname*)m_pControlArray.GetAt(i))->m_nZoomXPercent;
int nZoomYPercent = ((CSynname*)m_pControlArray.GetAt(i))->m_nZoomYPercent;

CWnd*pWndCtrl=((CSynname*)m_pControlArray.GetAt(0))->m_pWnd;
HWND hWnd = pWndCtrl->GetSafeHwnd();
//if((NULL!=pWndCtrl)&&IsWindow(hWnd))
// {
int nLeft = ((CSynname*)m_pControlArray.GetAt(0))->m_rectWnd.left;
int nTop = ((CSynname*)m_pControlArray.GetAt(0))->m_rectWnd.top;
int nWidth = ((CSynname*)m_pControlArray.GetAt(0))->m_rectWnd.Width();
int nHeight = ((CSynname*)m_pControlArray.GetAt(0))->m_rectWnd.Height();

//设置新的位置参数
nLeft += (nIncrementX*nMoveXPercent/100);
nTop += (nIncrementY*nMoveYPercent/100);
nWidth += (nIncrementX*nZoomXPercent/100);
nHeight += (nIncrementY*nZoomYPercent/100);

// 把控件移动到新位置
pWndCtrl->MoveWindow(nLeft, nTop, nWidth, nHeight);
// }
//}*/
}
}单步运行到pWndCtrl->MoveWindow(nLeft, nTop, nWidth, nHeight);程序就崩溃,大家看看什么原因,谢谢!!
...全文
507 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2011-06-27
  • 打赏
  • 举报
回复
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面界面版关于版主结帖工作的具体办法
wjwlzl 2011-06-08
  • 打赏
  • 举报
回复
怎么解决呢
LuciferStar 2011-06-06
  • 打赏
  • 举报
回复
要移动的窗口控件未被创建。
程序第一次运行的时候,在对话框还没出现的时候,其实就执行了一次OnSize。
wj709830140 2011-06-06
  • 打赏
  • 举报
回复
学习~
jianghandaxue 2011-06-05
  • 打赏
  • 举报
回复
CWnd*pWndCtrl=((CSynname*)m_pControlArray.GetAt(0))->m_pWnd;
HWND hWnd = pWndCtrl->GetSafeHwnd();
-----------------------------
用这个指针时,先判断pWndCtrl返回是否为空指针!,为空,说明窗体指针没有返回正确值给你!
wjwlzl 2011-06-05
  • 打赏
  • 举报
回复
OnSize(UINT nType, int cx, int cy)
{
..........................
if((NULL!=pWndCtrl)&&IsWindow(hWnd))
{
.................
.................
// 把控件移动到新位置
pWndCtrl->MoveWindow(nLeft, nTop, nWidth, nHeight);
}

} 当我把if语句添上之后在窗口还未创建之前在onsize里面能走if里面的语句,可是创建只后在拉窗口大小if语句就不走了,程序虽然不崩溃,可是也实现不了我的功能了

wjwlzl 2011-06-05
  • 打赏
  • 举报
回复
单步跟踪,在初始化还未窗口之前的时候与创建之后拉动窗口大小的时候pWndCtrl的值是一样的,hWnd虽然不是空,可值却不一样, 怎么回事,
Eleven 2011-06-04
  • 打赏
  • 举报
回复
CWnd*pWndCtrl=((CSynname*)m_pControlArray.GetAt(0))->m_pWnd;
HWND hWnd = pWndCtrl->GetSafeHwnd();
-----------------------------
你的这个pWndCtrl和pWndCtrl->GetSafeHwnd();返回值有效吗?
wjwlzl 2011-06-04
  • 打赏
  • 举报
回复
我的程序是运行了出来窗口了,可是拉动边框改变窗口大小的时候,就出现崩溃
向立天 2011-06-03
  • 打赏
  • 举报
回复
pop1210 2011-06-03
  • 打赏
  • 举报
回复
[Quote=引用楼主 wjwlzl 的回复:]
大家好,我想使单文档CFromview中 的控件随窗口变化,我新编了一个CSynname类,保存了CFromview中控件的地址,在onsize中调控件大小

OnSize(UINT nType, int cx, int cy)
{
// CFormView::OnSize(nType, cx, cy);
//m_m_pControlArray是CPtrArray存放控件的信息
//……
[/Quote]
想法ok,但是程序刚开启时会掉到OnSize,此时控件都没创建好(m_hWnd==0),所以在OnSize使用控件时
要加判断,这样用:
if(m_pContrl&&m_pContrl->GetSafeWnd())
m_pContrl.MoveWindow(...);
羽飞 2011-06-03
  • 打赏
  • 举报
回复
Debug Assertion?
怎么崩溃的?崩溃的提示是啥?
Mr。Lili 2011-06-03
  • 打赏
  • 举报
回复
if(::IsWindow(pWndCtrl->GetSafeHwnd()))
pWndCtrl->MoveWindow(nLeft, nTop, nWidth, nHeight);
这样改一下
nebula84 2011-06-03
  • 打赏
  • 举报
回复
赞同1楼和3楼的的思路

我的做法是定义个成员变量m_IsInited做标志,
先在类构造函数中置FALSE:
C*Dlg::C*Dlg()
{
......
m_IsInited=FALSE;
......
}

然后在类初始化函数结尾处置TRUE;
C*Dlg::OnInitDialog()
{
......
m_IsInited=TRUE;

return TRUE
}
那么在OnSize函数里利用该变量判断即可。
C*Dlg::OnSize(UINT nType, int cx, int cy)
{
if(!m_IsInited)return;
//your code...
}

15,977

社区成员

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

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