ew, CScrollView)
将 BEGIN_MESSAGE_MAP 那一行的语句改为: BEGIN_MESSAGE_MAP(CMyView, CScrollView)
并且将其他所有的 CView 改成 CScrollView.
假如你修改的视图是由 AppWizard 生成的, 那么就不需要作更多的修改了。 而如果你在创建 一个新视图,先在 CWinApp::InitInstance()函数中找到对 AddDocTemplate()函数的调用。 AddDocTemplate()函数的第三个参数是 RUNTIME_CLASS(CSomeView),用 CMyView 来代替 CS omeView,就可以将当前视图改为新视图。在 MDI 应用程序中,你可以增加第二个 AddDocTe mplate()函数调用来使用多视图类型,将 RUNTIME_CLASS(CSomeView)改为 RUNTIME_CLASS (CMyView)。 要想获得更多的信息请参阅 Q99562 中相关文章 《Switching Views in a Single Document Interface Program》 。 如何改变视图的背景色? 你可以通过处理 WM_ERASEBKGND 消息来改变 CView、 CFrameWnd 或 CWnd 对象的背景色。 请看 如下的程序段: BOOL CSampleView::OnEraseBkgnd(CDC* pDC) { // 设置所要求背景色的刷子 CBrush backBrush(RGB(255, 128, 128)); // 保存旧刷子 CBrush* pOldBrush = pDC->SelectObject(&;backBrush); CRect rect; pDC->GetClipBox(&;rect); // 擦除所需的区域 pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(), PATCOPY); pDC->SelectObject(pOldBrush); return TRUE; }
而我则用如下方法解决这个问题:
HBRUSH dlgtest::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { switch (nCtlColor) { case CTLCOLOR_BTN: case CTLCOLOR_STATIC: { pDC->SetBkMode(TRANSPARENT); } case CTLCOLOR_DLG: { CBrush* back_brush; COLORREF color; color = (COLORREF) GetSysColor(COLOR_BTNFACE); back_brush = new CBrush(color); return (HBRUSH) (back_brush->m_hObject); } } return(CFormView::OnCtlColor(pDC, pWnd, nCtlColor)); } 如何得到当前视图? 最佳方法是将视图当作一个参数来传递。 如果不能这样做, 但你确信它是当前激活文档和当 前激活视
图的话,你也可以得到该视图。具体细节见 Visual C++文章 Q108587《Get Current CDocument or CView from Anywhere》 。 简单说来,用: ((CFrameWnd*) AfxGetApp()->m_pMainWnd))->GetActiveDocument() 和: ((CFrameWnd*)(AfxGetApp()->m_pMainWnd))->GetActiveView()
来得到文档和视图。一个好的方法是将它们封装在你的 CMyDoc 和 CMyView 类的静态函数 中,并且核对它们是否属于正确的 RUNTIME_CLASS。然而,假如这个视图不是当前激活视 图或者你在运行 OLE 本地激活,这样将不成功。 如何在一个文档中建立多个视图? CDocTemplate::CreateNewFrame()函数创建 MFC MDI 应用程序中的文档的附加视图。为了调 用该函数,要指定一个指向 CDocument 对象(指将为之建立视图的文档)的指针和一个指 向可从中复制属性的框架窗口的指针。一般情形下,该函数的第二个参数为 NULL。
当应用程序调用函数 CreateNewFrame()时, 该函数就创建一个框架窗口和在该窗口内的视图。 框架窗口和它的视图的类型由与 CreateNewFrame()函数调用指定的文档相关的文档摸板 (CDocTemplate)决定。 Visual C++中的 CHKBOOK MFC 样例程序也
演示了如何为文档建立附加的框架和视图。检查 CHKBOOK.CPP 文件中的 CChkBookApp::OpenDocumentfile()函数。 另一个用函数 CreateNewFrame()的例子是 MULTVIEW 样本
程序。 CreateNewFrame() 函 数 建 立 了 一 个 框 架 和 一 个 视 图 , 而 不 仅 仅 是 一 个 视 图 。 假 如 CreateNewFrame()函数不能完全符合你的需要,可参考 CreateNewFrame()函数的源程序来了 解对建立结构和视图所必须的步骤。 如何在 MDI 程序中得到所有的视图? 你必须用一些文档中没有记载的函数: CDocument::GetFirstViewPosition(); // DOCCORE.CPP CDocu