MFC LINE知识点解析

简单的划线就会用到不同的操作,现进行汇总整理如下。


1.由于鼠标的点击(onLButtonDown)发生在视图上,而不是窗口上,故鼠标的点击函数需要在视图类(CLineView)里添加。


2.MFC中类CPoint是对Windows结构POINT的封装,凡是能用POINT结构的地方都可以用CPoint代替。
结构POINT表示屏幕上的一个二维点,其定义为: 
typedef struct tagPOINT{LONG x;LONG y;} POINT;                                                                                                                   其中 x、y分别是点的横坐标和纵坐标。由于CPoint提供了一些重载运算符,使得CPoint的操作更加方便。如运算符“+”,“-”,“+=”和“-=”用于两个CPoint对象或一个CPoint对象与一个CSize对象的加减运算,运算符“==”和“!=”用于比较两个CPoint对象是否相等。


3.MFC中的OnButtonDown函数。


CWnd::OnLButtonDown

afx_msg void OnLButtonDown( UINT nFlags, CPoint point );

参数:

nFlags指定了不同的虚拟键是否被按下。这个参数可以是下列值之一:
·MK_CONTROL如果CTRL键被按下,则设置此位。
·MK_LBUTTON如果鼠标左键被按下,则设置此位。
·MK_MBUTTON如果鼠标中键被按下,则设置此位。
·MK_RBUTTON如果鼠标右键被按下,则设置此位。
·MK_SHIFT如果SHIFT键被按下,则设置此位。
point指定了光标的x和y轴坐标。这些坐标通常是相对于窗口的左上角的。


说明:当用户按下鼠标左键时,框架调用这个成员函数。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现,则该实现将使用最初传递给消息的参数(而不是你提供给这个函数的参数)。



4.MFC中的HDC:

DC:设备上下文(设备描述表),是WINDOWS的一种数据类型。

HDC:设备上下文句柄(可以理解为指向DC结构的指针),它指向一块描述设备的相关的内容的内存块。

CDC:是MFC里面的一个类,且这类封装了几乎所有关于HDC的操作,由于类的内部包含一个m_hWnd的句柄,

所以,CDC封装的操作(函数)与SDK平台中与关于HDC的操作都缺少一个指向设备上网的句柄(不是没有,而是这个句柄在被封装起来)。


5.MFC中的GetDC(m_hWnd)函数。

该函数检索一指定窗口的客户区域或整个屏幕的显示 设备上下文环境的句柄,以后可以在GDI函数中使用该句柄来在设备上下文环境中绘图。
GetDCEx函数是GetDC的一个扩展,它能使应用程序更多地控制在客户区域内如何或是否发生剪切。
函数原型:HDC GetDC(HWND hWnd);
hWnd: 设备上下文环境被检索的窗口的句柄,如果该值为NULL,GetDC则检索整个屏幕的设备上下文环境。
Windows 98,WindowsNT 5.0或以后版本:如果该参数为Null,GetDC检索首要显示器的设备上下文环境,要得到其他显示器的设备上下文环境,可使用EnumDisplayMonitors和CreateDc函数。
返回值:如果成功,返回指定窗口客户区的设备上下文环境;如果失败,返回值为Null。
Windows NT:若想获得更多错误信息,可调用GetLastError函数。

6.MFC中的MoveToEx()函数。
本函数将当前绘图位置移动到某个具体的点,同时也可获得之前位置的坐标。
WINGDIAPI BOOL WINAPI MoveToEx(HDC hdc,int X,int Y,LPPOINT lpPoint);
参数:
HDC hdc:传入参数, 设备上下文句柄。
int X:传入参数:新位置的X坐标。
int Y:传入参数:新位置的Y坐标。
LPPOINT lpPoint:传出参数:一个指向POINT结构的 指针,用来存放上一个点的位置,若此参数为NULL,则不保存上一个点的位置
返回值:
返回TRUE代表移动成功,FALSE代表失败,用GetLastError获得更具体的错误信息
头文件:
windows.h

7.MFC中的LineTo()函数。
用当前画笔画一条线,从当前位置连到一个指定的点。这个 函数调用完毕,当前位置变成x,y
WINGDIAPI BOOL WINAPI LineTo(HDC hdc,int X,int Y,);
hdc:设备场景句柄
X:线段终点X坐标位置,采用逻辑坐标表示。这个点不会实际画出来;它不属于线段的一部份
Y:线段终点Y坐标位置,采用逻辑坐标表示。这个点不会实际画出来;它不属于线段的一部份
返回值:
返回TRUE代表移动成功,FALSE代表失败
头文件:
Gdi32.h

8.MFC中的ReleaseDC()函数。
getdc用户向系统申请,用户获得了一个dc,同时,系统内部必然会记录其资源已经做了什么样的分配,你不释放dc,并且放弃对该dc的控制(比如dc记录在函数变量上,函数退出后,你的应用就失去了对该dc控制),那么,该dc变成了一个被占有而不可以用的资源,你不断的申请dc,这样资源就不断被你占用,直到系统资源不足而影响正常使用。


9.头文件与程序文件的理解。
h是头文件, 一般声明的类成员变量、函数会写在这里面,基本上不用你去写, vc中有添加类成员变量 和函数,它会帮你在.h 文件中写的,
cpp文件一般是相应对应的消息事件(如按钮时间等),还有在头文件中声明的函数, 也是在这里定义。

10.MFC的CDC类。即MFC提供了一个设备描述表的封装类CDC,该类封装了所有与绘图相关的操作,同时该类提供了一个数据成员m_hDC,用来保存与CDC类相关的DC句柄。
CDC* pDC=GetDC();pDC->MoveTo(m_ptOrigin);pDC->LineTo(point);ReleaseDC(pDC);这也是实现划线的程序代码。

11.MFC中的CClientDC是派生于CDC的一个类,故障调用时会自动调用GetDC函数与ReleaseDC函数。
CClientDC dc(this);dc.MoveTo(m_ptOrigin);dc.LineTo(point);这些代码同样实现了划线功能。

12.MFC中的CWindowDC类也派生自CDC类,作用与操作与CClientDC类似。不同之处为,该类可以控制整个窗口区域(使用默认成员函数GetWindowDC),包括框架窗口的非客户区与客户区。若使用成员函数GetDesktopWindow,则可以在整个桌面划线。


13.MFC中的类CPen用来创建画笔对象,CPen(int nPenStyle, int nWidth, COLORREF crColer)参数分别指定了线型,线宽及颜色。
另外,COLORREF类型的可以通过RGB宏来进行构建,即COLORREF RGB(BYTE bRed,BYTE bGreen,BYTE bBlue color).

14.MFC中的SelectObject函数,该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的相同类型的对象。
函数原型:HGDIOBJ SelectObject(HDC hdc, HGDIOBJ hgdiobj)
参数:
hdc:设备上下文环境的句柄。
hgdiobj:被选择的对象的句柄。

返回值:如果选择对象不是区域并且函数执行成功,那么返回值是被取代的对象的句柄;如果选择对象是区域并且函数执行成功,返回如下一值:
SIMPLEREGION:区域由单个矩形组成;
COMPLEXREGION:区域由多个矩形组成;
NULLREGION:区域为空。
如果发生错误并且选择对象不是一个区域,那么返回值为NULL,否则返回HGDI_ERROR。
注释:该函数返回先前指定类型的选择对象,一个应用程序在它使用新对象进行绘制完成之后,应该用原始的缺省的对象替换新对象。


15.MFC中的CBrush类用来创建画刷对象。常用操作如下:
15.1CBrush brush(RGB(255,0,0))  创建一个红色画刷
15.2CClientDC dc(this)                   创建并获得设备描述表
15.3dc.FillRect(CRect(m_ptOrigin.point),&brush) 利用红色画刷填充鼠标拖曳过程中形成的矩形区域

16.MFC中的GetStockObject,Windows API函数。该函数检索预定义的备用笔、刷子、字体或者调色板的句柄。
HGDIOBJ GetStockObject(int fnObject);
fnObject:指定对象的类型
如果成功,返回值标识申请的逻辑对象,如果失败,返回值为NULL。

17.MFC中的FromHandle(HANDLE h) 先查找由用户定义的内核对象对象的封装类, 如果找到直接返回,没有找到构造一个临时对象返回.
MFC 实际上是对内核对象HANDLE(如CDC的m_hDC,CWnd的m_hWnd)封装了这个句柄有关的所有操作,一个类生成一个新对象的时候这个句柄是无效的,要获得这个句柄,可以有两个方法,一个是Create来创建,另一个就是用Attach来与一个已有的句柄建立关联,实际上也就是给类的句柄成员变量赋值。而有个时候这个句柄不是由我们创建,但是我们要对它的封装类进行操作,(mfc 框架)必需创建对应的封装类包装它
  MFC 中对各种包含内核对象的封装类都有FromHandle(HANDLE h)方法
例如:
  void CListViewEx::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
  {
  CListCtrl& ListCtrl=GetListCtrl();
  //构造了一个句柄是lpDrawItemStruct->hDC包装类
  CDC* pDC = (CDC *)CDC::FromHandle(lpDrawItemStruct->hDC);
  }

18.位图画刷是指将图形复制的工具。
CBitmap bitmap;创建位图对象
bitmap.loadBitmap();加载位图资源
CBrush brush(&bitmap);创建位图画刷
CClientDC dc(this);      创建并获得设备描述表
dc.FillRect(CRect(m_ptOrigin,point),&brush);利用红色画刷填充鼠标拖曳过程中形成的矩形区域


19.需要绘制连续型线条时,在鼠标的OnMouseMove函数中编写代码即可。


20.绘制扇形时,在鼠标的OnMouseMove函数中根据两个不同的起点操作即可。






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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值