对话框里Picture控件显示的图片被弹出的对话框挡住后不能恢复

saliors 2005-07-01 09:49:11
一个对话框,上面放了一个Picture控件,在该控件上显示图片。打开一个打开文件的对话框,移动一下位置,再关闭,原来图片被打开文件对话框挡住的部分不能恢复,变成一个灰色的方块。
在OnPaint有刷新图片的语句。感觉是窗口刷新和OnPaint调用的顺序不对造成的,搞了半天,没有头绪,只好来请求各位帮忙看看是什么问题。
...全文
273 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
saliors 2005-07-02
  • 打赏
  • 举报
回复
TO :goodboyws(深夜不眠者)
谢谢啦。
goodboyws 2005-07-01
  • 打赏
  • 举报
回复
OnPaint怎么写的,OnPaint应该是调用图片控件的Invalidate吧,能否给出代码
saliors 2005-07-01
  • 打赏
  • 举报
回复
显示图片用的是IPicture借口。
okhere 2005-07-01
  • 打赏
  • 举报
回复
是需要重画的onpaint() 或Invalidate()
goodboyws 2005-07-01
  • 打赏
  • 举报
回复
把m_photo干掉, 从资源里彻底删了, 然后将代码改为i
OnPaint()
{
CPaintDC dc(this); // device context for painting

if (csPhoto != "")
ShowPic(csPhoto, dc.GetSafeHdc(), 715, 436);
else
{
CPoint pt(0, 0);
HBITMAP hBitmap = LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_PATROLBLANKBMP));
BITMAP bm;
GetObject(hBitmap , sizeof(bm), &bm);
SIZE bmSize;
bmSize.cx = bm.bmWidth;
bmSize.cy = bm.bmHeight;
dc.DrawState(pt, bmSize, hBitmap, DST_BITMAP | DSS_NORMAL);
}

int iCount = pStArray->GetSize();
for (int i = 0; i < iCount; i++)
{
((CStatic*)((*pStArray)[i]))->ShowWindow(SW_SHOW);
}
}

HRESULT ShowPic(CString lpstrFile, HDC hDC_Temp, int nScrWidth, int nScrHeight)
{

IPicture *pPic;
IStream *pStm;

BOOL bResult;

HANDLE hFile = NULL;
DWORD dwFileSize, dwByteRead;

// 打开硬盘中的图形文件
hFile = CreateFile(lpstrFile,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);

if (hFile != INVALID_HANDLE_VALUE)
{
dwFileSize = GetFileSize(hFile, NULL); // 获取文件字节数

if (dwFileSize == 0xFFFFFFFF)
return E_FAIL;
}
else
{
return E_FAIL;
}

// 分配全局存储空间
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
LPVOID pvData = NULL;

if (hGlobal == NULL)
return E_FAIL;

if ((pvData = GlobalLock(hGlobal)) == NULL) // 锁定分配内存块
return E_FAIL;

ReadFile(hFile, pvData, dwFileSize, &dwByteRead, NULL); // 把文件读入内存缓冲区

GlobalUnlock(hGlobal);

CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);

// 装入图形文件
bResult=OleLoadPicture(pStm, dwFileSize, TRUE, IID_IPicture, (LPVOID*)&pPic);

if(FAILED(bResult))
return E_FAIL;

OLE_XSIZE_HIMETRIC hmWidth; // 图片的真实宽度
OLE_YSIZE_HIMETRIC hmHeight; // 图片的真实高度
pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight);

// 将图形输出到屏幕上(有点像BitBlt)
bResult = pPic->Render(hDC_Temp,
0,
0,
nScrWidth,
nScrHeight,
0,
hmHeight,
hmWidth,
-hmHeight,
NULL);

pPic->Release();
pStm->Release();

CloseHandle(hFile); // 关闭打开的文件

if (SUCCEEDED(bResult))
{
return S_OK;
}
else
{
return E_FAIL;
}
}
saliors 2005-07-01
  • 打赏
  • 举报
回复
楼上的,不行啊,一样。
Phourm 2005-07-01
  • 打赏
  • 举报
回复
ShowPic(csPhoto, this->GetSafeHwnd(), 715, 436);
saliors 2005-07-01
  • 打赏
  • 举报
回复
哦?假如考虑修改最少的话,应该怎么改啊?先谢谢先。
goodboyws 2005-07-01
  • 打赏
  • 举报
回复
或者你干脆把m_photo去掉,都画在对话框上
goodboyws 2005-07-01
  • 打赏
  • 举报
回复
ShowPic写的不对,应该是把文件名传给m_photo, 由m_photo来画, 因为STATIC控件没有独享的DC,它实际上是和对话框共享一个DC, 所以就出现那种情况
saliors 2005-07-01
  • 打赏
  • 举报
回复
OnPaint()
{
CPaintDC dc(this); // device context for painting

if (csPhoto != "")
ShowPic(csPhoto, m_photo.GetSafeHwnd(), 715, 436);
else
{
m_photo.SetBitmap(LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_PATROLBLANKBMP)));
m_photo.RedrawWindow();
m_photo.UpdateWindow();
}

int iCount = pStArray->GetSize();
for (int i = 0; i < iCount; i++)
{
((CStatic*)((*pStArray)[i]))->ShowWindow(SW_SHOW);
}
}

HRESULT ShowPic(CString lpstrFile, HWND hwnd, int nScrWidth, int nScrHeight)
{
HDC hDC_Temp = ::GetDC(hwnd);

IPicture *pPic;
IStream *pStm;

BOOL bResult;

HANDLE hFile = NULL;
DWORD dwFileSize, dwByteRead;

// 打开硬盘中的图形文件
hFile = CreateFile(lpstrFile,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);

if (hFile != INVALID_HANDLE_VALUE)
{
dwFileSize = GetFileSize(hFile, NULL); // 获取文件字节数

if (dwFileSize == 0xFFFFFFFF)
return E_FAIL;
}
else
{
return E_FAIL;
}

// 分配全局存储空间
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
LPVOID pvData = NULL;

if (hGlobal == NULL)
return E_FAIL;

if ((pvData = GlobalLock(hGlobal)) == NULL) // 锁定分配内存块
return E_FAIL;

ReadFile(hFile, pvData, dwFileSize, &dwByteRead, NULL); // 把文件读入内存缓冲区

GlobalUnlock(hGlobal);

CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);

// 装入图形文件
bResult=OleLoadPicture(pStm, dwFileSize, TRUE, IID_IPicture, (LPVOID*)&pPic);

if(FAILED(bResult))
return E_FAIL;

OLE_XSIZE_HIMETRIC hmWidth; // 图片的真实宽度
OLE_YSIZE_HIMETRIC hmHeight; // 图片的真实高度
pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight);

// 将图形输出到屏幕上(有点像BitBlt)
bResult = pPic->Render(hDC_Temp,
0,
0,
nScrWidth,
nScrHeight,
0,
hmHeight,
hmWidth,
-hmHeight,
NULL);

pPic->Release();
pStm->Release();

CloseHandle(hFile); // 关闭打开的文件

if (SUCCEEDED(bResult))
{
return S_OK;
}
else
{
return E_FAIL;
}
}

15,979

社区成员

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

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