MFC乱七八糟笔记
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乱七八糟笔记的更多相关文章
- MFC 学习笔记
MFC 学习笔记 一.MFC编程基础: 概述: 常用头文件: MFC控制台程序: MFC库程序: 规则库可以被各种程序所调用,扩展库只能被MFC程序调用. MFC窗口程序: 示例: MFC库中类的简介 ...
- MFC学习笔记(一)
个人对MFC技术一直都很感兴趣,因为能够做出漂亮绚丽的界面应该是一件十分有成就感的事情. 学习的参考课本为北京博彦科技发展有限责任公司翻译的Jeff Prosise著的<MFC Windows程 ...
- MFC学习笔记
获取窗口句柄 FindWindow 根据窗口名获取 GetSafehWnd 取你程序所在窗口类的句柄 GetActiveWindow ...
- 孙鑫MFC学习笔记13:文档
1.CArchive类保存内存数据 2.CAchive类重载了>>与<<操作符,类似C++文件流 3.在OnNewDocument中通过SetTitle设置标题 4.字符串资源 ...
- 孙鑫MFC学习笔记12:文件读写
1.指向常量的指针 2.指针常量 3.C语言对文件操作是在缓冲区,在缓冲区满或文件关闭时写入文件 读取相同 4.fflush刷新缓冲区,使缓冲区数据写入文件 5.fseek改变文件指针偏移量 6.st ...
- 孙鑫MFC学习笔记4:MFC画图
1.画线方法 *1.捕获鼠标按下和弹起消息,获取两个点 *2.消息响应,画线 2.在CMainFrame类中的鼠标左键事件得不到响应的原因是CNameView覆盖了CMainFrame 3.注释宏 4 ...
- 孙鑫MFC学习笔记3:MFC程序运行过程
1.MFC中WinMain函数的位置在APPMODUL.cpp APPMODUL.cpp中是_tWinMain,其实_tWinMain是一个宏#define _tWinMain WinMain 2.全 ...
- [百度空间] [原]MFC杂乱笔记
1. 创建动态菜单 假如ID是动态分配的,那么重载virtual BOOLOnCmdMsg(UINT,int,void*,AFX_CMDHANDLERINFO*); 据MSDN不详细解释,当第二个参数 ...
- 【MFC学习笔记-作业7-小型画图软件】【】
作业要求: 按下鼠标右键画圆. 按下鼠标左键移动曲线. 丝毫没有思路..网上教程又比这个程序复杂100倍... 好吧 总算找到一个合适的了... 转载至:http://blog.chinaunix.n ...
随机推荐
- log4j2日志
log4j2.xmllog4j-api-2.5.jarlog4j-core-2.5.jar <?xml version="1.0" encoding="UTF-8& ...
- HDU - 2586 How far away ?(LCA模板题)
HDU - 2586 How far away ? Time Limit: 1000MS Memory Limit: 32768KB 64bit IO Format: %I64d & ...
- nodejs【伪】入门教程
声明: 本文适合白的不能再白的小白 不要被标题误导,本文不会讲nodejs基础,只是本人学习流程和资料的一个整合 如果想找一大堆教程自己看,没有电梯,自己拉到文章最下方吧 一.nodejs是什么 ...
- web开发路径问题
1. web开发路径问题总结: http://www.cnblogs.com/tianguook/archive/2012/08/31/2665755.html 2. JSP/SERVLET 路径问题 ...
- Java语言进阶过程(转)
[以下肯定是不完整的列表,欢迎补充] Java是一个通用的编程语言,其实可以干很多事,怎么学Java就看怎么用了. 但有一些一般的步骤: 1. 熟悉一种文本编辑器,比如Vim, Emacs, Note ...
- MFC应用程序编写实例—完整版(原创)
前段时间,将近花了一周至两周上班和上班后的闲余时间,做了一个用于调试和测试工作项目的应用软件,下面将实现软件的重要步骤及主要功能讲解一遍,方便日后查阅. 程序开始后,提示登录框,输入用户名,密码后,登 ...
- CSS3秘笈:第十章
CSS的transform.transition和animation属性 1.transform(倾斜):利用transform属性可以使导航栏稍微倾斜,或者使图片在访问者的鼠标经过它时放大两倍,甚至 ...
- 最近客户的apache+php环境运行很慢解决
描述:[Wed Jul 24 15:49:11 2013] [warn] (OS 64)指定的网络名不再可用. : winnt_accept: Asynchronous AcceptEx faile ...
- centos6.5中gitlab的搭建
使用gitlab官网给的源码进行安装,步骤如下: Install a GitLab CE Omnibus package on CentOS 6 (and RedHat/Oracle/Scientif ...
- crontab如何设置秒级别的定时【转载】
* * * * * date > /home/gamester88/test/nihao.txt * * * * * (sleep 10 && date >> /ho ...