对话框背景颜色意外擦出问题?希望路过牛人帮忙看看!

wuliang11 2009-05-13 11:11:53
我要实现的一个问题是,以一幅bmp图片作为一个对话框的背景颜色,对话框上有好些button按键,点击每个按键都会弹出一个对话框。于是问题出现了,除了一种对话框外,移动或关闭其它对话框都不会改变先前那个对话框(父对话框)颜色。这种对话框是,它上面有个button按键,点击它会弹出一个CFileDialog对话框运行时,载入一个文件(用的是打开对话框),现在移动这个对话框。它会擦出先前父对话框的背景,当关闭它时,父对话框上面的背景颜色,变成了关闭前覆盖了它的窗口的颜色。移动这个父对话框,或者快速晃动它,它的背景就变成透明的了,变成了它覆盖的窗口的颜色(就像透明了一样).但是有个解决办法,就是我在debug中加入那幅设为背景的位图,这就没问题了。但是我想知道,为什么别的对话框不会呢,为什么在弹出CFileDialog对话框,打开了一个文件,它就会影响父对话框的背景颜色呢,难道是父对话框没有在掉那幅图片,还是把它的默认路径给改变了呢?
下面是主要源代码:
父对话框上的绘图函数
void CMy57Dlg::OnPaint()
{
if (IsIconic())
{
}
else
{
// 使用MemoryDC先在内存里把图画好,再复制到屏幕上
// 这对于一次画图过程很长的情况比较管用。毕竟内存操作比较快,
// 而且复制到屏幕又是一次性的,至少不会出现可以明显看出一个东东从左画到右的情况。



CPaintDC dc(this);

HBITMAP hBmp=(HBITMAP)LoadImage(NULL,"dispay.bmp",
IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
CBitmap bmp;
bmp.Attach(hBmp);
CDC memDC;
memDC.CreateCompatibleDC(&dc);
CBitmap *pOldBmp = (CBitmap *)memDC.SelectObject(bmp);
CRect rect, rectWnd;
GetWindowRect(rect);
GetClientRect(rect);

int width,height;
width=400;
height=200;

dc.StretchBlt( rect.left, rect.top, rect.Width(),
rect.Height() ,&memDC ,0 ,0 ,width ,height ,SRCCOPY );

memDC.SelectObject(&pOldBmp);

ReleaseDC(&memDC);
Invalidate(true);
CDialog::OnPaint();
}

}

弹出一个CFileDialog对话框的程序代码:

void YiCunImageProcess::OnOpenImage()
{// TODO: Add your control notification handler code here
CFileDialog dlg(TRUE,"*.*","*.avi",NULL,"*.avi",this);//打开对话框
dlg.m_ofn.Flags|=OFN_FILEMUSTEXIST;
if(dlg.DoModal()==IDOK)
{
m_filename=dlg.GetPathName( );
m_avi.CAviCreate(m_filename); //打开AVI文件并得到该文件流的信息
}
m_avi.AviRead(20);
//图像头文件初始化//
bmi=(BITMAPINFO*) new BYTE[sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256];
memset(bmi, 0, sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256);

bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);//+sizeof(RGBQUAD)*256;
bmi->bmiHeader.biPlanes = 1;
bmi->bmiHeader.biBitCount = 8;
bmi->bmiHeader.biCompression = BI_RGB;
bmi->bmiHeader.biWidth = m_avi.cx;
bmi->bmiHeader.biHeight = m_avi.cy;
bmi->bmiHeader.biSizeImage = 0;
bmi->bmiHeader.biClrUsed = 256;
bmi->bmiHeader.biClrImportant = 0;
bmi->bmiHeader.biXPelsPerMeter=0;//0x0B12;
bmi->bmiHeader.biYPelsPerMeter=0;//0x0B12;
for(int i=0;i<256;i++)
{
bmi->bmiColors[i].rgbBlue=i;
bmi->bmiColors[i].rgbGreen=i;
bmi->bmiColors[i].rgbRed=i;
bmi->bmiColors[i].rgbReserved=0;
}
//上面这段代码是在对话框上显示位图的一种方法。

CClientDC dc(this);
ShowImage(&dc, m_avi.pData);
ReleaseDC(&dc);


}


请大虾们帮忙看看,最有可能的问题是在弹出CFileDialog后,打开一个文件后,路径变了。要是那样,那怎么改呢?希望得到大虾们的指点,谢谢
...全文
115 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
路人乙2019 2009-05-13
  • 打赏
  • 举报
回复
你最好试试在onerasebackground里贴图片.
路人乙2019 2009-05-13
  • 打赏
  • 举报
回复
因为它是个模式对话框,它关闭前主对话框等待它关闭,不能响应任何消息,所以paint根本不会执行.
wuliang11 2009-05-13
  • 打赏
  • 举报
回复
会阿,我用上面那种在debug中加入那张作为背景的位图方法,然后移动子对话框,父对话框的背景不变啊!应该不是这个原因所致?

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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