15,979
社区成员
发帖
与我相关
我的任务
分享
//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函数没设置好呀?