MFC開發常見問題的回答1:文檔視圖框架問題。

視圖問答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
轉載於:http://www.chinaitpower.com/A/2001-10-08/1123.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章