Закрасить компоненты mfc внутри cwnd

Я создаю класс cwnd, который показывает треугольник с кнопкой внутри, но вместо того, чтобы нарисовать кнопку самостоятельно, я бы хотел делегировать компоненту кнопки.

Как есть....

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 к сожалению

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;
}

Очевидно, измените заголовок, координаты и идентификатор кнопки.

После этого вам не нужно ничего делать. Кнопка будет отображаться как дочерний элемент родительского окна.

Другие вопросы по тегам