VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 1111|回复: 15

[求助] Debug Assertion Failed(在线等待)

[复制链接]
02_avatar_middle
在线会员 发表于 2015-12-22 16:32:26 | 显示全部楼层 |阅读模式
各位大侠:

我想在程序打开后,自动调整控件的尺寸,以达到美观整齐。在Release下可以正常运行,但切换在Debug下就出现"Debug Assertion Failed",如下图:
22.png
22.png




上一篇:请问C语言与C++的区别
下一篇:GetClientRect如何获取控件的RECT?
51_avatar_middle
online_admins 发表于 2015-12-22 17:12:08 | 显示全部楼层
点重试按钮,看看停在代码的哪个位置上?
调试看一下吧
02_avatar_middle
ico_lz  楼主| 发表于 2015-12-22 17:56:33 | 显示全部楼层
谢谢Syc,查了一些资料,说是GetClientRect写法不对,应该写成全局形式,原句是:m_Group1.GetClientRect(&Rect1);如何改写成::GetClientRect(??,&Rect1);还有m_Group1.SetWindowPos(&wndTop,0,0,nXc,nYc,SWP_NOMOVE|SWP_NOZORDER | SWP_NOACTIVATE);的写法也要改成全局形式的,如何改?
88_avatar_middle
online_vip 发表于 2015-12-22 19:14:24 | 显示全部楼层
我看你这个代码错误原因不是这个吧,吧代码发过来给你看看
02_avatar_middle
ico_lz  楼主| 发表于 2015-12-23 08:37:12 | 显示全部楼层
void CReadEnergyDlg::OnSize(UINT nType, int cx, int cy)
{
        CDialogEx::OnSize(nType, cx, cy);
        // TODO: 在此处添加消息处理程序代码
        Invalidate(FALSE);
        CRect Rect,Rect1;
        int nXc, nYc;

        GetClientRect(&Rect);
        Rect.Height();
        Rect.Width();
        m_Group1.GetClientRect(&Rect1);       
        nXc = 390;
        nYc = Rect.bottom-13;
        m_Group1.SetWindowPos(&wndTop,0,0,nXc,nYc,SWP_NOMOVE|SWP_NOZORDER | SWP_NOACTIVATE);

        nXc = Rect1.right - Rect1.left-6;
        nYc = Rect.bottom-Rect.top-55;
        m_webTree.SetWindowPos(&wndTop,0,0,nXc,nYc,SWP_NOMOVE|SWP_NOZORDER | SWP_NOACTIVATE);

               
        nXc = (Rect.right-Rect1.right>100)?Rect.right-Rect1.right-10:110;
        nYc = Rect.bottom-Rect1.top-13;
        m_Group2.SetWindowPos(&wndTop,0,0,nXc,nYc,SWP_NOMOVE|SWP_NOZORDER | SWP_NOACTIVATE);
       
        nXc = (Rect.right-Rect1.right>100)?Rect.right-Rect1.right-15:100;
        nYc = Rect.bottom-Rect1.top-55;
        m_listRight.SetWindowPos(&wndTop,0,0,nXc,nYc,SWP_NOMOVE|SWP_NOZORDER | SWP_NOACTIVATE);       
       
        Invalidate(TRUE);
        UpdateWindow();
}
69_avatar_middle
在线会员 发表于 2015-12-23 09:09:00 | 显示全部楼层
BOOL GetClientRect(          HWND hWnd,
    LPRECT lpRect
);

Parameters

hWnd
[in] Handle to the window whose client coordinates are to be retrieved.
lpRect
[out] Pointer to a RECT structure that receives the client coordinates. The left and top members are zero. The right and bottom members contain the width and height of the window.


很简单的一个API  多看看MSDN
02_avatar_middle
ico_lz  楼主| 发表于 2015-12-23 09:12:59 | 显示全部楼层
mjy194 发表于 2015-12-23 09:09
BOOL GetClientRect(          HWND hWnd,
    LPRECT lpRect
);

怎么来改呢?谢谢了,新手啊
02_avatar_middle
ico_lz  楼主| 发表于 2015-12-23 09:15:13 | 显示全部楼层
已改成:::GetClientRect(this->m_hWnd,&Rect);但SetWindowPos()又报同样的错,如何来改写
51_avatar_middle
online_admins 发表于 2015-12-23 09:38:45 | 显示全部楼层
foryou520 发表于 2015-12-23 09:15
已改成:::GetClientRect(this->m_hWnd,&Rect);但SetWindowPos()又报同样的错,如何来改写

楼主直接把工程清理下,传上来吧,大家直接帮你看看
69_avatar_middle
在线会员 发表于 2015-12-23 10:07:42 | 显示全部楼层
foryou520 发表于 2015-12-23 09:12
怎么来改呢?谢谢了,新手啊

你要获取谁的RECT啊?
02_avatar_middle
ico_lz  楼主| 发表于 2015-12-23 12:56:49 | 显示全部楼层
mjy194 发表于 2015-12-23 10:07
你要获取谁的RECT啊?

获取控件的RECT:       
一共有4个控件,分别是:Group-box Control(ID号是:IDC_STATIC_GROUP1/IDC_STATIC_GROUP2)、 Tree-view Control(ID号是:IDC_WEB_TREE)、List Control(ID号是:IDC_LIST_RIGHT)
02_avatar_middle
ico_lz  楼主| 发表于 2015-12-23 12:58:05 | 显示全部楼层
Syc 发表于 2015-12-23 09:38
楼主直接把工程清理下,传上来吧,大家直接帮你看看

太大了,跟数据库相关联的
17_avatar_middle
online_vip 发表于 2015-12-23 16:42:57 | 显示全部楼层
void CReadEnergyDlg::OnSize(UINT nType, int cx, int cy)
{
        CDialogEx::OnSize(nType, cx, cy);
        // TODO: 在此处添加消息处理程序代码
       if(m_Group1.GetSafeHwnd())
       {
             Invalidate(FALSE);
             CRect Rect,Rect1;
             int nXc, nYc;

             GetClientRect(&Rect);
             Rect.Height();
             Rect.Width();
             m_Group1.GetClientRect(&Rect1);        
             nXc = 390;
             nYc = Rect.bottom-13;
             m_Group1.SetWindowPos(&wndTop,0,0,nXc,nYc,SWP_NOMOVE|SWP_NOZORDER | SWP_NOACTIVATE);

             nXc = Rect1.right - Rect1.left-6;
             nYc = Rect.bottom-Rect.top-55;
             m_webTree.SetWindowPos(&wndTop,0,0,nXc,nYc,SWP_NOMOVE|SWP_NOZORDER | SWP_NOACTIVATE);

               
            nXc = (Rect.right-Rect1.right>100)?Rect.right-Rect1.right-10:110;
            nYc = Rect.bottom-Rect1.top-13;
            m_Group2.SetWindowPos(&wndTop,0,0,nXc,nYc,SWP_NOMOVE|SWP_NOZORDER | SWP_NOACTIVATE);
        
            nXc = (Rect.right-Rect1.right>100)?Rect.right-Rect1.right-15:100;
            nYc = Rect.bottom-Rect1.top-55;
            m_listRight.SetWindowPos(&wndTop,0,0,nXc,nYc,SWP_NOMOVE|SWP_NOZORDER | SWP_NOACTIVATE);        
        
            Invalidate(TRUE);
            UpdateWindow();
        }
}
02_avatar_middle
ico_lz  楼主| 发表于 2015-12-23 17:17:17 | 显示全部楼层
mycaibo 发表于 2015-12-23 16:42
void CReadEnergyDlg::OnSize(UINT nType, int cx, int cy)
{
        CDialogEx::OnSize(nType, cx, cy) ...

大神,能讲一下: m_Group1.GetSafeHwnd()这个的作用不?
53_avatar_middle
在线会员 发表于 2016-1-3 20:31:46 | 显示全部楼层
我以前也偶尔遇到这样的问题,看到13楼的回复,有种恍然大悟的感觉,感谢13楼,顺便
把我的所得给楼主分享一下。
异常发生的原因如下:
DIALOG生成时,会触发ONSIZE消息,这个时候,窗体上的控件不一定生成了。
因此,在调用GetClientRect 和SetWindowPos函数时,访问控件的m_hWnd不一定是一个合法的窗体句柄。
DEBUG版时,会调用一个断言assert(m_hWnd)来确认m_hWnd是不是合法,如果不合法则会报错。
Release版则不会调用该assert(),因此不报错,此时m_hwnd的值具体是多少,无法知道,而
GetClientRect 和SetWindowPos 两个函数里面到底对m_hwnd做了啥,只有微软知道,如果函数里面
做了错误处理,不会产生不良后果,如果没做错误处理,很可能就破会了某段内存的内容,产生不可预料的错误。
当控件未生成时,调用GetSafeHwnd()则会返回 NULL (0),有效地避免了对非法 m_hWnd 地操作。

02_avatar_middle
ico_lz  楼主| 发表于 2016-1-6 11:38:33 | 显示全部楼层
xieglt 发表于 2016-1-3 20:31
我以前也偶尔遇到这样的问题,看到13楼的回复,有种恍然大悟的感觉,感谢13楼,顺便
把我的所得给楼主分享 ...

太谢谢大家了!
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-4-20 21:15

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表