您的位置:首页 > 其它

有关在对话框上创建视图上的再探索

2009-12-05 11:44 211 查看
作者:朱金灿

来源:http://www.cnblogs.com/clever101

本文拙文《在对话框上创建视图的方法总结》,有网友朋友来邮件反映:在对话框上可以成功创建视图,但是用鼠标单击视图的时候,就会出现Assert错误,说ViewCore.cpp 252行中有错。具体是:CView类的onmouseActive函数中ASSERT(pParentFrame == pDesktopWnd || pDesktopWnd->IsChild(pParentFrame)),出错!

下班回家我决心亲自试验一番,我在我的对话框程序上添加了各种鼠标消息,包括WM_LBUTTONDOWN、WM_MOUSEMOVE和WM_LBUTTONUP,但是都没有出错。我一下抓瞎了,只好上论坛发贴求助,但是一时之间也没多少人回应。我只好直接在google上搜索ASSERT(pParentFrame == pDesktopWnd || pDesktopWnd->IsChild(pParentFrame))这个断言错误。终于搜到了一篇相关文章《如何在没有文档的情况下使用CView及其派生类》。阅读之下我算是明白了为什么会出错。首先我们明确断言错误是在CView::OnMouseActivate函数上发生的,那么让我们看看MSDN对OnMouseActivate函数的解释:

The framework calls this member function when the cursor is in an inactive window and the user presses a mouse button.

大意是当光标在一个非活动窗口和用户按下鼠标时框架就会调用这个消息。那我们再看看CView::OnMouseActivate函数的源码:

代码int CMyView::OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值

// return CView::OnMouseActivate(pDesktopWnd, nHitTest, message);
return CWnd::OnMouseActivate(pDesktopWnd, nHitTest, message);
}

结果测试,这种办法也完全可行。

后来我检讨了自己思路,我发现了自己开始的思路是完全错误的,我觉得既然是ASSERT(pParentFrame ==pDesktopWnd||pDesktopWnd->IsChild(pParentFrame))出错了,我就应该先分析这句断言为什么出错,而不是忙着去搜索资料。这个道理有点像前天在CCTV 6看到的那部《危机时刻》的一个情节:一车雷管翻车了,排爆大队的副大队长忙着怎么去封锁铁路和疏散村民,而水平更高的大队长却先分析出翻车的是火雷管,然后对症下药地调来一辆消防车把雷管淋湿,一举化除危机。

参考文献:

如何在没有文档的情况下使用CView及其派生类
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: