对话框背景图丢失了,全部恢复灰色,来着有分

tangshiping 2004-09-14 12:42:08
对话框背景贴图:
void C.....rDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting

// SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CPaintDC dc(this); //创建一个设备描述表
HBITMAP hbitmap = //创建一个HBITMAP变量
::LoadBitmap(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_MAIN));
HDC hMemDC = ::CreateCompatibleDC(NULL); //创建一个内存设备描述表
SelectObject(hMemDC, hbitmap);

::StretchBlt(dc.m_hDC,0,0,1024,1024,hMemDC,0,0,1024,1024,SRCCOPY);
::DeleteDC(hMemDC);
::DeleteObject(hbitmap);


CDialog::OnPaint();
}
}
另外所有的按纽都用:
CBitmapButton类自绘贴图。
程序执行后,一切正常。这是个播放器程序,同时播放多个视频文件的可以。
问题:运行后并开启录象,播放正常。播放停止后,没有关闭程序,等一段时间,大约1小时,把界面切出来一看,所有的图的掉了,全部原来对话框的灰色!
于是程序启动后不开播放直接放在那里不管测试,一段时间后一样的结果。看内存,cpu都正常。
大家有没有遇到过啊?为什么?
...全文
244 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
tangshiping 2004-09-14
  • 打赏
  • 举报
回复
HBITMAP hOldBitmap = SelectObject(hMemDC, hbitmap);
(519) : error C2440: 'initializing' : cannot convert from 'void *' to 'struct HBITMAP__ *'
保存旧的怎么出错了?
dirdirdir3 2004-09-14
  • 打赏
  • 举报
回复
CDialog::OnPaint()去掉。
tangshiping 2004-09-14
  • 打赏
  • 举报
回复
我试试!
tangshiping 2004-09-14
  • 打赏
  • 举报
回复
如果不每次Paint读的话,切换界面再切回来不就灰了吗?我查了,资源没有泄露啊好象。我手工没有发现,然后我执行了很多这个程序,并播放很多视频,内存一下用到80%,把程序挨个关闭,内存马上恢复到开始时的样子。
无聊客 2004-09-14
  • 打赏
  • 举报
回复
另外:
HBITMAP hOldBitmap = SelectObject(hMemDC, hbitmap);
::StretchBlt(dc.m_hDC,0,0,1024,1024,hMemDC,0,0,1024,1024,SRCCOPY);
SelectObject(hMemDC,hOldBitmap);
::DeleteDC(hMemDC);
::DeleteObject(hbitmap);
CDialog::OnPaint();
DentistryDoctor 2004-09-14
  • 打赏
  • 举报
回复
HDC hMemDC = ::CreateCompatibleDC(NULL); //创建一个内存设备描
=>
HDC hMemDC = ::CreateCompatibleDC(dc.GetSafeHdc()); //创建一个内存设备描

CDialog::OnPaint();去掉。
无聊客 2004-09-14
  • 打赏
  • 举报
回复
估计是资源泄露,查下资源泄露,BITMAP如果都一样的话,把做成成员变量读一次就可以了,不用每次Paint去读。
adamx 2004-09-14
  • 打赏
  • 举报
回复
记得DeleteObject()就可以了。
zhaogaojian 2004-09-14
  • 打赏
  • 举报
回复
mark
tangshiping 2004-09-14
  • 打赏
  • 举报
回复
好!解决了。经过DentistryDoctor(牙科医生) 在下面指教。现公布结果,希望大家不要再犯。
根源:不在上面公布的代码里面。
发现症状:在任务管理器里发现GDI没秒泄露2个。
每秒做的事情是在时钟里显示当前时间,显示在2个静态文本上,颜色在OnCtlColor处理,用
HBRUSH hbr2 = ::CreateSolidBrush(RGB(20,20,20));//背景色
pDC->SetBkMode(TRANSPARENT);
pDC ->SetTextColor(RGB(255,0,0));//文本色
return hbr2;
这样就出错,如果把hbr2 的声明和创建放在别的地方,不要放在OnCtlColor的话,就 OK!

大家千万不要在OnCtlColor里创建HBRUSH !尤其是那种时刻用到并刷新的。切记啊,不然就等你的 GDI用尽并变成“灰姑娘”吧。
问题已经解决,来着有分,明天另开贴送牙医300分。这里的分分给大家了。希望明天的分不要被斑主移到非技术区,谢谢。
chan2chen 2004-09-14
  • 打赏
  • 举报
回复
up
up
tangshiping 2004-09-14
  • 打赏
  • 举报
回复
完了,都不行!还是变成灰色了。大家快来啊!!!!再想办法
LIenjoyFE 2004-09-14
  • 打赏
  • 举报
回复
up
tangshiping 2004-09-14
  • 打赏
  • 举报
回复
为什么按纽的图也掉了呢?他可跟背景图没有关系啊?难道放的时间长了也会丢?跟这个社会一样没有安全感怎么
tangshiping 2004-09-14
  • 打赏
  • 举报
回复
CDialog::OnPaint()去掉。
毛病一样。
看加上hOldBitmap = (HBITMAP)SelectObject(hMemDC, hbitmap);后怎么样了
tangshiping 2004-09-14
  • 打赏
  • 举报
回复
强制转换可以。
dirdirdir3 2004-09-14
  • 打赏
  • 举报
回复
HBITMAP hOldBitmap = (HBITMAP)SelectObject(hMemDC, hbitmap);
要强制转换类型吧
tangshiping 2004-09-14
  • 打赏
  • 举报
回复
519) : error C2440: 'initializing' : cannot convert from 'void *' to 'struct HBITMAP__ *'
Conversion from 'void*' to pointer to non-'void' requires an explicit cast
tangshiping 2004-09-14
  • 打赏
  • 举报
回复
还是一样的错误
DentistryDoctor 2004-09-14
  • 打赏
  • 举报
回复
没注意是你。

HBITMAP hOldBitmap = SelectObject(hMemDC, hbitmap);
=>
HBITMAP hOldBitmap = ::SelectObject(hMemDC, hbitmap);
加载更多回复(1)

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧