OnDraw(CDC* pDC) { CPen pen1,pen2; pen1.CreatePen(PS_SOLID,2,RGB(128,128,128));//创建对象 pen2.CreatePen(PS_SOLID,2,RGB(128,128,0));//创建对象 CPen* pPenOld=(CPen*)pDC->SelectObject(&pen1);//选择对象进DC drawWithPen1... (CPen*)pDC->SelectObject(&pen2);//选择对象进DC drawWithPen2... pen1.DeleteObject();//再次创建前先销毁 pen1.CreatePen(PS_SOLID,2,RGB(0,0,0));//再次创建对象 (CPen*)pDC->SelectObject(&pen1);//选择对象进DC drawWithPen1... pDC->SelectObject(pOldPen);//恢复 } { ... CPen pen; pen.CreatePen(PS_SOLID,2,RGB(128,128,128)); CPen* pOldPen=(CPen*)dc.SelectObject(&pen); dc.SelectStockObject(NULL_BRUSH);//选入空刷子 dc.Rectangle(CRect(0,0,20,20));//画矩形 ... } //位图 //设备相关位图(DDB)和设备无关位图(DIB)。 //DDB可以用CBitmap::LoadBitmap( UINT nIDResource )可以装入指定DDB //CDC::BitBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop ) //绘制图形,同时指定光栅操作的类型。BitBlt可以将源DC中位图复制到目的DC中,由于BitBlt为等比例复制, //所以不需要再次指定长宽 CYourView::OnDraw(CDC* pDC) { CDC memDC;//定义一个兼容DC memDC.CreateCompatibleDC(pDC);//创建DC CBitmap bmpDraw; bmpDraw.LoadBitmap(ID_BMP) ;//装入DDB CBitmap* pbmpOld=memDC.SelectObject(&bmpDraw) ; //保存原有DDB,并选入新DDB入DC pDC->BitBlt(0,0,20,20,&memDC,0,0,SRCCOPY) ; //将源DC中(0,0,20,20)复制到目的DC(0,0,20,20) pDC->BitBlt(20,20,40,40,&memDC,0,0,SRCAND); //将源DC中(0,0,20,20)和目的DC(20,20,40,40)中区域进行AND操作 memDC.SelectObject(pbmpOld) ;//选入原DDB } //图标 OnDraw(CDC* pDC) { HICON hIcon1=AfxGetApp()->LoadIcon(IDI_I1); HICON hIcon2=AfxGetApp()->LoadIcon(IDI_I2); pDC->DrawIcon(0,0,hIcon1); pDC->DrawIcon(0,40,hIcon2); DestroyIcon(hIcon1); DestroyIcon(hIcon2); } 全局函数AfxGetApp可以得到CWinApp应用类指针 AfxGetApp()->m_pMainWnd为框架窗口指针 在框架窗口中:CFrameWnd::GetActiveDocument得到当前活动文档指针 在框架窗口中:CFrameWnd::GetActiveView得到当前活动视指针 在视中:CView::GetDocument得到对应的文档指针 在文档中:CDocument::GetFirstViewPosition,CDocument::GetNextView用来遍历所有和文档关联的视。 在文档中:CDocument::GetDocTemplate得到文档模板指针 在多文档界面中:CMDIFrameWnd::MDIGetActive得到当前活动的MDI子窗口 ON_COMMAND 映射的作用为在用户选择该菜单时调用指定的处理函数。如:ON_COMMAND(IDM_COMMAND1, OnCommand1) 会使菜单被选择时调用OnCommand1成员函数。 ON_UPDATE_COMMAND_UI(IDM_COMMAND1, OnUpdateCommand1) 映射的作用是在菜单被显示时通过调用指定的函数来进 行确定其状态。在这个处理函数中你可以设置菜单的允许/禁止状态,其显示字符串是什么,是否在前面打钩。函数 的参数为CCmdUI* pCmdUI,CCmdUI是MFC专门为更新命令提供的一个类,你可以调用 Enable 设置允许/禁止状态 SetCheck 设置是否在前面打钩 SetText 设置文字 当使用者通过视修改了数据时,应该调用GetDocument()->SetModifiedFlag(TRUE)通知文档数据已经被更新,这样在 关闭文档时会自动询问用户是否保存数据。 怎样使类具有序列化功能呢?你需要以下的工作: 该类从CObject派生。 在类声明中包括DECLARE_SERIAL宏定义。 提供一个缺省的构造函数。 在类中实现Serialze函数 使用IMPLEMENT_SERIAL指明类名和版本号 void CYourDoc::Serialize(CArchive& ar) { if (ar.IsStoring()) { //由于CString对CArchive定义了<<和>>操作符号,所以可以直接利用>>和<< ar<<m_szDesc; } else { ar>>m_szDesc; } m_allPID.Serialize(ar);//调用数据类的序列化函数 } void Invalidate( BOOL bErase = TRUE );使整个窗口失效,bErase将决定窗口是否产生重绘。 void InvalidateRect( LPCRECT lpRect, BOOL bErase = TRUE )/void InvalidateRgn( CRgn* pRgn, BOOL bErase = TRUE );将使指定的矩形/多边形区域失效。 MFC提供两种方法在对话框中进行数据交换和数据检查(Dialog data exchange/Dialog data validation), BOOL UpdateData( BOOL bSaveAndValidate = TRUE )来指示MFC将变量中数据放入子窗口还是将子窗口中数据取到变 量中并进行合法性检查。 在对话框的构造函数中可以对变量的初始值进行设置,此外在BOOL CDialog::OnInitDialog()中会调用UpdateData (FALSE),即会将变量中的数据放入窗口中