MFC关于孙鑫老师第四课使用CDC类划线的疑问
1.CDC*pDC=GetDC();pDC->MoveTo(m_ptOrigin);pDC->LineTo(point);ReleaseDC(pDC);CDC中包含了所获...
1.CDC *pDC=GetDC();
pDC->MoveTo(m_ptOrigin);
pDC->LineTo(point);
ReleaseDC(pDC);
CDC中包含了所获得的设备环境的句柄,是不是也要封装设备环境对应的窗口的句柄啊,要不然调用pDC->MoveTo(m_ptOrigin);pDC->LineTo(point)怎么知道在哪个窗口上画图呢,然而我在CDC的成员变量当中为什么没有找到相应的句柄呢
2.是不是画图必须在视图类的鼠标消息相应函数进行啊,如果在CMainFrame的鼠标消息响应函数中编写代码,可以吗,或者用与CMainFrame相关联的CDC去画
3.还有
CClientDC dc(GetParent);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
CWindowDC dc(GetDesktopWindow());
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
类似这样画出来在屏幕上显示出来的线条和我按下鼠标的实际位置总有一定偏移,为什么呢
感觉这些细节搞不清,影响我对画图的理解,谢谢大家指导啊 展开
pDC->MoveTo(m_ptOrigin);
pDC->LineTo(point);
ReleaseDC(pDC);
CDC中包含了所获得的设备环境的句柄,是不是也要封装设备环境对应的窗口的句柄啊,要不然调用pDC->MoveTo(m_ptOrigin);pDC->LineTo(point)怎么知道在哪个窗口上画图呢,然而我在CDC的成员变量当中为什么没有找到相应的句柄呢
2.是不是画图必须在视图类的鼠标消息相应函数进行啊,如果在CMainFrame的鼠标消息响应函数中编写代码,可以吗,或者用与CMainFrame相关联的CDC去画
3.还有
CClientDC dc(GetParent);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
CWindowDC dc(GetDesktopWindow());
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
类似这样画出来在屏幕上显示出来的线条和我按下鼠标的实际位置总有一定偏移,为什么呢
感觉这些细节搞不清,影响我对画图的理解,谢谢大家指导啊 展开
1个回答
展开全部
我说说我的理解,你斟酌的看:
问题1:
GetDC()前面不是有个this指针吗?所以获得的是当前窗口的句柄啊。
你知道win32中的
HDC GetDC(
HWND hWnd // handle to window
);
吗?它的参数就是窗口句柄,MFC就是包装了一下。
问题2:
你直接学习的MFC,没有经过win32的过程?我只能说你学起来会很困难。
画图不管在哪里都行,稍微解释下:
MFC中绘图设备类我知道的主要有:
1.1 CDC类-父类是CObject类,封装了设备句柄
已经操作设备的相关API。CDC类代表的是
一般设备,可以是显示器,打印机等。(此DC可以在任何地方画)
1.2 CWindowDC类-父类是CDC类,代表的是某一
窗口,包括窗口的客户区和非客户区。(此DC稍微弱点,不过能画标题栏之类的)
1.3 CClientDC类-父类是CDC类,代表的是某一
窗口,只包括窗口的客户区。(此DC更弱,不能画标题栏,只能在客户区画)
1.4 CPaintDC类-父类也是CDC类,代表的是某一
窗口,只包括窗口的客户区。只能用在
WM_PAINT的消息处理函数中。(其他DC基本上无论什么时候用都可以)
1.5 CMetaFileDC类-父类也是CDC类,与其它
DC区别最大,作用是保存绘制命令。可以在
任何需要重新绘制时使用这些命令。(这个我用到的不是特别多,有点像存储轨迹的意思)
还有一点我得说的是,不在WM_PAINT消息中画的(OnPaint函数),窗口刷新后都会消失。
问题3:
鼠标有一个焦点,这个概念你得有,特别是对于有些很怪异的鼠标图,焦点更本不在尖尖上,MFC中获得的CPoint都是此焦点的位置。
大概先解释这么多。我还是建议你先学点win32的再开始MFC。
问题1:
GetDC()前面不是有个this指针吗?所以获得的是当前窗口的句柄啊。
你知道win32中的
HDC GetDC(
HWND hWnd // handle to window
);
吗?它的参数就是窗口句柄,MFC就是包装了一下。
问题2:
你直接学习的MFC,没有经过win32的过程?我只能说你学起来会很困难。
画图不管在哪里都行,稍微解释下:
MFC中绘图设备类我知道的主要有:
1.1 CDC类-父类是CObject类,封装了设备句柄
已经操作设备的相关API。CDC类代表的是
一般设备,可以是显示器,打印机等。(此DC可以在任何地方画)
1.2 CWindowDC类-父类是CDC类,代表的是某一
窗口,包括窗口的客户区和非客户区。(此DC稍微弱点,不过能画标题栏之类的)
1.3 CClientDC类-父类是CDC类,代表的是某一
窗口,只包括窗口的客户区。(此DC更弱,不能画标题栏,只能在客户区画)
1.4 CPaintDC类-父类也是CDC类,代表的是某一
窗口,只包括窗口的客户区。只能用在
WM_PAINT的消息处理函数中。(其他DC基本上无论什么时候用都可以)
1.5 CMetaFileDC类-父类也是CDC类,与其它
DC区别最大,作用是保存绘制命令。可以在
任何需要重新绘制时使用这些命令。(这个我用到的不是特别多,有点像存储轨迹的意思)
还有一点我得说的是,不在WM_PAINT消息中画的(OnPaint函数),窗口刷新后都会消失。
问题3:
鼠标有一个焦点,这个概念你得有,特别是对于有些很怪异的鼠标图,焦点更本不在尖尖上,MFC中获得的CPoint都是此焦点的位置。
大概先解释这么多。我还是建议你先学点win32的再开始MFC。
追问
嗯,非常感谢,但是第一个问题,我比较疑惑的就是为什么在CDC的成员变量当中为什么没有找到相应的窗口句柄呢,是不是直接包含在了HDC里面了
追答
虽然你关闭了问题,但是我还是对你问的说我的理解:
通俗的解释:
就像学校有一支笔,谁拿起来写都可以,张三拿起来写字,就只能在张三的有权利的地方写,写完放回后,李四一样可以拿起来写。对于笔,你觉得它用关心谁拿起了它吗,它只关心我的墨水是什么颜色,笔头是多粗的。
所以CDC中只存储了它关心的,至于谁用它,它才不管,只要有对象得到它,就就帮得到的对象画。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询