У меня есть диалоговое приложение, написанное на 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 и на значке диалогового приложения появится всплывающая подсказка, появится прямоугольник.
Я хочу показать прямоугольник поверх изображения независимо от того, что пользователь делает с окном (сворачивание, увеличение, перемещение и т. Д.).
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));
Других решений пока нет …