文字編輯方面 內容比較雜 我覺得就是現用現學無需過於深入 所以只把相應代碼貼下加以說明
首先要創建插入符
需要這CWnd的兩個成員函數CreateSolidCaret和ShowCaret
CClientDC dc(this);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm); //這裏是獲取字體信息 爲了讓插入符與字體大小一致
CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight);
另外若創建位圖插入符 可如下操作
bitmap.LoadBitmapW(IDB_BITMAP1);
CreateCaret(&bitmap);
ShowCaret();
讓插入符移動到着鼠標左鍵點擊位置首先當然是添加一個左鍵響應函數 然後在裏面加入如下函數
SetCaretPos(point);
恩 顧名思義 不多說了
然後我們在OnDraw成員函數上添加重繪代碼了
CString str("I am the best");
//str="hello";
pDC->TextOutW(50,50,str);
//想得到當前DC中字體的信息,可以用GetTextMetrics,一般用得多的是取得字體高度。
//GetTextExtent得到給定字符串的尺寸:高和寬,對具體的文字是準確的輸出佔用的尺寸。
CSize sz=pDC->GetTextExtent(str);
str.LoadStringW(IDS_MY);
pDC->TextOutW(0,250,str);
//路徑程
pDC->BeginPath();
pDC->Rectangle(50,50,50+sz.cx,50+sz.cy);
pDC->EndPath();
pDC->SelectClipPath(RGN_DIFF); //用於路徑程與其他區域進行交互
//畫網格
for(int i=0;i<300;i+=30)
{
pDC->MoveTo(0,i);
pDC->LineTo(300,i);
pDC->MoveTo(i,0);
pDC->LineTo(i,300);
}
下面是實現輸入文字 換行 退格等功能
void C文本編輯View::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
CClientDC dc(this);
CFont font;
font.CreatePointFont(300,L"幼圓",NULL); //改變字體
CFont *pOld=dc.SelectObject(&font);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
//回車
if(0x0d==nChar)
{
m_string.Empty(); //清空字符串
m_point.y+=tm.tmHeight;
}
//退格
else if(0x08==nChar)
{
COLORREF clr=dc.SetTextColor(dc.GetBkColor()); //設置文本背景色
dc.TextOutW(m_point.x,m_point.y,m_string);
m_string=m_string.Left(m_string.GetLength()-1); //去掉一個字符
dc.SetTextColor(clr);
}
else
{
//接收字符
m_string+=(TCHAR)nChar;
}
dc.TextOutW(m_point.x,m_point.y,m_string);
//獲取字符串寬度 使插入符右移
CSize sz=dc.GetText(m_string);
CPoint pt;
pt.x=m_point.x+sz.cx;
pt.y=m_point.y+sz.cy;
SetCaretPos(pt);
dc.SelectObject(&pOld);
CView::OnChar(nChar, nRepCnt, nFlags);
}
下面是 做文字的一些動態效果 這個靠想象力了 也不多說
主要就是 SetTimer和DrawText的應用
void C文本編輯View::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息處理程序代碼和/或調用默認值
m_width+=5;
CClientDC dc(this);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
CRect rect;
rect.left=0;
rect.top=250;
rect.right=m_width;
rect.bottom=rect.top+tm.tmHeight;
dc.SetTextColor(RGB(255,0,0));
CString str;
str.LoadStringW(IDS_MY);
dc.DrawText(str,rect,DT_LEFT);
rect.top=100;
rect.bottom=rect.top+tm.tmHeight;
dc.DrawText(str,rect,DT_RIGHT);
CSize sz=dc.GetTextExtent(str);
if(m_width>sz.cx)
{
m_width=0;
dc.SetTextColor(RGB(0,255,0));
dc.TextOutW(0,250,str);
}
CView::OnTimer(nIDEvent);
}