视图问答6则:
1,怎样改变视图的大小?
一般,你能改变试图大小依靠 MoveWindow() MFC应用程序,视图是所围绕其框架的子窗口,获取其框架的指针GetParentFrame(),然后依靠MoveWindow()改变框架大小,视图大小自动跟随框架大小改变。
2,如何改变一个CFormView的大小?
首先,你要在你的CFormView中重载OnInitialUpdate()函数,该函数声明如下: virtual void OnInitialUpdate(); 在OnInitialUpdate()添加如下代码: void ClikethisView::OnInitialUpdate()//ClikethisView从CFormView继承而来 { // Make the window the size of the main dialog. CFormView::OnInitialUpdate(); GetParentFrame()->RecalcLayout(); ResizeParentToFit( /*FALSE*/ ); }
3,如何改变一个视图的背景?
想改变CView、CFrameWnd或者CWnd的背景,需要处理WM_ERASEBKGND 消息。 像下面演示的这样: 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; }
4,改变对话框背景颜色后,如何使控件的背景颜色和对话框背景颜色统一?
请看下面代码: 重载画控件的消息。 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)); }
5,如何获得当前视图的指针?
((CFrameWnd*) AfxGetApp()->m_pMainWnd))->GetActiveDocument();
或者
((CFrameWnd*)(AfxGetApp()->m_pMainWnd))->GetActiveView();
6,如何获得MDI程序的所有视图?
下面函数对你有用: CDocument::GetFirstViewPosition(); // DOCCORE.CPP CDocument::GetNextView(); // DOCCORE.CPP CMultiDocTemplate::GetFirstDocPosition(); // DOCMULTI.CPP CMultiDocTemplate::GetNextDoc(); // DOCMULTI.CPP
文档精彩问答:
1,如何获得当前文档指针?
参照:上面“如何获得当前视图指针?”
2,文档什么时候被破坏?
单文档程序的文档当程序退出时被破坏。 多文档程序在最后一个视图关闭时被破坏。
3,如何获得当前打开文档的列表?
下面代码,MyApp从CWinApp继承而来,MyApp的成员变量: CPtrList m_templateList
void CMyApp::GetDocumentList(CObList * pDocList) { ASSERT(pDocList->IsEmpty()); POSITION pos = m_templateList.GetHeadPosition(); while (pos) { CDocTemplate* pTemplate = (CDocTemplate*)m_templateList.GetNext(pos); POSITION pos2 = pTemplate->GetFirstDocPosition(); while (pos2) { CDocument * pDocument; if ((pDocument=pTemplate->GetNextDoc(pos2)) != NULL) pDocList->AddHead(pDocument); } } }
4,如何不叫我的程序自动打开文档?
在InitInstance()函数中 cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing

|