gpt4 book ai didi

c++ - MFC 绘制的元素在 30-60 分钟后发生变化

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:11:25 26 4
gpt4 key购买 nike

我有一个带有完全自定义绘制 UI 的应用程序(即只是一堆带有文本的填充框)。大约运行 30-60 分钟后,UI 元素会自发发生变化。例如,白线(框边框)消失,文本调整大小等。

我已经链接到其中一个屏幕的一些前后图像。这表明所有的白线都消失了。其他屏幕显示文本大小发生显着变化。

之前:http://s21.postimg.org/cogqodson/BEFORE.png

之后:http://s24.postimg.org/7skx21sid/AFTER.png

此项目是使用 MFC 在 MS Visual C++ 2010 中编写的,并在 Windows 7 Pro 上运行。

这是我的 OnPaint() 代码:

void CMainWindow::OnPaint()
{
CPaintDC dcScreen( this );
CBitmap bitmap;
bitmap.CreateCompatibleBitmap( &dcScreen, m_rect.Width(), m_rect.Height() );

CDC dc;
dc.CreateCompatibleDC( &dcScreen );
CBitmap* pOldBitMap = dc.SelectObject( &bitmap );

dc.FillRect(m_rect, &BGBRUSH);
int bkmode = dc.SetBkMode(TRANSPARENT);
dc.SelectObject(&BGBRUSH);

CPen brightwhitepen(PS_SOLID, 5, RGB(255,255,255));
CPen* pOldPen = dc.SelectObject(&brightwhitepen);

// draw some stuff:
// dc.Rectangle, dc.DrawText, etc.
// ...

// Blit the memory device context to the screen device context
dcScreen.BitBlt
(
0,
0,
m_rect.Width(),
m_rect.Height(),
&dc,
0,
0,
SRCCOPY
);

dc.SetBkMode( bkmode ); // Restore old background mode
dc.SelectObject( pOldPen ); // reselect old pen
dc.SelectObject( pOldBitMap ); // Restore old bitmap
}

有没有人见过这样奇怪的行为?关于在哪里调查的任何提示?

谢谢!

最佳答案

我曾经解决过这样的问题,当时我忘记恢复其中一个 GDI 句柄的状态。解决方案是使用 SaveDCRestoreDC,这意味着您不必在使用完 DC 中恢复任何对象后。您可以下载 really convenient RAII class在这里为您完成所有工作。

第二个建议是使用常用对象和内置 DC 句柄,而不是创建自己的句柄。因此,像这样替换您的 brightwhitepen 代码:

dc.SetDCPenColor(RGB(255,255,255));
CPen* pBrightwhitepen = CPen::FromHandle((HPEN)GetStockObject(DC_PEN));

dc.SetDCBrushColor(RGB(0,0,255));
CBrush* pBgBrush = CBrush::FromHandle((HBRUSH)GetStockObject(DC_BRUSH));

现在使用这两个指针来绘制您的东西。优点是你没有分配任何东西,所以你不会泄漏任何东西,而且调用不会失败,因为库存对象总是存在的。

关于c++ - MFC 绘制的元素在 30-60 分钟后发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15908184/

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