gpt4 book ai didi

c++ - OnPaint MFC 上不显示矩形

转载 作者:太空宇宙 更新时间:2023-11-04 12:45:56 24 4
gpt4 key购买 nike

我有一个用 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

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

最佳答案

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

关于c++ - OnPaint MFC 上不显示矩形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51596830/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com