利用SDK全局函数实现画线功能详解

来源:互联网 发布:网络电影票房排行 编辑:程序博客网 时间:2024/06/05 11:00

                                                                                                     利用SDK全局函数实现画线功能详解
void CTesyView::OnLButtonUp(UINT nFlags, CPoint point)
{
CView::OnLButtonUp(nFlags, point);
}

---------------------------------------------------------------------
void CBitmapView::OnButtonDown(UINT nFlags,CPoint point)参数UINT nFlags和CPonit分别是什么意思?nflags是怎样的消息类型?能给举个例子吗?
nFilags应该表示的是消息的类型,point里存储的是鼠标点击的坐标。应该存的是鼠标左键点还是右键点击,就是 WM_LBUTTONDOWN, WM_RBUTTONDOWN这2个消息。这2个是宏
nFilags消息类型有 键盘按键消息,鼠标消息,还有应用程序消息,一般以WM开头

m_ptOrigin = point;
 HDC hdc;
 hdc = ::GetDC(m_hWnd);
 MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL);
 LineTo(hdc,point.x,point.y);
 ::ReleaseDC(m_hWnd,hdc);

---------------------------------------------------------------------

HDC
  cDC是MFC的DC的一个类
  hDC是DC的句柄,API中的一个类似指针的数据类型.
  MFC类的前缀都是C开头的
  H开头的大多数是句柄
  这是为了助记,是编程读\写代码的好的习惯.
  CDC中所有MFC的DC的基类.常用的CClientDC dc(this);就是CDC的子类(或称派生类).
  CDC等设备上下分类,都含有一个类的成员变量:m_nHdc;即HDC类型的句柄.
  记住下面的一句话,会有助于你的理解.
  MFC的类,是在用window API语句开发出来的有一定功能的小程序.(也可称为类).使用它的默认方法,就是,记住它的名字与参数(可以用笔记,代替脑记).
  DC(设备上下文)在c++中的解释:


GetDC GetDCEx GetWindowDC 
GetDC
 
该函数为指定窗口的客户区域取回显示DC的句柄。随后的GDI函数中可以使用显示DC在窗口客户区域绘图。
原型:
HDC GetDC( HWND hWnd);
参数:
hWnd:将要取回DC的窗口句柄。如果该值为NULL,GetDC取回整个屏幕的DC。
返回值:
成功,获得指定窗口客户区域的DC句柄;失败返回NULL。调用GetLastError获取扩展错误信息。
备注:
   根据为指定窗口指定的类类型来决定取回一个公共、类或私有DC(a common, class, or private device context )。
   每次取回公共DC时,GetDC函数给它赋值默认属性。
   取回类或私有DC时,GetDC函数保持之前赋值的属性不变。
   在使用公共DC绘图后,必须调用ReleaseDC来释放DC。
   类和私有DC不必释放。
   可用内存数决定DC的数量。
 
GetDCEx
该函数为指定窗口的客户区域或整个屏幕取回显示DC的句柄。随后的GDI函数中可以该句柄在窗口客户区域绘图。
GetDCEx 是GetDC的扩展,对如何剪裁客户区域或是否剪裁客户区域提供给程序更多的控制。
原型:
HDC GetDCEx(
    HWND hWnd,
    HRGN hrgnClip,
    DWORD flags);
参数:
hWnd:将要取回DC的窗口句柄。如果该值为NULL,GetDCEx取回整个屏幕的DC。
hrgnClip:指定可能和DC的可见区域合并的剪切区域。
flags:指定DC的创建方式。可能为下表中的值的组合:
值 描述
DCX_WINDOW 返回于窗口矩形而不是客户端矩形对应的DC。
DCX_CACHE   从缓存中取回DC,而不是OWNDC 或 CLASSDC 窗口。实际上重写了CS_OWNDC 和CS_CLASSDC 了。
DCX_PARENTCLIP   使用父窗口的可见区域。取消父窗口的WS_CLIPCHILDREN 和 CS_PARENTDC 标志位。DC的起始坐标设置为由hWnd标识的窗口的左上角。
DCX_CLIPSIBLINGS   排除由hWnd标识的窗口的所有同级窗口的可见区域。
DCX_CLIPCHILDREN   排除由hWnd标识的窗口的所有子窗口的可见区域。
DCX_NORESETATTRS   当该DC释放时,不用设置该DC的属性为默认值。
DCX_EXCLUDERGN   从返回的DC的可见区域里去除hrgnClip标识的剪切区域。
DCX_EXCLUDEUPDATE  返回一个区域,该区域去除了窗口更新的区域。
DCX_INTERSECTRGN   hrgnClip表示的剪切区域和返回DC的可见区域取交集。
DCX_INTERSECTUPDATE   返回一个区域,该区域包含窗口更新的区域。
DCX_VALIDATE   当指定DCX_INTERSECTUPDATE,引起DC完全有效(causes the device context to be completely validated.)。 在该函数中使用DCX_INTERSECTUPDATE 和DCX_VALIDATE 等价于使用BeginPaint函数。
返回值:
   成功,返回指定窗口DC句柄。失败返回NULL。如果传入的hWnd为无效值,返回失败。调用GetLastError获取扩展错误信息。
备注:
   flags支持这些值:DCX_WINDOW, DCX_CACHE, DCX_CLIPCHILDREN, DCX_CLIPSIBLINGS,DCX_EXCLUDERGN, DCX_INTERSECTRGN, DCX_EXCLUDEUPDATE 和DCX_INTERSECTUPDATE。
   和GetDC返回的DC不同,GetDCEx返回的DC不会和相关窗口保持同步。
   如果窗口移动或改变大小,可能会产生异常错误。如果程序获取DC、绘图然后再释放DC,错误的机会将会减少。
   除非显示DC属于窗口类,否则在绘图后必须调用ReleaseDC来释放DC。
   因为一次只能有5个公共DC可用,如果释放DC失败,将可能导致其他程序访问DC失败。
   如果CS_CLASSDC, CS_OWNDC 或 CS_PARENTDC被指定为WNDCLASS结构中的一个类型,当该窗口类被注册时,函数将返回属于窗口类的DC。
 
GetWindowDC
 
函数取回整个窗口DC,包括标题栏、菜单和滚动栏。
原型:
HDC GetWindowDC(HWND hWnd);
参数:
hWnd:要取回DC的窗口句柄。如果该值为NULL,取回整个屏幕的DC。
返回值:
   成功,返回指定窗口DC的句柄。NULL表示失败或传入的hWnd为无效参数。调用GetLastError获取扩展错误信息。
备注:
   GetWindowDC专为在窗口非客户区域绘图而设计。不推荐在任何窗口的非客户区域绘图。
   使用GetSystemMetrics函数获取象标题栏、菜单和滚动栏等非客户区域的尺寸大小。
   GetDC用来取回整个屏幕的DC。
   在绘图完成后,必须调用ReleaseDC来释放DC。如果不释放窗口DC,应用程序的绘图请求将会产生不良影响

---------------------------------------------------------------------

MFC中的m_hWnd成员变量
HWND是Windows系统中对所有窗口的一种标识,即窗口句柄。这是一个SDK概念。
CWnd是MFC类库中所有窗口类的基类。微软在MFC中将所有窗口的通用操作都封装到了这个类中,如:ShowWindow等等,同时它也封装了窗口句柄即m_hWnd成员。
CWnd是HWND的wrapper,CWnd中不光包含了HWND,而且包含了可用于HWND的方法。
MFC是对Windows API的封装,使用OOP是对Windows编程的另外一种观点。MFC认为一个程序是一m_个对象(CWinApp),该对象管理窗口(CView或 CDialog和CFrameWnd)以及该程序所使用的数据(CDocument)。CWnd是CView和CDialog的父类,主要负责管理程序生 成的窗口。由于一个程序拥有确定的窗口(Windows为该程序生成需要的窗口),因此在CWnd的构造函数中已经初始化m_hWnd为该窗口句柄
---------------------------------------------------------------------

moveto与movetoex区别
moveto的返回值就是先前的位置,而movetoex是将先前的位置保存在第四个参数中,返回的是BOOL型.第一个是CDC的一个方法,后面的一个是API,一个HDC类型作为参数
二者还有个区别就是:MoveToEx()使用完后必须对设备上下文使用ReleaseDC()进行释放,而MoveTo()则不用。MoveTo()使用的是CWnd下的ReleaseDC(),MoveToEx()使用的是平台下的::ReleaseDC()。因为CWnd类提供了成员函数GetDC和ReleaseDC,因此利用SDK函数实现画线功能时,这两个函数前面都加上了两个冒号,表明它们是全局SDK函数。否则,VC++编译器将认为它们是CWND类的成员函数。

 

 

原创粉丝点击