onDraw疯了

扫码查看
本文介绍了onDraw疯了的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家好,

我的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疯了的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-20 11:11
查看更多