问题描述
大家好,
我的mfc MDI软件的图形出现问题.
仅仅运行了一个小时,出了点问题. CView派生类中MDIChild的OnDraw函数的参数CDC变得疯狂,因为它在桌面上而不是在桌面上绘制,并且扭曲了所有软件图形:上下移动菜单和许多闪烁.
我检查了无数次,确认没有删除任何通过getDC检索到的HDC,并且我认为我可以正确释放所有图形设备.
我正在使用VC6进行开发.
您认为这种行为取决于什么?
预先谢谢您.
Hi all,
I''ve a problem with the graphics of my mfc MDI software.
Only after a bit hour of running, something goes wrong. the parameter CDC of OnDraw function of an MDIChild in a CView derived class goes crazy, because it draw on desktop not in the frame and it distorce all software graphics: moving menu up and down and many flickerings.
I checked one houndred of times, I verified that I never deleted any HDC retrieved with getDC and I think that I release correctly all graphics device.
I''m developing with VC6.
In your opinion of what depends this behavior?
Thank you in advance.
推荐答案
void CNavionicsView::OnDraw(CDC* pDC)
{
//TRACE("OnDraw\n");
CNavionicsDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
int iwkViewOptionApplied=0;
try
{
if (m_CEChartViewAttached !=NULL)
{
...
int iViewSizeX =m_CEChartViewAttached->GetViewSizeX();
int iViewSizeY =m_CEChartViewAttached->GetViewSizeY();
if (m_ToBeRedraw == true)
{
int iSysMetricsX = GetSystemMetrics(SM_CXSCREEN);
int iSysMetricsY = GetSystemMetrics(SM_CYSCREEN);
if( theApp.GetTraceLevel() & (1 << (TRACE_VIEW-1)) ){
CString s; s.Format("CNavionicsView::OnDraw: iSysMetricsX=%d, iSysMetricsY=%d\n",
iSysMetricsX, iSysMetricsY);
OutputDebugString(s);
}
m_MemDC.SelectObject(&m_Brush);
m_MemDC.PatBlt(0,0,iSysMetricsX,iSysMetricsY,PATCOPY);
BeginWaitCursor(); // display the hourglass cursor
TRACE("OnDraw: m_CEChartViewAttached->Draw...\n");
m_CEChartViewAttached->Draw(m_MemDC.m_hDC);
TRACE("OnDraw: m_CEChartViewAttached->Draw: Done!\n");
EndWaitCursor(); // display the hourglass cursor
if( theApp.GetTraceLevel() & (1 << (TRACE_VIEW-1)) ){
CString s; s.Format("CNavionicsView::OnDraw: iViewSizeX=%d, iViewSizeY=%d\n",
iViewSizeX, iViewSizeY);
OutputDebugString(s);
}
//Devo disegnare i marker su m_MemDC così ogni copia conterrà già i marker
//e rotte così non dovrò più ridisegnarli.
CNChartView::DrawMarkers(&m_MemDC);
CNChartView::DrawRoutes(&m_MemDC);
CNChartView::DrawAreas(&m_MemDC);
if(theApp.m_bDrawReticolo)
CNChartView::DrawParalelMeridian(&m_MemDC);
m_MemDC2.BitBlt(0,0,iViewSizeX, iViewSizeY, &m_MemDC, 0,0,SRCCOPY );
CNChartView::OnDraw(&m_MemDC2);
if(m_bViewNocturne){
Graphics gx(m_MemDC2);//pDC->m_hDC);
SolidBrush blackBrush(Color(180,0,0,0));
gx.FillRectangle(&blackBrush,0,0,iViewSizeX,iViewSizeY);
}
pDC->AssertValid();
pDC->BitBlt(0,0,iViewSizeX, iViewSizeY, &m_MemDC2, 0,0,SRCCOPY );
#endif
m_ToBeRedraw = false;
}
else
{
if( theApp.GetTraceLevel() & (1 << (TRACE_VIEW-1)) ){
CString s; s.Format("CNavionicsView::OnDraw: BitBlt\n");
OutputDebugString(s);
}
m_MemDC2.BitBlt(0,0,iViewSizeX, iViewSizeY, &m_MemDC, 0,0,SRCCOPY );
CNChartView::OnDraw(&m_MemDC2);
if(m_bViewNocturne ){
Graphics gx(m_MemDC2);
SolidBrush blackBrush(Color(180,0,0,0));
gx.FillRectangle(&blackBrush,0,0,iViewSizeX,iViewSizeY);
}
pDC->BitBlt(0,0,
iViewSizeX, //m_CEChartViewAttached->GetViewSizeX(),
iViewSizeY, //m_CEChartViewAttached->GetViewSizeY(),
&m_MemDC2,0,0,SRCCOPY);
}
}
}
//catch the exceptions here
catch(CNavionicsException CNEwkNavionicsException)
{
//check if its a fatal error
int iwkErrorNumber
= CNEwkNavionicsException.GetErrorNumber();
if(iwkErrorNumber>=9000 && iwkErrorNumber<=9900)
{
//fatal error, therefore display
string swkErrorText;
CNEwkNavionicsException.MessageFormatted(swkErrorText, false);
MessageBox((swkErrorText.c_str()), "Fatal Error", MB_OK || MB_ICONEXCLAMATION);
abort(); //exit
}
else
{
//for debugging display warning
int iwkErrorNumber
= CNEwkNavionicsException.GetErrorNumber();
//fatal error, therefore display
string swkErrorText;
CNEwkNavionicsException.MessageFormatted(swkErrorText, false);
}
}
...
在类的构造函数中正确初始化了m_MemDC和m_MemDC2.
从MFC框架调用此OnDraw函数
m_MemDC and m_MemDC2 are correctly initialized in constructor of class.
This on OnDraw functions is called from MFC framework
这篇关于onDraw疯了的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!