矩形未显示在OnPaint MFC上

时间:2018-07-30 14:57:03

标签: c++ visual-c++ mfc event-handling onpaint

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

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

enter image description here

第二,如果我最小化和最大化对话框窗口,则会显示图像,但矩形不会显示。

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

enter image description here

无论用户对窗口执行什么操作(最小化,最大化,移动等),我都希望在图像上显示矩形。

1 个答案:

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