正文

MFC中的GDI绘图(2)2008-12-21 18:01:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/xman/40007.html

分享到:

二.MFC中GDI绘图     GDI绘图包括以下步骤:获取设备环境,设置坐标映射,创建绘图工具,调用DC绘图函数绘图。 1、获取设备环境 (1)在SDK编程中,获取设备环境的方法有两种: <1>通过API函数BeginPaint。应用程序响应WM_PAINT消息进行图形刷新时主要通过BeginPaint函数获取设备环境,在消息处理函数返回前调用API函数EndPaint释放设备环境。 函数原型为:WINUSERAPI HDC WINAPI BeginPaint( HWND hWnd,LPPAINTSTRUCT lpPaint);     //以下为Win API示例::BeginPaint(HWND hWnd, LPPAINTSTRUCT lpPaint);      case WM_PAINT://窗口客户区需要重绘       {           char szText[]="Hello World";           PAINTSTRUCT ps;           HDC hdc=::BeginPaint(hWnd,&ps);           ::TextOut(hdc,10,10,szText,strlen(szText));           ::EndPaint(hWnd,&ps);           return 0; } MFC对BeginPaint进行了封装: CWnd::BeginPaint,CDC* BeginPaint( LPPAINTSTRUCT lpPaint ); 等价于 ::BeginPaint(CWnd::m_hWnd, LPPAINTSTRUCT lpPaint); <2>通过API函数GetDC。在非WM_PAINT消息处理函数中,需要调用GetDC来获取设备环境,调用API函数ReleaseDC来释放设备环境。 函数原型为:WINUSERAPI HDC WINAPI GetDC( HWND hWnd); (2)在MFC中,MFC提供了不同类型的DC类,每一个类都封装了DC句柄,并且它们的构造函数自动调用获取DC的API函数,析构函数自动调用释放DC的API函数。因此,在程序中通过声明一个MFC设备环境类的对象就自动获取了一个DC,而当该对象被销毁时就自动释放了获取的DC。MFC AppWizard应用程序向导创建的OnDraw()函数自动支持所获取的DC。        <1> CPaintDC构造函数:CPaintDC(CWnd* pWnd); 构造一个CPaintDC对象(pWnd指向一个CPaintDC对象所属的CWnd对象),准备用于绘画的应用程序窗口。 // BeginPaint void CView::OnPaint() {           CPaintDC dc(this); // device context for painting           // TODO: Add your message handler code here           OnPrepareDC(&dc);           OnDraw(&dc) } 当我们改变了窗口尺寸、移动窗口或恢复了先前被覆盖的部分,应用程序窗口就会收到一个Windows系统发送来的WM_PAINT消息,然后调用基类Cview的OnPaint函数或我们自己添加的消息处理函数OnPaint。我们可以在OnPaint函数中重绘窗口中重新可见的部分(),但简单的处理办法是重绘整个窗口。上面的代码中,由于基类Cview的OnPaint函数调用了OnDraw函数,因此应用程序经常在OnDraw函数中绘制视图。 <2>CClientDC构造函数:CClientDC(CWnd* pWnd); 构造一个CClientDC对象,它将存取pWnd指向的CWnd的客户区。 // 鼠标左键事件处理 void CExView::OnLButtonDown(UINT nFlags, CPoint point) {            // TODO: 在此添加消息处理程序代码和/或调用默认值            CClientDC dc(this);//定义客户区设备环境            dc.LineTo(point);//绘制线段    } CClientDC代表了窗口客户区对应的显示上下文,它在构造时调用了API函数GetDC,并将当前窗口的句柄m_hWnd作为函数参数;在析构时调用了API函数ReleaseDC。当在客户去绘图时,需要利用CClientDC类定义一个客户区设备环境句柄。 有时候需要访问与一个客户设备环境相关联的窗口对象,可以通过Attach函数把这个CClientDC的成员m_hWnd句柄传递给一个窗口对象,该窗口就是与客户区设备环境相关联的窗口。 CWnd::Attach,BOOL Attach( HWND hWndNew ); 说明:将一个Windows窗口与CWnd对象相连接。返回值:如果成功,则返回非零值;否则返回0。参数:hWndNew指定了Windows窗口的句柄     <3>CWindowDC构造函数:CWindowDC( CWnd* pWnd );构造一个CWindowDC对象,它可以访问pWnd指向的CWnd对象的整个屏幕区域(包括客户区和非客户区)。比如我们在做屏幕保护程序时,一般以整个屏幕区域作为绘制区域。       --------------------To be continued------------------

阅读(6177) | 评论(1)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册