2017.5.12MFC畫線

之前的學習都是對現有MFC程序的瞭解,對比之前窗口創建過程,在MFC中判斷每一步的具體流程,現在有了比較清晰的認識,但具體的細節還要在之後的學習中不斷完善。
現在知道了MFC創建後就有許多的代碼,這些代碼爲我們的窗口創建提供了許多便利,我們不需要考慮太多關於窗口框架的問題。那麼,我們如何在現有的MFC結構下編寫自己的程序呢,接下來我們就學習一下如何在窗口中畫線。
我們要實現的效果是,按下鼠標左鍵並拖動鼠標到另一點,屏幕顯示兩點之間的線段。
首先在VC6.0菜單中點擊查看——建立類嚮導,即可增加響應函數,需要在CDrawView類下增加響應函數LButtonDown,並選擇編輯就跳轉到編譯環境。
注:當增加一個消息響應函數時,實際上在3個地方進行了修改。第一個是在頭文件中加入消息響應函數原型的聲明,第二個是在源文件(.cpp)中加入消息響應函數的一個宏,通過這個宏把我們的消息和消息響應函數關聯起來了。第三個是在源文件中增加了消息響應函數的定義(實現部分)。

然後在CDrawView類中創建一個私有成員變量,在結構體中進行初始化

private:
    CPoint m_ptOrigin;
CDrawView::CDrawView()
{
    // TODO: add construction code here
    m_ptOrigin = 0;
}

在OnLButtonDown中保存當前鼠標左鍵按下的點

void CDrawView::OnLButtonDown(UINT nFlags, CPoint point) 
{
    // TODO: Add your message handler code here and/or call default
    m_ptOrigin = point;
    CView::OnLButtonDown(nFlags, point);
}

接下來要確定線段的終點,需要另一個按鍵鬆開的響應,同前一個步驟類似

void CDrawView::OnLButtonUp(UINT nFlags, CPoint point) 
{
    // TODO: Add your message handler code here and/or call default
        CView::OnLButtonUp(nFlags, point);
}

接下來就利用4種方法創建了畫線命令,同時介紹了線型和顏色的選擇。

void CDrawView::OnLButtonUp(UINT nFlags, CPoint point) 
{
    // TODO: Add your message handler code here and/or call default
    /****************wjl***********************
    方法一:
        這個是用平臺SDK 來完成的劃線功能
        用的API函數(全局函數)來完成的
        *********************************
    HDC hdc;
    hdc = ::GetDC(m_hWnd);
    MoveToEx(hdc, m_ptOrigin.x, m_ptOrigin.y, NULL);
    LineTo(hdc, point.x, point.y);
    ::ReleaseDC(m_hWnd, hdc);
    ******************wjl*********************/

    /****************wjl***********************
    方法二:
        因爲MFC具有高度的封裝性,MFC中所有和窗口
        相關的操作都封裝到CWnd類中了,
        所有和作圖相關的操作都封裝到CDC類中了。
        接下來利用MFC裏面的CDC類來進行劃線的操作

    CDC *pDC=GetDC();   // 這裏的GetDC是CWnd類中的函數
    pDC->MoveTo(m_ptOrigin);
    pDC->LineTo(point);
    ReleaseDC(pDC);
    ***************wjl************************/


    /****************wjl***********************
    方法三:
        介紹另外一個類 CClientDC,它在創建對象的時候
        自動調用了GetDC,並且在結束的時候自動釋放DC


//  CClientDC dc(this);  // 這個是和View窗口相關的操作,
    CClientDC dc(GetParent());  //這個時候框架窗口相關的操作
    dc.MoveTo(m_ptOrigin);
    dc.LineTo(point);
    ***************wjl************************/


    /****************wjl***********************
    方法四:
        另外一個類CWindowDC,和CClientDC類似,他們都自動
        調用GetDC,並且在結束的時候自動釋放DC。不同的是
        CWindowDC可以訪問整個窗口區域,包括客戶區和非客戶區

    //CWindowDC dc(this);
    //CWindowDC dc(GetParent());  
    CWindowDC dc(GetDesktopWindow()); // 劃線到整個屏幕
    dc.MoveTo(m_ptOrigin);
    dc.LineTo(point);
    ***************wjl************************/

    /****************wjl***********************
    <*如何改變線寬和顏色*>
    1.  首先要創建畫筆,利用MFC提供的CPen類
        CPen pen(參數一,參數二,參數三);
            第一個參數指畫筆的類型 實線PS_SOLID、虛線PS_DASH、點線PS_DOT
            第二個參數指的是畫筆的寬度
            第三個參數是筆的顏色RGB(0-255)
    2.  當你創建完畫筆之後並不會生效,你需要將這個筆
        選擇到設備描述表DC當中,這樣當你調用DC的時候才能
        使用你定義好的畫筆。
        利用SelectObject()把當前的畫筆選擇到DC中,同時保存先前的
        畫筆(SelectObject的返回值就是先前的畫筆類型)
    3.注意:虛線PS_DASH和點線PS_DOT 只有在線寬小於等於1的時候纔會效果

    CPen pen(PS_DOT,1,RGB(0,0,255)); 
    CClientDC dc(this);
    CPen *pOldPen = dc.SelectObject(&pen);  // 這裏保存了先前畫筆類型的指針
    dc.MoveTo(m_ptOrigin);
    dc.LineTo(point);
    dc.SelectObject(pOldPen);               // 將之前的畫筆類型還原
    ***************wjl************************/

    CView::OnLButtonUp(nFlags, point);
}
發佈了39 篇原創文章 · 獲贊 20 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章