MFC 指针变量
我是MFC初学者。我自己凭SDK的一点点知识“凑”粗了一段MFC显示位图的代码:voidmf(){HBITMAPbmp;bmp=(HBITMAP)LoadImage(NU...
我是MFC初学者。
我自己凭SDK的一点点知识“凑”粗了一段MFC显示位图的代码:
void mf()
{
HBITMAP bmp;
bmp=(HBITMAP)LoadImage(NULL,"1.bmp",IMAGE_BITMAP,NULL,NULL,LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE);
CDC *pDC;
CDC dc;
pDC=GetDC();
dc.CreateCompatibleDC(pDC);
dc.SelectObject(bmp);
pDC->BitBlt(0,0,400,400,&dc,0,0,SRCCOPY);
ReleaseDC(pDC);
}
我在SDK中显示位图没有接触过指针,现在我不明白:
1.为什么定义CDC dc,而CDC* pDC,后者为什么要是指针?仅仅因为*Cwnd::GetDC(void)得用指针类型?
2.指针有什么好处?
3.ReleaseDC()为什么只释放pDC?dc不需要吗? 展开
我自己凭SDK的一点点知识“凑”粗了一段MFC显示位图的代码:
void mf()
{
HBITMAP bmp;
bmp=(HBITMAP)LoadImage(NULL,"1.bmp",IMAGE_BITMAP,NULL,NULL,LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE);
CDC *pDC;
CDC dc;
pDC=GetDC();
dc.CreateCompatibleDC(pDC);
dc.SelectObject(bmp);
pDC->BitBlt(0,0,400,400,&dc,0,0,SRCCOPY);
ReleaseDC(pDC);
}
我在SDK中显示位图没有接触过指针,现在我不明白:
1.为什么定义CDC dc,而CDC* pDC,后者为什么要是指针?仅仅因为*Cwnd::GetDC(void)得用指针类型?
2.指针有什么好处?
3.ReleaseDC()为什么只释放pDC?dc不需要吗? 展开
展开全部
1、是。
CWnd::GetDC 返回CDC*,
因为mfc要把用到的windows对象放入模块线程状态的某个CHandleMap里,以防这些对象在线程切换、C++对象析构时丢失,
这里是放进m_pmapHDC,它是每线程一个,返回指针比较节约。
2、同上。
windows不认识C++对象,C++对象析构时也不会自动释放windows对象,
exe、dll、线程、com之间切换时都应考虑模块状态。
3、dc的作用域限于mf函数,它在mf函数栈上生成,退出mf函数时随着mf函数栈销毁而自动析构。
再看mfc源码,
CDC::~CDC()
{
if (m_hDC != NULL)
::DeleteDC(Detach());
}
对于create的dc会自动删除。
CWnd::GetDC 返回CDC*,
因为mfc要把用到的windows对象放入模块线程状态的某个CHandleMap里,以防这些对象在线程切换、C++对象析构时丢失,
这里是放进m_pmapHDC,它是每线程一个,返回指针比较节约。
2、同上。
windows不认识C++对象,C++对象析构时也不会自动释放windows对象,
exe、dll、线程、com之间切换时都应考虑模块状态。
3、dc的作用域限于mf函数,它在mf函数栈上生成,退出mf函数时随着mf函数栈销毁而自动析构。
再看mfc源码,
CDC::~CDC()
{
if (m_hDC != NULL)
::DeleteDC(Detach());
}
对于create的dc会自动删除。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不知道你说的是不是这个函数;
CTime::GetLocalTm()
如果你说的是这个函数的话,可以做如下解释,因为这是一个静态函数,所以按照类的规则他只能调用 static 成员变量。所以 我们可以设想MFC 在定义 CTime的时候定义了一个 static的变量,按照C++规定,静态变量在类第一次被引用时创建,且不会被立即销毁。
因为他是一个静态变量,所以不管用 delete 还是 free 去释放都会失败。
CTime::GetLocalTm()
如果你说的是这个函数的话,可以做如下解释,因为这是一个静态函数,所以按照类的规则他只能调用 static 成员变量。所以 我们可以设想MFC 在定义 CTime的时候定义了一个 static的变量,按照C++规定,静态变量在类第一次被引用时创建,且不会被立即销毁。
因为他是一个静态变量,所以不管用 delete 还是 free 去释放都会失败。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1,CDC是设备上下文,你可以理解为一个“画板”,定义为指针式为了GetDC接收数据。
2,指针的好处在于调用和被调用用时传递过程比较简洁,占用资源少。并可以new一个变量放入堆内存中,不在局部函数中被析构。
3,“The ReleaseDC method releases the hDC previously obtained with GetDC”msdn上的原话,只有getDC的变量才需要ReleaseDC。
2,指针的好处在于调用和被调用用时传递过程比较简洁,占用资源少。并可以new一个变量放入堆内存中,不在局部函数中被析构。
3,“The ReleaseDC method releases the hDC previously obtained with GetDC”msdn上的原话,只有getDC的变量才需要ReleaseDC。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你说的没错,定义CDC* pDC 指针的目的就是因为 GetDC();
GetDC()的目的是得到 设备上下文对象 ,而这个设备对象是已经存在了的,没有必要定义一个新的设备 例如 CDC DC
GetDC()的目的是得到 设备上下文对象 ,而这个设备对象是已经存在了的,没有必要定义一个新的设备 例如 CDC DC
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询