| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2491 人关注过本帖
标题:[求助]在STATIC控件上显示位图
取消只看楼主 加入收藏
zabbey
Rank: 1
等 级:新手上路
帖 子:55
专家分:0
注 册:2007-10-10
收藏
 问题点数:0 回复次数:8 
[求助]在STATIC控件上显示位图

void CBmpViewDlg::OnOpen() //打开按钮
{
// TODO: Add your control notification handler code here
CFileDialog pFiledlg(TRUE, NULL, NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, "位图文件(*.bmp)|*.bmp|",NULL);
if(pFiledlg.DoModal())
{
m_strFile = pFiledlg.GetPathName();
}
if(m_strFile == "")
{
//没选择文件
return;
}

hbitmap = (HBITMAP)::LoadImage (::AfxGetInstanceHandle(), m_strFile,
IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

DrawBmp();//画出来

}

void CBmpViewDlg::DrawBmp()
{
CRect rect;
CStatic* p_bitmap = (CStatic*)GetDlgItem(IDC_IMAGE);
p_bitmap->GetClientRect(&rect);

CWnd *pWnd = GetDlgItem(IDC_IMAGE);
CDC *pDC = pWnd->GetDC();

BITMAP m_Bm;
HBITMAP hOldBmp;
::GetObject(hbitmap, sizeof(m_Bm), &m_Bm);

CDC dcImage;
dcImage.CreateCompatibleDC(pDC);
hOldBmp = (HBITMAP)dcImage.SelectObject(hbitmap);

int x, y;
x = (rect.right - m_Bm.bmWidth) / 2;
y = (rect.bottom - m_Bm.bmHeight) / 2;
pDC->BitBlt(x, y, x + m_Bm.bmWidth, y + m_Bm.bmHeight, &dcImage, 0, 0, SRCCOPY);
dcImage.SelectObject(hOldBmp);
}

hbitmap声明为类成员变量:
HBITMAP hbitmap;

这样能显示出来位图,但是显示出来的位图在窗口最小化后就没有了,并且在打开第二个位图后显示还有重叠,不知道问题出在了哪里。

搜索更多相关主题的帖子: 位图 STATIC 控件 
2007-10-11 14:28
zabbey
Rank: 1
等 级:新手上路
帖 子:55
专家分:0
注 册:2007-10-10
收藏
得分:0 
以下是引用Janlex在2007-10-11 14:36:02的发言:
在OnPaint()函数中加上两行

p_bitmap->SetBitmap(NULL);
DrawBmp();

解决了最小化图像消失的问题,但是打开第二幅图还是有重叠。


2007-10-11 14:47
zabbey
Rank: 1
等 级:新手上路
帖 子:55
专家分:0
注 册:2007-10-10
收藏
得分:0 
以下是引用Janlex在2007-10-11 14:50:44的发言:
晕,在OnOpen()加上p_bitmap->SetBitmap(NULL);

上面我在OnPaint()里也没加p_bitmap->SetBitmap(NULL);加上的话就把显示格式弄乱了,本来都是通过最后那段代码设置成居中显示,加上就又在左上,且只是一个小方格。
在OnOpen()里加上p_bitmap->SetBitmap(NULL);也让格式乱了,而且依然有重叠。

[此贴子已经被作者于2007-10-11 14:59:03编辑过]


2007-10-11 14:58
zabbey
Rank: 1
等 级:新手上路
帖 子:55
专家分:0
注 册:2007-10-10
收藏
得分:0 
回复:(Janlex)晕,在OnOpen()加上p_bitmap->SetB...
图片附件: 游客没有浏览图片的权限,请 登录注册




黑的是上一幅图的,绿的是打开的图的。

[此贴子已经被作者于2007-10-11 15:03:08编辑过]


2007-10-11 15:02
zabbey
Rank: 1
等 级:新手上路
帖 子:55
专家分:0
注 册:2007-10-10
收藏
得分:0 
以下是引用Janlex在2007-10-11 15:08:26的发言:
我错了.没仔细看你代码,

你STATIC控件显示图用的不是SetBitmap..而是用的bitblt绘上去的..

是啊,BZ很热心啊!应该有其它方法来擦掉吧。


2007-10-11 15:11
zabbey
Rank: 1
等 级:新手上路
帖 子:55
专家分:0
注 册:2007-10-10
收藏
得分:0 

在网上查了一阵,改好了。好费神!


2007-10-11 19:07
zabbey
Rank: 1
等 级:新手上路
帖 子:55
专家分:0
注 册:2007-10-10
收藏
得分:0 

代码:
void CBmpViewDlg::OnOpen()
{
// TODO: Add your control notification handler code here
CFileDialog pFiledlg(TRUE, NULL, NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, "位图文件(*.bmp)|*.bmp|",NULL);
if(pFiledlg.DoModal())
{
m_strFile = pFiledlg.GetPathName();
}
if(m_strFile == "")
{
//没选择文件
return;
}

//刷新
//Invalidate();

CRect rect;
CStatic* p_bitmap = (CStatic*)GetDlgItem(IDC_IMAGE);
p_bitmap->GetClientRect(&rect);
InvalidateRect(rect, TRUE);
UpdateWindow();

hbitmap = (HBITMAP)::LoadImage (::AfxGetInstanceHandle(), m_strFile,
IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

DrawBmp();

}

void CBmpViewDlg::DrawBmp()
{
CRect rect;
CStatic* p_bitmap = (CStatic*)GetDlgItem(IDC_IMAGE);
p_bitmap->GetClientRect(&rect);

CWnd *pWnd = GetDlgItem(IDC_IMAGE);
CDC *pDC = pWnd->GetDC();

BITMAP m_Bm;
HBITMAP hOldBmp;
::GetObject(hbitmap, sizeof(m_Bm), &m_Bm);

CDC dcImage;
dcImage.CreateCompatibleDC(pDC);
hOldBmp = (HBITMAP)dcImage.SelectObject(hbitmap);

int x, y;
x = (rect.right - m_Bm.bmWidth) / 2;
y = (rect.bottom - m_Bm.bmHeight) / 2;
pDC->BitBlt(x, y, x + m_Bm.bmWidth, y + m_Bm.bmHeight, &dcImage, 0, 0, SRCCOPY);

dcImage.SelectObject(hOldBmp);

}


2007-10-11 19:07
zabbey
Rank: 1
等 级:新手上路
帖 子:55
专家分:0
注 册:2007-10-10
收藏
得分:0 
另外,在OnPaint()中加入了:
DrawBmp();


参考:UpdateWindow只向窗体发送WM_PAINT消息,在发送之前判断GetUpdateRect(hWnd,NULL,TRUE)看有无可绘制的客户区域,如果没有,则不发送WM_PAINT。如果希望立即刷新无效区域,可以在调用InvalidateRect之后调用UpdateWindow,如果客户区的任一部分无效,则UpdateWindow将导致Windows用WM_PAINT消息调用窗口过程(如果整个客户区有效,则不调用窗口过程)。这一WM_PAINT消息不进入消息队列,直接由WINDOWS调用窗口过程。窗口过程完成刷新以后立刻退出,WINDOWS将控制返回给程序中UpdateWindow调用之后的语句。

2007-10-11 19:10
zabbey
Rank: 1
等 级:新手上路
帖 子:55
专家分:0
注 册:2007-10-10
收藏
得分:0 
如果谁有更好的方案也贴出来啊!

2007-10-11 19:11
快速回复:[求助]在STATIC控件上显示位图
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016864 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved