窗口上绘制图像不显示问题

标题MFC窗口上bitblt不显示图像问题

一个问题坑了半天都才解决,自己记录下来做个记录,为遇到同样困难的同学做一个指引。

void CMFCShowPicDlg::OnBnClickedButton2()
{
	// TODO: 在此添加控件通知处理程序代码
	CClientDC dc(this);//一定不要用Cpaintdc

	CString strFile = _T("");

	CFileDialog    dlgFile(TRUE, NULL, NULL, OFN_HIDEREADONLY, _T("Describe Files (*.bmp)|*.bmp|All Files (*.*)|*.*||"), NULL);

	HBITMAP m_hBitmap;
	if (dlgFile.DoModal())
	{
		strFile = dlgFile.GetPathName();
		
		m_hBitmap = (HBITMAP)LoadImage(NULL, strFile, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_DEFAULTSIZE | LR_CREATEDIBSECTION);
		
		
		CBitmap bitmap;
		bitmap.Attach(m_hBitmap);

		BITMAP   mbitmap;
		GetObject(m_hBitmap, sizeof(mbitmap), &mbitmap);


		CDC MemDC;
		MemDC.CreateCompatibleDC(&dc);
		//MemDC.SelectObject(&bitmap);    //用cbitmap 对象指针可以
		MemDC.SelectObject(m_hBitmap);   //用HBITMAP对象可以
		//MemDC.SelectObject(&mbitmap);//用BITMAP对象指针不可以
	

		CRect rect;
		GetClientRect(&rect);

		dc.SetStretchBltMode(HALFTONE);
		dc.BitBlt(0, 0,rect.Width(),rect.Height(), &MemDC, 0, 0, SRCCOPY);
		
		dc.BitBlt(700, 0, rect.Width(), rect.Height(), &MemDC, 0, 0, SRCCOPY);
		
		dc.BitBlt(0, 500, rect.Width(), rect.Height(), &MemDC, 0, 0, SRCCOPY);

		dc.BitBlt(700, 500, rect.Width(), rect.Height(), &MemDC, 0, 0, SRCCOPY);		
		
	}

}
		

下面是CClientDC和CPaintDC的区别:

1.CClientDC(客户区设备上下文)用于客户区的输出它在构造函数中封装了GetDC(),在析构函数中封装了ReleaseDC()函数。一般在响应非窗口重画消息(如键盘输入时绘制文本、鼠标绘图)绘图时要用到它。
2.CPaintDC用于响应窗口重绘消息(WM_PAINT)是的绘图输出。CPaintDC在构造函数中调用BeginPaint()取得设备上下文,在析构函数中调用EndPaint()释放设备上下文。EndPaint()除了释放设备上下文外,还负责从消息队列中清除WM_PAINT消息。因此,在处理窗口重画时,必须使用CPaintDC,否则WM_PAINT消息无法从消息队列中清除,将引起不断的窗口重画。CPaintDC也只能用在WM_PAINT消息处理之中

此文章主要为了自己做备忘录

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值