C++ CClientDC和DC未在CHTMLEDITCRL上绘制

C++ CClientDC和DC未在CHTMLEDITCRL上绘制,c++,mfc,gdi,cdc,C++,Mfc,Gdi,Cdc,大家好,我正在使用MFC中的CHTMLEDITCRL。我想在处理右键单击事件的函数中绘制一些随机的矩形和线 CHTMLEDITCRL控件是使用以下代码段从静态创建的: bool CHtmlEditCtrlEx::CreateFromStatic( UINT nID, CWnd* pParent ) { CStatic wndStatic; if ( !wndStatic.SubclassDlgItem(nID, pParent)) { return false;

大家好,我正在使用MFC中的CHTMLEDITCRL。我想在处理右键单击事件的函数中绘制一些随机的矩形和线

CHTMLEDITCRL控件是使用以下代码段从静态创建的:

bool CHtmlEditCtrlEx::CreateFromStatic( UINT nID, CWnd* pParent ) {
    CStatic wndStatic;
    if ( !wndStatic.SubclassDlgItem(nID, pParent)) {
        return false;
    }
    CRect rc;
    wndStatic.GetWindowRect( &rc );
    pParent->ScreenToClient( &rc );
    if (Create( 0, (WS_CHILD | WS_VISIBLE), rc, pParent, nID, 0 )) {
        ...
}
然后我重写CWnd::pretranslate()函数,如下所示:

  CClientDC dcc(this);
    switch (pMsg->message) {

        case WM_RBUTTONUP:  // Right-click
            // Just some dummy values
            DrawSquigly(dcc, 600, 240, 20);
            break;

    }
DrawSquigly()函数的定义如下:

void CHtmlEditCtrlEx::DrawSquigly(CDC &dcc, int iLeftX, int iWidth, int iY)
{
    CAMTrace trace;
    trace.Trace("Drawing Squiggly");
    //dcc.TextOut(10, 10, CString(_T("I used a client DC!")));

    CPen * oldPen;
    CBrush * oldBrush;
    oldPen = (CPen *) dc.SelectStockObject(WHITE_PEN);
    dcc.MoveTo(5,10);
    dcc.LineTo(80, 10);
    dcc.SelectObject(oldPen);

    //GDI 002_2: Create custom pen with different Line thickness.
    CPen thick_pen(PS_SOLID, 3, RGB(0,255,0));
    oldPen = dc.SelectObject(&thick_pen);
    dcc.MoveTo(5, 20);
    dcc.LineTo(80,20);
    dcc.SelectObject(oldPen);

    //GDI 002_3: Create a Rectangle now
    dcc.Draw3dRect(5,30,80,70, RGB(25,25,255), RGB(120,120,120));

    //GDI 002_4: Create a Brush that we can use for filling the 
    // closed surfaces
    CBrush brush(RGB(255,0,255));
    oldBrush = dc.SelectObject(&brush);
    dcc.Rectangle(5,110,80,140);
    dcc.SelectObject(oldBrush);

    //GDI 002_5: Hatch Brush is useful to apply a pattern in stead 
    //of solid fill color
    CBrush* hatBrush = new CBrush();
    hatBrush->CreateHatchBrush(HS_CROSS, RGB(255,0,255));
    oldBrush = dc.SelectObject(hatBrush);
    dcc.FillRect(new CRect(5,160,80,190), hatBrush);
    dcc.SelectObject(oldBrush);
}
但当我右键单击时,不会绘制任何图形。我想我错过了一些东西,尤其是因为我是MFC的新手

我已经在事件处理程序的顶部添加了一个跟踪,以确保函数正在被调用,并且它正在被调用


有人能告诉我正确的方向吗?

您的代码中实际上有两个设备上下文:一个作为调用中的参数传递(我们不知道它来自何处),另一个在绘图函数中本地创建

通常,当系统给你一个DC时,它期望你在里面画一些东西,而不是你画进其他东西

如果您正在处理的窗口是分层的,那么系统将为您提供一个内存上下文,在清除该上下文后,它将以某种窗口管理器效果显示在窗口本身上


我的怀疑是,通过分配第二个dc,当第一个dc(保留为空)从消息处理程序返回时被清除时,您的图形将被重写。

您是通过重写
CWinApp::PreTranslateMessage()
调用此命令的吗?这不是处理事件的正确位置。当函数具有dc参数时,dcc的用途是什么?是的,我正在调用CWnd::PreTranslateMessage的覆盖,我在这里处理事件,因为视图上有几个客户端区域,其中包括CHtmlEditCtrl。为了测试函数是否得到调用,我在顶部添加了一个跟踪,它跟踪,但不绘制;睡眠(5000);但仍然看不到任何图形。屏幕刷新不一定同步进行。如果同步休眠进程,可能会在刷新之前暂停。我已经编辑了上面的问题,在这种情况下,您的建议是什么?在调用DrawSquigly(dc,600,240,20)时,您从哪里获得了传递的dc?就在CWnd::pretranslate函数中消息swtich语句的顶部,但我甚至没有使用它,我试图从事件处理程序中获取另一个来测试它是否有效。