MFC 画线,画刷,文本
CPaintDC dc(this);//只能在OnPaint函數(shù)中使用
CClientDC dc(this);//在哪里使用都可以
畫直線
獲得設(shè)備描述表—>MoveTo -->LineTo
CClientDC dc(this);dc.MoveTo(m_myPoint);dc.LineTo(point);畫連續(xù)直線
思路: 鼠標(biāo)按下時(shí),變量flag為true,記初始點(diǎn)坐標(biāo);在鼠標(biāo)移動消息處理函數(shù)下,當(dāng)flag為true,獲得設(shè)備描述表 MoveTo LineTo
最重要的是: 鼠標(biāo)移動時(shí),消息終點(diǎn)為下一個(gè)的起始點(diǎn)。
鼠標(biāo)左鍵按下:
在鼠標(biāo)移動時(shí):OnMouseMove()
if(true == m_bDrawFlag)//畫連續(xù)的線,前一段的終點(diǎn)是此段的起點(diǎn){CClientDC dc(this);dc.MoveTo(m_myPoint);dc.LineTo(point);m_myPoint = point;//如果沒有這個(gè),則畫的線起點(diǎn)是一個(gè),終點(diǎn)不同而已,}畫刷
- 簡單畫刷 :主要做填充
獲得設(shè)備描述表–> 定義畫刷對象—>填充
- 位圖畫刷
思路:獲得設(shè)備描述表—>定義位圖對象–>加載位圖–>定義畫刷對象–>填充
字體 CFont::CreatePointFont
如果在OnDraw中就不需要獲取設(shè)備描述表
思路: 創(chuàng)建對象 -> 選入設(shè)備描述表中 -> 輸出TextOut即可 -> 恢復(fù)原來的字體
輸出:
第一行: 一個(gè)很大字體的 hello
第二行 : 一個(gè)很小字體的 hello
任意位置的 插入符 CWnd::CreateSolidCaret
創(chuàng)建–》顯示–》移動–》必須要時(shí)要隱藏
函數(shù):CWnd::CreateSolidCaret實(shí)體
函數(shù):CreateCaret 需要CBitmap
在視圖中,OnCreate中創(chuàng)建,是因?yàn)? 在窗口創(chuàng)建之前創(chuàng)建插入符是沒有任何意義的,所以在窗口創(chuàng)建完后在創(chuàng)建插入符,故在OnCreate中
發(fā)現(xiàn)創(chuàng)建的插入符太太太大了。。。怎么辦呢?獲取環(huán)境的插入符信息,然后給新的插入符,按照一定比例來創(chuàng)建。
2. 根據(jù)上下文環(huán)境設(shè)置插入符
3. 任意位置插入插入符 SetCaretPos(point);
SetCaretPos(point);//移動插入符
鼠標(biāo)左鍵:任意位置 設(shè)置光標(biāo)位置
任意位置點(diǎn)擊鍵盤輸入字符
在上面任意 位置 點(diǎn)擊 就顯示插入符的基礎(chǔ)上,寫字體:
a. 定義全局變量 CString m_strCon; CPoint m_point;//TextOut中需要
b. 鼠標(biāo)左鍵按下時(shí),
清空m_strCon.Text("");或者 m_strCon.Empty();
m_point = point;//點(diǎn)擊位置寫入
作用: 寫入時(shí)不會把上一次的內(nèi)容也顯示上
c. 鍵盤消息在WM_CHAR中處理:
在文檔中顯示輸入字符TextOut
發(fā)現(xiàn)上面光標(biāo)并沒有跟著走:而且原來寫的前面還有一個(gè)光標(biāo):
【解決方法】獲取字符串的尺寸信息,在起點(diǎn)坐標(biāo)的基礎(chǔ)上,加上這個(gè)尺寸信息就可以啦
任意位置的字符的換行、退格
void CDrawLineView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) {// TODO: 在此添加消息處理程序代碼和/或調(diào)用默認(rèn)值//鍵盤中輸入內(nèi)容//寫字體 在CDC中CClientDC dc(this);if(nChar == VK_RETURN)//換行{m_strCon.Empty();TEXTMETRIC text;//字體信息結(jié)構(gòu)體dc.GetTextMetrics(&text);m_myPoint.y += text.tmHeight;}else if(nChar == VK_BACK)//重新寫{//先用白色背景重新寫一個(gè)全的,然后在寫一個(gè)去掉的COLORREF col = dc.GetBkColor();COLORREF Old = dc.SetTextColor(col);dc.TextOutW(m_myPoint.x,m_myPoint.y,m_strCon);m_strCon = m_strCon.Left(m_strCon.GetLength() - 1);dc.SetTextColor(Old);}else{m_strCon += (TCHAR)nChar;;}//光標(biāo)隨著輸入走CSize size = dc.GetTextExtent(m_strCon);int x = m_myPoint.x + size.cx;int y = m_myPoint.y;SetCaretPos(CPoint(x,y));//輸出字體dc.TextOutW(m_myPoint.x,m_myPoint.y,m_strCon);CView::OnChar(nChar, nRepCnt, nFlags); }字體顏色隨時(shí)間變化,像歌詞
m_nWidth為全局 int
if(nIDEvent == 12){m_nWidth += 5;//+= 50時(shí) 顯示不全CString str = _T("hello,hello,show up if you want to have something ,you must do your best !");CClientDC dc(this);CSize size = dc.GetTextExtent(str);if(m_nWidth > size.cx){m_nWidth = 0;Invalidate(false);//界面刷新}//先獲得原來的顏色dc.TextOutW(200,50,str);COLORREF col = dc.GetTextColor();dc.SetTextColor(RGB(255,0,0));//設(shè)置新的顏色dc.DrawText(str,CRect(200,50,200 + m_nWidth,50 + size.cy),DT_BOTTOM);dc.SetTextColor(col);//恢復(fù)原來顏色}函數(shù)InValidate()
原型:void Invalidate( BOOL bErase = TRUE );
功能: 該函數(shù)的作用是使整個(gè)窗口客戶區(qū)無效。窗口的客戶區(qū)無效意味著需要重繪。
bErase 決定了在發(fā)送WM_PAINT之前是否發(fā)送WM_ERASEBKGND.
Invalidate: 函數(shù): 是刷新窗口,調(diào)用這個(gè)函數(shù)會產(chǎn)生消息WM_PAINT 程序會相應(yīng)ONDraw或者OnPaint函數(shù)
bErase = false 時(shí) 不擦除背景色,直接繪圖;
bErase = true 時(shí) 需要擦除背景色,會出現(xiàn) 刷屏的現(xiàn)象
InvalidateRect():
該函數(shù)的功能與Invalidate基本一樣,不同的是,它是使指定的某個(gè)區(qū)域無效,需要輸入一個(gè)區(qū)域,如果參數(shù)為NULL,則設(shè)置整個(gè)窗口為無效區(qū)。函數(shù)UpdateWindow( )
原型:BOOL UpdateWindow(HWND hWnd );// hWnd 要更新的窗口的句柄
UpdateWindow函數(shù)就發(fā)送一個(gè)WM_PAINT消息來更新指定窗口的客戶區(qū)。
UpdateWindow( )的作用是使窗口立即重繪。調(diào)用Invalidate等函數(shù)后窗口不會立即重繪,這是由于WM_PAINT消息的優(yōu)先級很低,它需要等消息隊(duì)列中的其它消息發(fā)送完后才能被處理。調(diào)用UpdateWindow函數(shù)可使WM_PAINT被直接發(fā)送到目標(biāo)窗口,從而導(dǎo)致窗口立即重繪。
關(guān)于這幾個(gè)函數(shù)的具體用法,見鏈接
【總結(jié)】
1.添加變量方式:選中所屬類,添加變量 變量類型CPoint 可以自己輸入,這樣子的話可以,添加的變量會有初始化
2.在VS2010中資源時(shí)會有曲線,可以添加頭文件 resource.h 就沒有曲線啦,這個(gè)VS2010就是有點(diǎn)問題哦
3. 有多個(gè)LineTo時(shí):
pDC->MoveTo(20,20);
pDC->LineTo(40,40);//
pDC->LineTo(50,87);//這個(gè)LineTo的起點(diǎn) (MoveTo)就是上一個(gè) LineTo的點(diǎn),所以是一個(gè)折線:
線段一 點(diǎn)(20,20)到(40,40)
線段二 點(diǎn)(40,40)到(50,87)
4. 多個(gè)MoveTo時(shí):
pDC->MoveTo(20,20);
pDC->MoveTo(40,40);//
pDC->LineTo(50,87);
最后只有一條線段: 點(diǎn) (40,40)到點(diǎn)(50,87) ,第一個(gè)MoveTo的點(diǎn)就被忽略了。
5. SelectObject 函數(shù)
功能: 將新的font對象選入設(shè)備描述表,
返回值:該函數(shù)返回的 被替代的對象的指針
CFont *pOldFont = pDC->SelectObject(&font);//該函數(shù)返回的 被替代的對象的指針
再次使用的時(shí)候:pDC->SelectObject(pOldFont); 恢復(fù)成原來的,如果在輸出時(shí),字體就變成默認(rèn)的字體了,而不是自己設(shè)置的字體。
所以,在使用CPen CBrush CFont BitMap 時(shí) 一定要對SelectObject成對使用
6. 函數(shù)CDC::GetTextMetrics 獲得設(shè)備的字體信息,使用時(shí),必須的CClientDC dc(this); 必須獲得設(shè)備描述表
7. CSize CDC::GetTextExtent(const CString& str) const; //獲取字符串的尺寸信息
8. CDC::GetTextMetrics()//獲取字符的信息,高度與7中cy大小是一樣子的
9. GetTextColor
COLORREF GetTextColor() const; 獲得當(dāng)前字體的顏色
virtual COLORREF SetTextColor(COLORREF crColor );設(shè)置當(dāng)前字體顏色
總結(jié)
以上是生活随笔為你收集整理的MFC 画线,画刷,文本的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html 自动填表,Delphi WEB
- 下一篇: 【Python+C#】手把手搭建基于Hu