一、簡單繪圖
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