MFC,picture控件中图片缩放的新手问题,高分都给解决者

zjk2752 2010-09-08 08:53:33
我想把图片显示在picture控件上,图片是BMP格式的,但是图片太大了,所以我想把图片都缩放256*256大小。下面是我的做法和程序,为了简便,建立了个基于对话框的工程,且对话框上除了picture控件什么都没有,我按下面代码加上去后,能显示图片,但是图片缩放只在一瞬间就没了,也就是能变为256*256,但是第二次执行ONPAINT图片就又回到原始大小不了,不知道为什么,还请高手出手指教呀,下面是代码:

//vc picture控件通过CBitmap,HBITMAP,直接用OnPaint()绘制
//首先在CTestDlg类中声明一个变量: CBitmap m_bmp;
//然后我们在对话框中加入一个picture 标签,名为IDC_STATIC1
//然后改写OnInitDialog:
BOOL CDisplayPic::OnInitDialog()
{
CDialog::OnInitDialog();
if( m_bmp.m_hObject != NULL )//判断
m_bmp.DeleteObject();
/////////载入图片
HBITMAP hbmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),
"c:\\aaa.bmp", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE);
if( hbmp == NULL )
return FALSE;
///////////////////////该断程序用来取得加载的BMP的信息////////////////////////
m_bmp.Attach( hbmp );
DIBSECTION ds;
BITMAPINFOHEADER &bminfo = ds.dsBmih;

m_bmp.GetObject( sizeof(ds), &ds );
int cx=bminfo.biWidth; //得到图像宽度
int cy=bminfo.biHeight; //得到图像高度
/////////////////// ////////////////////////////////
/////////////得到了图像的宽度和高度后,我们就可以对图像大小进行适应,即调整控件的大小,让它正好显示一张图片///////////////////////////
CRect rect;
GetDlgItem(IDC_STATIC1)->GetWindowRect(&rect);
ScreenToClient(&rect);
GetDlgItem(IDC_STATIC1)->MoveWindow(rect.left,rect.top,cx,cy,true);//调整大小
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}


//

//图片加载成功了,标签大小也适应了,下面就是绘制绘制图像了,打开类向导,重载WM_PAINT消息
void CpictureDlg::OnPaint()
{
CPaintDC dc(GetDlgItem(IDC_STATIC)); //用此句,得到picture控件的DC,图像将被绘制在控件上
CRect rcclient;//
// CRect rcclient1;
GetDlgItem(IDC_STATIC)->GetClientRect(&rcclient);//获得PICTURE控件所在矩形区
CDC memdc;
memdc.CreateCompatibleDC(&dc); //创建一个和DC关联的内存设备上下文
BITMAP bm;
m_bmp.GetBitmap(&bm);
CBitmap* pOldImageBMP = memdc.SelectObject(&m_bmp);

dc.SetStretchBltMode(HALFTONE);
StretchBlt(dc, 0,0, 256,256,memdc, 0, 0,rcclient.Width(), rcclient.Height(),SRCCOPY);
memdc.SelectObject(pOldImageBMP);

CWnd::DefWindowProc(WM_PAINT, (WPARAM)memdc.m_hDC , 0);
CBrush brush;
brush.CreatePatternBrush(&m_bmp);
dc.FillRect(rcclient, &brush); //这里是画图的操作呀

Sleep(5000);//这里是为了看效果加上的
}
我在想问题是不是出在 StretchBlt函数的参数设置上有问题呀?还是前面初始化OnInitDialog函数没设置好呀?

...全文
2028 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
zyrr159487 2010-10-08
  • 打赏
  • 举报
回复
在onPaint中缩放图片才行的
向立天 2010-10-08
  • 打赏
  • 举报
回复
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面界面版关于版主结帖工作的具体办法

15,979

社区成员

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

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