1.CBitmap-------------------------------------------------------------------------------------

1、类层次
CObject
    CGdiObject
        CBitmap
BOOL CGdiObject::~CGdiObject()
{
    if (m_hObject == NULL)
  return FALSE;
 return ::DeleteObject(Detach());
}
从CGdiObject的析构函数中,可以看出有先Detach再Delete

2、BOOL CBitmap::LoadBitmap(LPCTSTR lpszResourceName);
   BOOL CBitmap::LoadBitmap(UINT nIDResource);
对应Win32 SDK中的LoadBitmap
HBITMAP LoadBitmap(
  HINSTANCE hInstance,  // handle to application instance
  LPCTSTR lpBitmapName  // name of bitmap resource
);
注意:由LoadBitmap

2.CDC-----------------------------------------------------------------------------------------------

class CDC : public CObject
{
public:
 static CDC* PASCAL FromHandle(HDC hDC);
 
 // Attach与Detach函数
 BOOL Attach(HDC hDC);
 HDC Detach();
 
 // 构造与析构函数
 CDC();
 virtual ~CDC();
}

1、CDC的构造函数和析构函数
CDC::CDC()
{
 m_hDC = NULL;
}
CDC::~CDC()
{
 if (m_hDC != NULL)
  ::DeleteDC(Detach());
}
从析构函数中可以看出,释放了关联的HDC
并且在Delete之前还Detach了

2、Attach用于将CDC的对象和HDC的句柄关联在一起
   Detach则相反
BOOL CDC::Attach(HDC hDC)
{
 if (hDC == NULL)
 {
  return FALSE;
 }

m_hDC = hDC;
 CHandleMap* pMap = afxMapHDC(TRUE); // create map if not exist
 pMap->SetPermanent(m_hDC, this);

return TRUE;
}
HDC CDC::Detach()
{
 HDC hDC = m_hDC;
 if (hDC != NULL)
 {
  CHandleMap* pMap = afxMapHDC(); // don't create if not exist
  if (pMap != NULL)
   pMap->RemoveHandle(m_hDC);
 }
 m_hDC = NULL;
 
 return hDC;
}

3、FromHandle从映射表中查找有无hDC对应的CDC
   有则返回其指针;没有则先new一个临时的CDC的对象,将其和hDC关联再返回其指针
   注意:这个临时的CDC对象不用由用户delete,系统的空闲线程会处理
CDC* PASCAL CDC::FromHandle(HDC hDC)
{
 CHandleMap* pMap = afxMapHDC(TRUE);       //create map if not exist
 CDC* pDC = (CDC*)pMap->FromHandle(hDC);   // 如果pMap中不存在hDC关联的CDC对象,则new一CDC对象并和hDC关联
 return pDC;
}

3.CDialog----------------------------------------------------------------------------------

1、CDialog析构时销毁了与之关联的窗口
CDialog::~CDialog()
{
 if (m_hWnd != NULL)
 {
  DestroyWindow();
 }
}

4.CWnd---------------------------------------------------------------------------------------

1、CWnd析构时销毁了与之关联的窗口
CWnd::~CWnd()
{
 if (m_hWnd != NULL)
 {
  DestroyWindow();
 }
}

2、获取桌面窗口句柄
static CWnd* PASCAL CWnd::GetDesktopWindow();
对应Win32 SDK中的为
HWND GetDesktopWindow(VOID);

MFC乱七八糟笔记的更多相关文章

  1. MFC 学习笔记

    MFC 学习笔记 一.MFC编程基础: 概述: 常用头文件: MFC控制台程序: MFC库程序: 规则库可以被各种程序所调用,扩展库只能被MFC程序调用. MFC窗口程序: 示例: MFC库中类的简介 ...

  2. MFC学习笔记(一)

    个人对MFC技术一直都很感兴趣,因为能够做出漂亮绚丽的界面应该是一件十分有成就感的事情. 学习的参考课本为北京博彦科技发展有限责任公司翻译的Jeff Prosise著的<MFC Windows程 ...

  3. MFC学习笔记

    获取窗口句柄 FindWindow               根据窗口名获取 GetSafehWnd                取你程序所在窗口类的句柄 GetActiveWindow     ...

  4. 孙鑫MFC学习笔记13:文档

    1.CArchive类保存内存数据 2.CAchive类重载了>>与<<操作符,类似C++文件流 3.在OnNewDocument中通过SetTitle设置标题 4.字符串资源 ...

  5. 孙鑫MFC学习笔记12:文件读写

    1.指向常量的指针 2.指针常量 3.C语言对文件操作是在缓冲区,在缓冲区满或文件关闭时写入文件 读取相同 4.fflush刷新缓冲区,使缓冲区数据写入文件 5.fseek改变文件指针偏移量 6.st ...

  6. 孙鑫MFC学习笔记4:MFC画图

    1.画线方法 *1.捕获鼠标按下和弹起消息,获取两个点 *2.消息响应,画线 2.在CMainFrame类中的鼠标左键事件得不到响应的原因是CNameView覆盖了CMainFrame 3.注释宏 4 ...

  7. 孙鑫MFC学习笔记3:MFC程序运行过程

    1.MFC中WinMain函数的位置在APPMODUL.cpp APPMODUL.cpp中是_tWinMain,其实_tWinMain是一个宏#define _tWinMain WinMain 2.全 ...

  8. [百度空间] [原]MFC杂乱笔记

    1. 创建动态菜单 假如ID是动态分配的,那么重载virtual BOOLOnCmdMsg(UINT,int,void*,AFX_CMDHANDLERINFO*); 据MSDN不详细解释,当第二个参数 ...

  9. 【MFC学习笔记-作业7-小型画图软件】【】

    作业要求: 按下鼠标右键画圆. 按下鼠标左键移动曲线. 丝毫没有思路..网上教程又比这个程序复杂100倍... 好吧 总算找到一个合适的了... 转载至:http://blog.chinaunix.n ...

随机推荐

  1. HeapSpray初窥(2014.12)

    注:环境是xp+ie8 1.HeapSpray简介 Windows的堆因为动态分配和释放的特点,其看起来是不连续(没有规律的),但是仍可以找到一定的规律:大量的连续分配会更倾向使用连续的地址,减少了碎 ...

  2. YaHoo Web优化的14条法则

    Web应用性能优化黄金法则:先优化前端程序(front-end)的性能,因为这是80%或以上的最终用户响应时间的花费所在. 法则1. 减少HTTP请求次数 80%的最终用户响应时间花在前端程序上,而其 ...

  3. Quartz(任务调度)- 入门学习

    参照:http://blog.csdn.net/szwangdf/article/details/6158646 1.自定义定时任务管理类 QuartzManager 参照大神基础上新增:1.添加jo ...

  4. ajax的理解和运用

    AJAX : Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. 譬 ...

  5. CSS问题:怎么样让鼠标经过按钮的时候发生的状态一直停留在当页呢?

    $('p').mouseenter(function(){ $('p').css('background-color','yellow'); }); 只写一个mouseenter的动态效果的话是不能达 ...

  6. mac随手笔记

    在mac下安装有时候遇到一个问题,需要sudo指令来解决. sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如halt,reboot,su等等.这 ...

  7. android,view的执行过程onDraw、onSizeChanged,onFinishInflate

    小试view的执行过程,此是入门,高手绕道. ----------------------------------------------------------------------------- ...

  8. PreferenceActivity详解

    为了引入这个概率 首先从需求说起 即:现有某Activity专门用于手机属性设置 那么应该如何做呢? 根据已学知识 很快一个念头闪过 即:Activity + Preference 组合 前者用于界面 ...

  9. 如何测试本地是否能够正常访问云服务器的 Web 端口

    在windows环境下打开DOS命令行 使用telnet命令.例如 telnet www.baidu.com 80 插播一条小知识:DOS下清屏的命令是cls. 首先很不幸,出现了['telnet' ...

  10. 理解Java String和String Pool

    本文转载自: http://blog.sina.com.cn/s/blog_5203f6ce0100tiux.html 要理解 java中String的运作方式,必须明确一点:String是一个非可变 ...