Прямоугольник не отображается на OnPaint MFC

У меня есть диалоговое приложение, написанное на C ++ и MFC. Диалог имеет CStatic Picture Control. Я рисую BITMAP в функции OnPaint () PictureCtrl. Соответствующий код выглядит следующим образом:

void PictureCtrl::OnPaint()
{
CDC* pDC = this->GetDC();
pDC->SelectStockObject(PS_SOLID);
pDC->Rectangle(CRect(0, 0, 400, 400));
ReleaseDC(pDC);

CStatic::OnPaint();
}

Когда приложение запускается, прямоугольник рисуется прямо в верхнем левом углу диалогового окна, а не элемента управления изображением.

введите описание изображения здесь

Во-вторых, если я сверну и разверну диалоговое окно, изображение появится, а прямоугольник — нет.

Однако если навести курсор мыши на панель задач Windows и на значке диалогового приложения появится всплывающая подсказка, появится прямоугольник.

введите описание изображения здесь

Я хочу показать прямоугольник поверх изображения независимо от того, что пользователь делает с окном (сворачивание, увеличение, перемещение и т. Д.).

1

Решение

CStatic::OnPaint ручки BeginPaint/EndPaint (основные функции WinAPI) в ответ на WM_PAINT сообщение. Поэтому его следует назвать первым. Кроме того, вы можете использовать CClientDC который имеет автоматическую очистку:

void PictureCtrl::OnPaint()
{
CStatic::OnPaint();
CClientDC dc(this); //<- uses GetDC
dc.SelectStockObject(BLACK_PEN);
dc.Rectangle(CRect(0, 0, 400, 400));
} //<- ReleaseDC is automatically called

Еще лучше, используйте CPaintDC непосредственно в ответ на WM_PAINT сообщение:

void PictureCtrl::OnPaint()
{
CPaintDC dc(this); //<- calls `BeginPaint`
dc.SelectStockObject(BLACK_PEN);
dc.Rectangle(CRect(0, 0, 400, 400));
} //<- EndPaint is automatically called

Не связано, используйте BLACK_PEN в качестве параметра для SelectStockObject, использование PS_SOLID в качестве параметра для CPen:

CPen pen(PS_SOLID, 1, RGB(0,0,0));
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]