【问题标题】:paint mfc components inside cwnd在 cwnd 中绘制 mfc 组件
【发布时间】:2016-11-09 18:30:42
【问题描述】:

我创建了一个 cwnd 类,它显示了一个带有按钮的 retangle,但我不想自己绘制一个按钮,而是委托给按钮组件。

原样....

class ExampleControl : public CWnd
{
    void ExampleControl::OnPaint()
    {
        CPaintDC dc(this);

        CRect rc(this);
        CDC memDC;
        memDC.CreateCompatibleDC(&dc);

        m_bmpCache.DeleteObject();
        m_bmpCache.CreateCompatibleBitmap(&dc, rc.Width(), rc.Height());

        OnDraw(&memDC);
    }

    void ExampleControl::OnDraw(CDC* pDC)
    {
        CRect rcClient(this);

        // draw background
        pDC->FillSolidRect(rcClient, GetSysColor(COLOR_WINDOW));

        // draw border
        COLORREF borderColor = RGB(0,0,255);
        pDC->Draw3dRect(0, 0, rcClient.Width(), rcClient.Height(), borderColor, borderColor);

        **//draw button
        //OK this draw a button ... but I would like to write 
        //CRect rect(10,10,25,15);
        //pDC->DrawFrameControl(rect, DFC_BUTTON, DFCS_BUTTONPUSH);**
    }

}

我想成为......

class ExampleControl : public CWnd
{
    //instantiate and call myButton.Create(...)
    CButton myButton;

    void ExampleControl::OnPaint()
    {
        CPaintDC dc(this);

        CRect rc(this);
        CDC memDC;
        memDC.CreateCompatibleDC(&dc);

        m_bmpCache.DeleteObject();
        m_bmpCache.CreateCompatibleBitmap(&dc, rc.Width(), rc.Height());

        OnDraw(&memDC);
    }

    void ExampleControl::OnDraw(CDC* pDC)
    {
        CRect rcClient(this);

        // draw background
        pDC->FillSolidRect(rcClient, GetSysColor(COLOR_WINDOW));

        // draw border
        COLORREF borderColor = RGB(0,0,255);
        pDC->Draw3dRect(0, 0, rcClient.Width(), rcClient.Height(), borderColor, borderColor);

        //draw button, using the mfc component
        //!!!! myButton.OnPaint() !!!!!!!

    }
}

请问,我该怎么做?

Ps.: 很遗憾我不能使用 Dialog 类

【问题讨论】:

    标签: mfc cwnd


    【解决方案1】:

    您不想调用按钮绘制方法。

    为 WM_CREATE 创建一个处理程序 (ON_WM_CREATE(), OnCreate(LPCREATESTRUCT lpcs) ...)

    在您的 OnCreate 处理程序中,创建按钮...

    BEGIN_MESSAGE_MAP(CExampleControl, CWnd) // in your .cpp implementation file
    // ... other handlers
       ON_WM_CREATE()
    END_MESSAGE_MAP()
    
    int CExampleControl::OnCreate(LPCREATESTRUCT lpcs)
    {
       __super::OnCreate(lpcs);
        myButton.Create(_T("My caption"), WS_CHILD|WS_VISIBLE, CRect(0, 0, 100, 100),  this, 101);
       return 0;
    }
    

    明显改变按钮的标题、坐标和ID。

    之后,您无需执行任何操作。该按钮将自己绘制为父窗口的子窗口。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-27
      • 1970-01-01
      • 2011-05-22
      • 1970-01-01
      • 1970-01-01
      • 2010-09-21
      相关资源
      最近更新 更多