最近程序中遇到在使用mapx绘图的同时,还必须在客户区窗口中使用cdc 直接绘图。
但是这出现了问题,就是当mapx 刷新时(比如窗口移动,最大化,遮盖),同时会将cdc 设备的绘图刷掉。
原来一直以为可以在cview::ondraw 中重绘,但是怎么也不行。后来想到可能mapx的绘制是否在ondraw之后发生的。那么也就是说必须等到mapx的绘图之后才可以使用cdc绘图,才能保证不被刷掉。
后来参考mapx 手册,找到了这个事件,确实很少用,但一切ok了。事件说明如下:
MapDraw 事件
此事件在绘图之前调用一次,在绘图完成之后调用一次。此处有一个参数表明绘图是开始还是结束。Dispatch ID = 15
语法MapDraw (Flag)
Flag miDrawBegin 或 miDrawEnd。
//-------------------------------------------------------
程序中:1头文件cmapview.hprotected:
void OnMapDraw(short Flag);
2代码文件cmapview.cpp
BEGIN_EVENTSINK_MAP(WSMapView, CView)
ON_EVENT(WSMapView,IDC_MAP,15,OnMapDraw,VTS_I2)
END_EVENTSINK_MAP()
void WSMapView::OnMapDraw(short Flag)
{
if(Flag==1)
{
//TRACE("绘制前");
return;
}
if(Flag==2)
{
//TRACE("绘制后!");
}
}
但是这出现了问题,就是当mapx 刷新时(比如窗口移动,最大化,遮盖),同时会将cdc 设备的绘图刷掉。
原来一直以为可以在cview::ondraw 中重绘,但是怎么也不行。后来想到可能mapx的绘制是否在ondraw之后发生的。那么也就是说必须等到mapx的绘图之后才可以使用cdc绘图,才能保证不被刷掉。
后来参考mapx 手册,找到了这个事件,确实很少用,但一切ok了。事件说明如下:
MapDraw 事件
此事件在绘图之前调用一次,在绘图完成之后调用一次。此处有一个参数表明绘图是开始还是结束。Dispatch ID = 15
语法MapDraw (Flag)
Flag miDrawBegin 或 miDrawEnd。
//-------------------------------------------------------
程序中:1头文件cmapview.hprotected:
void OnMapDraw(short Flag);
2代码文件cmapview.cpp
BEGIN_EVENTSINK_MAP(WSMapView, CView)
ON_EVENT(WSMapView,IDC_MAP,15,OnMapDraw,VTS_I2)
END_EVENTSINK_MAP()
void WSMapView::OnMapDraw(short Flag)
{
if(Flag==1)
{
//TRACE("绘制前");
return;
}
if(Flag==2)
{
//TRACE("绘制后!");
}
}