社区
界面
帖子详情
对话框里Picture控件显示的图片被弹出的对话框挡住后不能恢复
saliors
2005-07-01 09:49:11
一个对话框,上面放了一个Picture控件,在该控件上显示图片。打开一个打开文件的对话框,移动一下位置,再关闭,原来图片被打开文件对话框挡住的部分不能恢复,变成一个灰色的方块。
在OnPaint有刷新图片的语句。感觉是窗口刷新和OnPaint调用的顺序不对造成的,搞了半天,没有头绪,只好来请求各位帮忙看看是什么问题。
...全文
280
11
打赏
收藏
对话框里Picture控件显示的图片被弹出的对话框挡住后不能恢复
一个对话框,上面放了一个Picture控件,在该控件上显示图片。打开一个打开文件的对话框,移动一下位置,再关闭,原来图片被打开文件对话框挡住的部分不能恢复,变成一个灰色的方块。 在OnPaint有刷新图片的语句。感觉是窗口刷新和OnPaint调用的顺序不对造成的,搞了半天,没有头绪,只好来请求各位帮忙看看是什么问题。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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;
}
}
02-03学年第1学期VB考试题及标准答案整理.pdf
1. **InputBox函数**:`InputBox`函数用于
弹出
一个
对话框
提示用户输入信息,其返回值类型为字符串(String)。 2. **算术表达式计算**:表达式`4+5\6*7/8 Mod 9`的计算顺序遵循数学中的运算优先级规则。首先进行除法...
mfc
控件
显示
被遮挡_利用MFC的
Pic
tu
re
控件
显示
和处理图像
在《OpenCV教程-基础篇》的2.8节中,所创建的MFC图像
显示
是直接放在
对话框
面板的左上角的,感觉不大美观。在MFC快速应用opencv一书中则是介绍用SDI(单文档界面)来
显示
图像,《A step-by-step guide to the use of ...
VB 子窗体被
Pic
tu
reBox
控件
挡住
无法
显示
VB做机房收费系统的时候,用的MDI主窗体,在主窗体上加了一个
Pic
tu
rebox
控件
,运行的时候,点了子窗体,但是却没有出现,后来才发现,子窗体被
Pic
tu
rebox
控件
给当在了后面。 2、问题原因 在MDI程序中,子窗体...
【机房】问题-子窗体被覆盖
登录进入主窗体收,点击调用子窗体发现不
显示
,查了之后才发现是被主窗体的
图片
控件
给覆盖住了,由于主窗体上
不能
添加其他
控件
,只好用
图片
覆盖。那么只好想办法把子窗体
显示
出来,该如何解决呢!找度娘,度娘来把...
MFC/VC++中怎样设置位图按钮并且位图不会覆盖文字——–位图按钮
缺点:位图单一,
不能
显示
区分按钮各种状态,有闪屏情况 2.使用MS做好的CBitmapButton类: CBitmapButton是MS封装好的位图按钮类,从CButton类继承而来,提供两种使用方法,但使用前要创建一个CButton对象与其关联...
界面
15,981
社区成员
115,868
社区内容
发帖
与我相关
我的任务
界面
VC/MFC 界面
复制链接
扫一扫
分享
社区描述
VC/MFC 界面
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章