mfc编程 孙鑫_MFC(文本编程,孙鑫C++第五讲笔记整理) | 学步园
以下是第五講的主要內容(文本輸入輸出,要先設置光標位置,然后再輸出文本)
1.CWnd::CreateSolidCaret創建插入符,ShowCaret()顯示插入符。GetTextMetrics(),獲得當前字體的一些信息。CWnd::CreateCaret()創建圖象插入符
bitmap.LoadBitmap(IDB_BITMAP1);//此處的bitmap為成員變量!!!
CreateCaret(&bitmap);
ShowCaret();
TEXTMETRIC tm;//字體結構體
dc.GetTextMetrics(&tm);//
m_ptOrigin.y+=tm.tmHeight;//獲得字體高度。
2.VC中CString::LoadString(ID號),比較方便。
3.路徑層的概念:有兩種方法創建路徑層:
(1)
pDC->BeginPath();
pDC->Rectangle(50,50,50+sz.cx,50+sz.cy);
pDC->EndPath();
pDC->SelectClipPath(RGN_DIFF);
(2)
CSize sz=pDC->GetTextExtent(str);
CRgn rn;
rn.CreateRectRgn(0,50,sz.cx,sz.cy);
pDC->SelectClipRgn(&rn,RGN_DIFF);
路徑層有什么作用?可以保護我們先前的文本或者圖像不被后來畫的覆蓋。
4.在View上輸入文字的步驟。
CFont font;//創建字體對象
font.CreatePointFont(300,"華文行楷",NULL);//設置
CFont *pOldFont=dc.SelectObject(&font);//將字體選擇到DC中
TEXTMETRIC tm;//創建字體信息對象
dc.GetTextMetrics(&tm);//獲得當前字體信息
if(0x0d==nChar)//處理回車鍵
{
m_strLine.Empty();
m_ptOrigin.y+=tm.tmHeight;
}
else if(0x08==nChar)//處理退格鍵
{
COLORREF clr=dc.SetTextColor(dc.GetBkColor());
dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strLine);
m_strLine=m_strLine.Left(m_strLine.GetLength()-1);
dc.SetTextColor(clr);
}
else
{
m_strLine+=nChar;
}
CSize sz=dc.GetTextExtent(m_strLine); CPoint pt;//處理光標的位置
pt.x=m_ptOrigin.x+sz.cx;
pt.y=m_ptOrigin.y; SetCaretPos(pt);
dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strLine);//輸出字體dc.SelectObject(pOldFont);//將原先的字體選擇回去。有了CEditView和CRichEditView之后,就沒有那么辛苦了。
5.模擬卡啦OK變色的步驟。
(1)設置定時器
(2)在定時器中加入代碼
具體代碼如下:(編完一個之后,注釋掉前面的,繼續編)
我這里把第五講分成兩個程序,把最后一個卡拉OK輸出單獨出來了,怕太混亂了。
CXXView:
private:
CBitmap cbitmap;
CPoint m_orgpt;
CString cstring;
CPoint cppt;
位圖:
OnDraw:
void CMyTextView::OnDraw(CDC* pDC)
{
CMyTextDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
/*this->CreateSolidCaret(10,20);//創建一個光標
this->ShowCaret();*/ //顯示光標,這兩個函數都是CWnd的成員函數
/*TEXTMETRIC tm; //這個結構體可以獲取字體的信息
pDC->GetTextMetrics(&tm);
this->CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight);//創建一個大小高度比較正常的光標
this->ShowCaret();*/
/*cbitmap.LoadBitmap(BITMAPID);//cbitmap資源一般設置成為成員變量
this->CreateCaret(&cbitmap);//創建了一個位圖光標,一閃一閃
this->ShowCaret();*/
/*
//CString cstring("大家好,歡迎一起學習MFC");
CString cstring="大家好,歡迎一起學習MFC";
pDC->TextOut(100,100,cstring);*/
/*CString cstring;
cstring.LoadString(IDS_MYBOLG);
pDC->TextOut(100,100,cstring);*/
/*CString cstring("Hello,歡迎大家一起學習MFC");
CSize cs=pDC->GetTextExtent(cstring);//區別跟TextMetric的不同,這里是根據字符串來獲取的
pDC->TextOut(100,100,cstring);
pDC->BeginPath();
pDC->Rectangle(100,100,cs.cx+100,cs.cy+100);//如果沒有上下的XXPath,則顯示一被白色畫刷填充的矩形
pDC->EndPath();
//SelectClipPath的參數,大家不妨多試幾種,看看效果
//RGN_AND RGN_COPY RGN_DIFF RGN_OR RGN_XOR
pDC->SelectClipPath(RGN_DIFF);
for(int i=0;i<300;i+=10)//花了橫豎很多線條,交叉著
{
pDC->MoveTo(i,0);
pDC->LineTo(i,300);
pDC->MoveTo(0,i);
pDC->LineTo(300,i);
}*/
TEXTMETRIC tm;
pDC->GetTextMetrics(&tm);
this->CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight);
this->ShowCaret();
}
CXXView右鍵,添加一個WM_Char消息:
生成OnChar方法
void CMyTextView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
CClientDC ccdc(this);
TEXTMETRIC tm;
ccdc.GetTextMetrics(&tm);
CFont cfont;
cfont.CreatePointFont(130,"宋體",NULL);
CFont *pcf=ccdc.SelectObject(&cfont);
if(0x0D==nChar)//換行
{
cstring.Empty();//換行清空
m_orgpt.y=m_orgpt.y+tm.tmHeight;//橫坐標不變,縱坐標向下一個字符的高度
}
else if (0x08==nChar)//刪除鍵
{
COLORREF bkcolor=ccdc.GetBkColor();//獲取背景顏色
COLORREF oldcolor=ccdc.SetTextColor(bkcolor);//設置字體顏色為背景顏色,并且保留設置前的字體顏色
ccdc.TextOut(m_orgpt.x,m_orgpt.y,cstring);//用背景顏色輸出文字
cstring=cstring.Left(cstring.GetLength()-1);//去掉最后一個字符
ccdc.SetTextColor(oldcolor);//重新設置原來的字體顏色
}
else
{
cstring+=nChar;//插入字符
}
CSize cs=ccdc.GetTextExtent(cstring);//獲取字體矩形的對象
CPoint cpt;
cpt.x=m_orgpt.x+cs.cx;
cpt.y=m_orgpt.y;
this->SetCaretPos(cpt);//重新設置光標的位置
ccdc.TextOut(m_orgpt.x,m_orgpt.y,cstring);//輸出字符串
ccdc.SelectObject(pcf);
CView::OnChar(nChar, nRepCnt, nFlags);
}
感覺還是不完美,比如刪除,當刪除一行之后,應該跳回到上一行的最后,這里都沒有判斷,請自行測試
下面是單獨出來的卡拉OK顯示
成員變量:
private:
CString cstring;
int m_width;
構造函數:
CJustTextView::CJustTextView()
{
// TODO: add construction code here
cstring="";
m_width=0;
}
OnDraw函數:
void CJustTextView::OnDraw(CDC* pDC)
{
CJustTextDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
cstring="hello,welcome to myblog,歡迎大家一起學習MFC";
pDC->TextOut(0,200,cstring);
this->SetTimer(1,50,NULL);
}
CXXView右鍵,添加一個WM_TIMER消息:
自動成成OnTimer方法
void CJustTextView::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
CClientDC ccdc(this);
TEXTMETRIC tm;
ccdc.GetTextMetrics(&tm);
CSize cs=ccdc.GetTextExtent(cstring);
COLORREF oldcolor=ccdc.SetTextColor(RGB(255,0,0));
if(1==nIDEvent)
{
m_width+=5;
CRect crect;
crect.left=0;
crect.top=200;
crect.right=m_width;
crect.bottom=crect.top+tm.tmHeight;
ccdc.DrawText(cstring,&crect,DT_LEFT);
crect.left=0;
crect.top=150;
crect.right=m_width;
crect.bottom=crect.top+tm.tmHeight;
ccdc.DrawText(cstring,&crect,DT_RIGHT);
if(m_width>cs.cx)
{
m_width=0;
ccdc.SetTextColor(RGB(0,255,0));
ccdc.TextOut(0,200,cstring);
COLORREF bkcolor=ccdc.GetBkColor();
ccdc.SetTextColor(bkcolor);
ccdc.TextOut(0,150,cstring);
}
}
CView::OnTimer(nIDEvent);
}
效果圖較多,這里不一一截圖了:
總結
以上是生活随笔為你收集整理的mfc编程 孙鑫_MFC(文本编程,孙鑫C++第五讲笔记整理) | 学步园的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 联想服务器usb虚拟引入,联想Think
- 下一篇: Python10个与数学有关的简单实例代