02_MFC知識點總結(一)

一、簡單繪圖

    a)畫直線
    b)畫筆CPen的使用
    c)畫刷CBrush的使用
    d)寫字,CFont的使用

1、畫直線
    a)鼠標按下和擡起
    b)創建畫家對象 CClientDC     

//創建畫家對象,指定繪畫設備
	CClientDC dc(this);//畫在當前對話框

  c)起點和終點
        MoveTo  LineTo
    d)選中所屬類->右擊->添加變量
    
2、畫筆、畫刷的使用
    a)定義畫家
    b)定義畫筆(畫刷)CPen,CBursh
    c)把畫筆交給畫家  CDC::SelectObject

實例解析:

1、新建一個基於單文檔的項目

2、在所屬類中添加變量(視圖類添加)

/*在DrawView.h中添加變量*/	

private:
    CPoint m_myPoint; //鼠標當前的座標
	bool m_isPress; //鼠標按下與擡起的標識


 3、添加消息處理程序

4、添加事件程序實現的代碼

/*在DrawView.cpp中實現*/
//鼠標左鍵按下
void CMy04_DrawView::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO:  在此添加消息處理程序代碼和/或調用默認值
	m_myPoint = point;//保存點擊點的座標

	m_isPress = true; //標誌  鼠標左鍵按下

	CView::OnLButtonDown(nFlags, point);
}

//鼠標擡起
void CMy04_DrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
	// TODO:  在此添加消息處理程序代碼和/或調用默認值
	//創建畫家對象,指定繪畫設備
	CClientDC dc(this);//畫在當前對話框

	dc.MoveTo(m_myPoint);//起點
	dc.LineTo(point);//終點
	m_isPress = false;

	CView::OnLButtonUp(nFlags, point);
}

  畫筆和畫刷的代碼:

void CMy04_DrawView::OnDraw(CDC* pDC)
{
	CMy04_DrawDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

	// TODO:  在此處爲本機數據添加繪製代碼

	/*
	a)定義畫家
	b)定義畫筆(畫刷)CPen,CBursh
	c)把畫筆交給畫家  CDC::SelectObject
	*/
	//PS_DASH:虛線  只有當畫筆寬度爲1或更小(以設備單位計算)時纔有效。 
	//10:線寬  
	//RGB(255, 0, 0):紅色
	CPen pen(PS_SOLID, 1, RGB(255, 0, 0));

	//返回當前的狀態
	CPen *oldPen = pDC->SelectObject(&pen);

	pDC->MoveTo(10, 10);
	pDC->LineTo(120, 10);


	//恢復原來的狀態
	pDC->SelectObject(&oldPen);

	//畫圓型
	pDC->Ellipse(20, 20, 120, 120);

	//畫刷
	CBrush brush(RGB(255, 0, 0));
	pDC->SelectObject(&brush);
	pDC->Ellipse(20, 20, 120, 120);

	//定義一個位圖對象
	CBitmap bitmap;
	bitmap.LoadBitmapW(IDB_BITMAP1);//加載位圖

	CBrush brush2(&bitmap);
	pDC->SelectObject(&brush2);
	pDC->Ellipse(120, 20, 600, 600);

	//寫字
	CFont font;
	pDC->SelectObject(&font);
	pDC->TextOutW(100, 100, TEXT("Hello,World!"));
}

二、文本編輯器

1)創建插入符CWnd::CreateSolidCaret()
    a)創建CWnd::CreateSolidCaret()
    b)獲取字符串的尺寸信息CDC::GetTextExtent()
    c)截取字符串(CString)左邊指定長度的字符 str = str.Left(str.GetLength()-1);

// CMy05_EditorView 消息處理程序

//窗口創建後自動啓用
int CMy05_EditorView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;

	// TODO:  在此添加您專用的創建代碼
	//獲取字體信息
	CClientDC dc(this);

	TEXTMETRIC tm;//字體信息結構體

	dc.GetTextMetrics(&tm);

	//繼承於CWnd
	CreateSolidCaret(tm.tmAveCharWidth, tm.tmHeight);//創建插入符


	ShowCaret();//顯示

	return 0;
}

//鼠標左鍵按下
void CMy05_EditorView::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO:  在此添加消息處理程序代碼和/或調用默認值

	SetCaretPos(point);//移動插入符

	//保存點擊點座標
	m_point = point;//m_point是座標變量,在視圖類中已添加

	//清空
	str = TEXT(""); //str字符串變量
	str.Empty();

	//MessageBox(TEXT("m_point"));

	CView::OnLButtonDown(nFlags, point);

}

//點擊鍵盤,啓動調用
void CMy05_EditorView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
	// TODO:  在此添加消息處理程序代碼和/或調用默認值

	CClientDC dc(this);//創建畫家對象

	//str += (TCHAR)nChar;

	CSize size = dc.GetTextExtent(str);//獲取字符串長度

	if (nChar == VK_RETURN)//換行  清空
	{
		str.Empty();

		TEXTMETRIC tm;//字體信息結構體

		dc.GetTextMetrics(&tm);

		m_point.y = m_point.y + tm.tmHeight;
	}
	else if (nChar == VK_BACK)//退格
	{
		//獲取背景圖
		COLORREF color = dc.GetBkColor();

		//設置寫字的顏色
		COLORREF  oldColor = dc.SetTextColor(color);

		//白色重寫一次
		dc.TextOutW(m_point.x, m_point.y, str);

		//去掉最後一個字符
		str = str.Left(str.GetLength() - 1);

		//恢復原來顏色
		dc.SetTextColor(oldColor);
	}
	else
	{
		str.Empty();
		str += (TCHAR)nChar;
		
		//CSize size = dc.GetTextExtent(str);//獲取字符串長度
	}
	int x = m_point.x = m_point.x + size.cx;
	int y = m_point.y;

	SetCaretPos(CPoint(x, y));//移動插入符

	dc.TextOutW(m_point.x, m_point.y, str);


	CView::OnChar(nChar, nRepCnt, nFlags);
}

三、字體漸變


1)定時器的使用
    a)設置定時器:CWnd::SetTimer()  在視圖類中的OnCreate中設置定時器
    b)關閉定時器:CWnd::KillTimer()
    c)定時器消息:WM_TIMER
2)視圖類中的OnDraw()中,寫字 CDC::TextOutW()
3)指定區域寫字:CDC::DrawText()
4)讓窗口失效,產生WM_PAINT,間接調用OnDraw()函數:CWnd::Invalidate
代碼示例:

// CMy06_TimeoutView 消息處理程序


int CMy06_TimeoutView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;

	// TODO:  在此添加您專用的創建代碼
	//設置定時器
	//參數說明:  1:定時器id 1000:時間間隔,毫秒 NULL : 系統默認的處理函數,每個100毫秒,觸發WM_TIMER
		SetTimer(1, 100, NULL);
	return 0;
}

//在WM_TIME中添加OnTimer()
void CMy06_TimeoutView::OnTimer(UINT_PTR nIDEvent)
{
	// TODO:  在此添加消息處理程序代碼和/或調用默認值
#if 0

	if (nIDEvent == 1)
	{
		static int i = 0;
		i++;

		CString str;
		str.Format(TEXT("%d"), i);

		if (i == 5)
		{
			KillTimer(1);
		}

		MessageBox(str);

	}

	static int i = 0;
	i++;

	CString str;
	str.Format(TEXT("%d"), i);

	if (i == 5)
	{
		KillTimer(1);
	}

	MessageBox(str);

#endif

	CView::OnTimer(nIDEvent);

	static int w = 0;
	w += 5;

	CString str = TEXT("塑造自己的過程很疼,但是你可以得到一個更好的自己!");
	//獲取字符串的長度(寬度)
	CClientDC dc(this);//畫家對象
	CSize size = dc.GetTextExtent(str);
	//如果寬度大於字符串的寬度,重新開始
	if (w > size.cx)
	{
		w = 0;
		Invalidate();//Qt 中Update()
	}

	int x = 30;
	int y = 30;
	CRect rect(x, y, x + w, y + size.cy);

	//黑色寫一次

	dc.TextOutW(x, y, str);

	//設置字體顏色
	dc.SetTextColor(RGB(255, 0, 0));
	dc.DrawText(str, &rect, DT_LEFT);

	CView::OnTimer(nIDEvent);
}

四、菜單的相關操作


1)菜單的命令響應函數
    a)彈式菜單,ID不可以編輯,按下去,彈出一個 菜單項
    b)非彈式菜單,ID可以編輯
    c)菜單響應命令消息的路由(順序)


    d)消息類型
        非標準消息
        WM_COMMAND,命令消息、通告消息,CCmdTarget、CWnd子類能接受到非標準消息
        標準消息 WM_XXXX   CWnd子類才能收到標準消息

        命令消息 WM_COMMAND:菜單處理函數選中
        標準消息:屬性->消息類型
        通告消息:點擊按鈕,處理函數
        
        CWnd可以接收任何消息
        CCmdTarget:不能接收標準消息
        
        
2)菜單相關靜態操作
在框架類MainFrame中進行相應操作,在OnCreate()中實現
    A)獲取菜單欄:CWnd::GetMenu
    B)獲取子菜單:CMenu::GetSubMenu
        a)標誌菜單:CMenu::CheckMenuItem
            MF_BYPOSITION:通過位置
            MF_BYCOMMAND:通過ID
        b)設置默認菜單:CMenu::SetDefaultItem
            注意:一個菜單項只能設置一個默認項
        c)禁用菜單:CMenu::EnableMenuItem
        注意:需要把CFrameWnd::m_bAutoMenuEnable 成員變量設置爲 FALSE
        d)分隔線
    C)移除菜單 CWnd::SetMenu
        SetMenu(NULL)
    D)裝載菜單
        a)創建菜單 CMenu::LoadMenu
        b)設置菜單 CWnd::SetMenu
        c)從CMenu 對象中分離出Windows菜單 CMenu::Detach
    E)菜單更新機制
    F)快捷菜單,彈出菜單(一定要新建菜單,不能使用框架類的主菜單)
        由於鼠標點擊區域是視圖區域,所以需要在視圖類類中處理
        a)處理鼠標右擊事件WM_RBUTTONDOWN
        b)獲取所需的子菜單
        c)彈出菜單項 CMenu::TrackPopupMenu
        d)客戶區座標轉到屏幕座標:CWnd::CClientToScreen
        
3)菜單相關動態操作
    a)創建空菜單 CMenu::CreateMenu
    b)追加彈式菜單 CMenu::AppendMenu(MF_POPUP)
        每個菜單都有一個菜單句柄:CMenu::m_hMenu
        重畫菜單條:CWnd::DrawMenuBar
        
    c)追加普通菜單 CMenu::AppendMenu(MF_STRING)
    d)插入菜單:CMenu::InsertMenu
    e)刪除菜單:CMenu::DeleteMenu

五、動態圖標

1)定時器:CWnd::SetTimer
    a)定時器信號:WM_TIMER
    b)設置定時器應該在OnCreate()
2)加載自定義圖標(WinAPI):LoadIcon()
    a)將資源ID轉換爲字符串 MAKEINSERSOURCE()
    b)獲取應用程序實例:
        AfxGetInstanceHandle()
        AfxGetApp()->m_hInstance
3)設置圖標(WinAPI)SetClassLong()
    窗口句柄:CWnd::m_hWnd
    

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