VC++(十一)图形的保存和重绘

2016-11-17  本文已影响0人  侧漏的少年
//CView默认的标准的重画函数
void CView::OnPaint()
{
    CPaintDC dc(this);
    OnPreparDC(&dc);
    OnDraw(&dc); //调用了OnDraw
}

既然OnPaint最后也要调用OnDraw,因此我们一般会在OnDraw函数中进行绘制。下面是一个典型的程序

///视图中的绘图代码首先检索指向文档的指针,然后通过DC进行绘图调用。
void CMyView::OnDraw( CDC* pDC )
{ 
    CMyDoc* pDoc = GetDocument(); 
    CString s = pDoc->GetData(); // Returns a CString
    CRect rect;
    GetClientRect( &rect ); 
    pDC->SetTextAlign( TA_BASELINE | TA_CENTER ); 
    pDC->TextOut( rect.right / 2, rect.bottom / 2, s, s.GetLength() );
}

常见设备上下文及区别:

CDC:GetDC,ReleaseDC
CClientDC:GetDC,ReleaseDC封装起来,只能访问客户区
CWindowDC:GetDC,ReleaseDC封装起来,不仅仅可以访问客户区 
CPaintDC:窗口重绘时会发送一个WM_PAINT消息:消息响应函数OnPaint,调用CPaintDC

下面介绍一下获得这块画布的方法,即获取设备上下文的方法:

1、通过OnDraw()函数获得CPaintDC:在OnDraw()函数中入口参数CDC *pDC,传入操作的设备上下文,这个上下文是CPaintDC。
他是通过OnPaint()构建,并传入OnDraw(),View类如果没有重载OnPaint(),则窗口刷新时自动调用MFC底层代码的OnPaint()函数,
从而调用OnDraw()。我们就可以通过OnDraw()在客户区进行初始化的绘制。
2、通过CClientDC,CPaintDC,CWindowDC定义一个DC。
例如:CClientDC dc(this);创建一个dc,
在当前对象的客户区。创建一个CWindowDC类的对象:CWindowDC dc(this);
3、通过HDC GetDC(HWND hWnd);hWnd:设备上下文环境被检索的窗口的句柄,如果该值为NULL,
GetDC则检索整个屏幕的设备上下文环境,返回值是hdc,
即一个DC描述符,入口参数是一个窗口类型的句柄。

例如: pWnd=GetDlgItem(IDC_STATIC_PIC); //IDC_STATIC_PIC是对话框图片空间的一个标识号

pWnd->SetWindowPos(NULL,0,0,512,120,SWP_NOZORDER|SWP_NOMOVE); //调整长宽为(512,120)
pDc=pWnd->GetDC();
GDI及GDI函数
GDI对象就是绘画时用的工具,比如画笔,画刷,字体,位图,调色板。
如果绘图的时候,需要先把相应的GDI设备选入设备环境,就是为画图选个画笔,工具。
注意MFC中,GDI和CDC是两个独立的类

OnCreate()后窗口产生, 然后才是视图的OnInitialUpDate,一般在这里对视图的显示做初始化。

一、OnCreate和OnInitialUpDate

上一篇下一篇

猜你喜欢

热点阅读