Закрасить компоненты 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;
}
Очевидно, измените заголовок, координаты и идентификатор кнопки.
После этого вам не нужно ничего делать. Кнопка будет отображаться как дочерний элемент родительского окна.