CWnd和CDC, hwnd和hdc

摘自 http://www.cnblogs.com/qq78292959/archive/2011/08/25/2153457.html


虽然Gilbert之前介绍过CWnd和HWnd的区别, 但是这里和其他几个CDC, HDC放在一起重申一下其中的区别和关系.

1.对象和句柄

CWnd是类, HWnd是句柄, CWnd封装了HWnd

CWnd wnd;

HWnd hWnd;

wnd.Attach(hWnd);//句柄到对象

    wnd->m_hWnd;// 对象到句柄

当然一般在程序中是这样获得句柄:

AfxGetMainWnd()->m_hwnd;

同样的, CDC和HDC也是这样的关系:

CDC *pDC=new CDC;

HDC hdc;

pDC->GetSafeHdc();//通过对象获得句柄:

pDC->Attach(hdc); //通过句柄获得对象:


HWND是SDK定义的类型,是一个无确切意义的32-bit值,在调用API时用于指代窗体。 
CWnd*是一个有确切意义的指针,指向一个MFC窗体类CWnd的实例。因为MFC对SDK做了封装,大部分调用都可以用CWnd*作为参数,所以很容易混淆。从一个CWnd*获取句柄的方法是pWnd->GetSafeHwnd(),他比 pWnd->m_hWnd安全,因为前者在pWnd == NULL的时候返回NULL而后者出现access violation.

2. CWnd和CDC, hwnd和hdc

所有跟窗口相关的操作都被封装在CWnd类中; 所有跟绘图相关的操作都被封装在CDC类中.

hwnd句柄是描述一个窗口的形状、位置、大小、是否显示、它的父窗口、兄弟窗口、等等的一组数据结构;hdc句柄是一个实实在在的用于具体表现这个窗口时,需要对这个窗口有个场合来实现的地方。  

3. 使用不同的CDC绘图

CClientDC      客户区dc;

CWindowDC      整窗口dc;    

CDC            任何dc;

/*
  CDC *pDC=CWnd::GetDC();
  //此处直接使用CWnd类的GetDC,其返回值为CDC*
  //SDK中的同名函数使用返回的是HDC

*/
  pDC->MoveTo(m_ptOrigin);
  pDC->LineTo(point);
  CWnd::ReleaseDC(pDC);
  


  /*//使用CClientDC绘图
  CClientDC派生自CDC,在构造的时候调用GetDC,
  在析构的时候调用ReleaseDC。使得我们不必
  显示调用GetDC与ReleaseDC。
  */
  CClientDC dc(this);
  dc.MoveTo(m_ptOrigin);
  dc.LineTo(point);

/*//使用CWindowDC绘图
  同样派生自CDC,构造调用GetWindowDC,

析构时调用ReleaseDC()。
  可以访问整个屏幕区域,包括客户区和非客户区。
  */
  CWindowDC dc(this);
  dc.MoveTo(m_ptOrigin);
  dc.LineTo(point);



另百度

http://zhidao.baidu.com/link?url=fqc3mNgXtrZpbAh0r5rLQq2q87dVOikoZWeuJRfS5glmpRdOx1YjYAiQyW1xjHowC2TIl02IctUq4nUVd0t54xEmq_3bYXyAyT48-R5aLda

关于VC++贴图的问题,bitblt

2013-10-09 13:56 aprz512 | 浏览 234 次
hdc = GetDC(hWnd);  
mdc = CreateCompatibleDC(hdc);  
bufdc = CreateCompatibleDC(hdc);  

bg = (HBITMAP)LoadImage(NULL,"bg.bmp",IMAGE_BITMAP,640,480,LR_LOADFROMFILE); 

SelectObject(bufdc,bg);  
BitBlt(mdc,0,0,640,480,bufdc,0,0,SRCCOPY);  
BitBlt(hdc,0,0,640,480,mdc,0,0,SRCCOPY); 

问下,为什么这样贴图,窗口就没有任何显示呢?
为什么这样写
SelectObject(mdc,bg); 
BitBlt(hdc,0,0,640,480,mdc,0,0,SRCCOPY);  
就能显示图片?中间加了一个过渡就不能显示了?
搜索SelectObject(mdc, bg)函数到底执行了什么功能,是将bg加载到mdc中了吗?
2013-10-09 16:51 提问者采纳
可以把bmp理解成画布,DC是绘画的架子,PEN、LINE、BITBLT之类的是工具;

你这个代码里里,把画布准备好了(bg),也把画布跟bufdc装在一起了;然后想通过BITBLT把它给绘制到MDC里面;可是问题是,你的MDC只是一个架子,MDC里面还没有画布呢,当然就失败了;

总结问题所在,就是你的mdc里面,没有selectobject过BMP,所以有问题。
解决方法:
在你的SelectObject下面,再加两行代码:
SelectObject(bufdc,bg);  // 把bg画布放到bufdc的架子上
mbmp=CreateCompatibleBitmap(hdc, 640, 480);  // 新代码,创建个画布mbmp
SelectObject(mdc, mbmp);   // 新代码,把mbmp画布放到MDC这个架子上

// 现在应该可以了
BitBlt(mdc,0,0,640,480,bufdc,0,0,SRCCOPY); 
BitBlt(hdc,0,0,640,480,mdc,0,0,SRCCOPY);


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值