我有一个使用c ++和MFC编写的基于对话框的应用程序。该对话框具有CStatic图片控件。我在PictureCtrl的OnPaint()函数中绘制了一个BITMAP。相关代码如下:
void PictureCtrl::OnPaint()
{
CDC* pDC = this->GetDC();
pDC->SelectStockObject(PS_SOLID);
pDC->Rectangle(CRect(0, 0, 400, 400));
ReleaseDC(pDC);
CStatic::OnPaint();
}
应用程序运行时,将在对话框的左上角(而不是图片控件)的右上角绘制矩形。
第二,如果我最小化和最大化对话框窗口,则会显示图像,但矩形不会显示。
但是,如果我将鼠标悬停在Windows任务栏中,并且工具提示出现在对话框应用程序的图标上,则会显示矩形。
无论用户对窗口执行什么操作(最小化,最大化,移动等),我都希望在图像上显示矩形。
答案 0 :(得分:0)
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));