为什么我在OnPaint()中先调用dc.Draw3dRect(&rectblank,RGB(255,255,255),RGB(0,0,0));再调用dc.TextOut(640,220,text);显示的字体是一块黑色的区域。
但是先调用dc.TextOut(640,220,text);再调用dc.Draw3dRect(&rectblank,RGB(255,255,255),RGB(0,0,0));就可以显示字体。而用Draw3dRect画的区域在以上两种情况都可以正常显示。高手请教。
还用一个按键问题在OnKeyDown()中为什么判断上下左右没反映,而其他键可以呢???

解决方案 »

  1.   

    Draw3dRect把dc的画刷给改成黑色的了?
      

  2.   

    让我来给你详细的解说一下:
      首先,我用的是这样的程序,和你的程序是大同小异,
    void CMyView::OnDraw(CDC* pDC)
    {
       CRect rect;
       GetClientRect(rect);
       rect.DeflateRect(20, 20);
       pDC->Draw3dRect(rect, RGB(255, 0, 0), RGB(0, 255, 0));
       COLORREF r;
       r = pDC ->GetBkColor();
       pDC -> TextOut(640,220,"adfasdf");
    }  
    这是一个新建的单文档应用程序,在其中调用了你上述的函数,设置断点调试,你会发现
    Draw3dRect实际上调用的是Draw3dRect,而Draw3dRect实际上调用了四个FillSolidRect,把上下左右四条边填充了你上述设置的色彩,我这里的左上两边用的是红色下面和右边用的是绿色,跟踪FillSolidRect,发现在其中调用了SetBkColor这个函数,这个函数的作用是将目前DC的背景色设为当前色,在FillSolidRect的最后调用了ExtTextOut,将这个填充的模式设置为OPAQUE,因此WINDOWS在绘图的时候就会调用当前的背景色填充文字的间隙,观察四个FillSolidRect调用顺序,可以发现它先填充左上,后填充右下,因此最后退出的时候背景色已经变成了黑色,因此在你输出文字的时候就会以黑色填充背景,而你的画笔的色彩没有改变,默认为黑色,因此你看到的当然是一团黑了,顺序相反的情形你可结合这个自行分析。如果想看到字的化,就要设置背景的填充模式为TRANSPARENT。