博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
GetSafeHwnd()的调用正确时机
阅读量:4057 次
发布时间:2019-05-25

本文共 671 字,大约阅读时间需要 2 分钟。

在绘图程序中,我把所有的绘图操作都封装进自己编写的类CPage中,其中一个绘图操作是用来改变光标的形状,因为改变光标形状的函数需要引用绘图区的窗口句柄,为此我在类CPage中声明了一个窗口句柄变量 HWND m_hwndView,通过类初始化函数Init(HWND hwndView)对它进行赋值,供类中其他函数调用。我想在程序启动的时候,就把窗口句柄保存起来,为此我产生了如下调用:

CTestView::CTestView(){	m_page.Init(this->GetSafeHwnd());		TRACE1("CTestView = %d\n",this->GetSafeHwnd());}
 

但是随后,发现在用鼠标绘图的时候,整个窗口闪烁非常厉害,包括工具栏和菜单栏。随后跟踪调试发现,m_hwndView的值一直为0.

实际上,在CTestView类构造的时候,CTestView对应的窗口并没有创建完毕,所以this->GetSafeHwnd( )返回0,即无效的窗口句柄。CTestView对应的窗口创建过程在CTestView( )之后,在OnInitUpdate( )之前。因此正确的获取视图窗口句柄如下:

void CTestView::OnInitialUpdate(){	CView::OnInitialUpdate();	m_page.Init(this->GetSafeHwnd());	TRACE1("OnInitialUpdate = %d\n",this->GetSafeHwnd());}

调试结果如下: 

你可能感兴趣的文章
HTML基础
查看>>
Java IO
查看>>
Java NIO
查看>>
Java大数据:Hbase分布式存储入门
查看>>
Java大数据:全文搜索引擎Elasticsearch入门
查看>>
大数据学习:Hadoop入门学习书单
查看>>
大数据学习:Spark SQL入门简介
查看>>
大数据学习:Spark RDD操作入门
查看>>
大数据框架:Spark 生态实时流计算
查看>>
大数据入门:Hive和Hbase区别对比
查看>>
大数据入门:ZooKeeper工作原理
查看>>
大数据入门:Zookeeper结构体系
查看>>
大数据入门:Spark RDD基础概念
查看>>
大数据入门:SparkCore开发调优原则
查看>>
大数据入门:Java和Scala编程对比
查看>>
大数据入门:Scala函数式编程
查看>>
C++报错:引发了未经处理的异常:写入访问权限冲突, p 是 0xCCCCCCCC
查看>>
【数据结构周周练】002顺序表与链表
查看>>
C++报错:C4700:使用了非初始化的局部变量
查看>>
【数据结构周周练】003顺序栈与链栈
查看>>