OnPaint MFC 上不显示矩形

Rectangle not showing on OnPaint MFC

我有一个用 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();
}

应用程序运行时,矩形绘制在对话框的左上角,而不是图片控件。

其次,如果我最小化和最大化对话框 window,图像会显示,但矩形不会。

但是,如果我将鼠标悬停在 windows 任务栏上并且工具提示出现在对话框应用程序的图标上,则会显示矩形。

无论用户对 window 做什么(最小化、最大化、移动等),我都想在图像上显示矩形。

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