以前在看孫鑫老師的視頻時,發現了一個在CDialog直接輸入字母或文字的思路及其實現方法
說白了就是直接在對話框上畫出文字
根據孫鑫老師的代碼,經過了自己的小小的修改,發現還是比較好用的,現公佈出來
實現代碼:
href="http://www.j2megame.org/wupei/plugins/plogeshi/styles/plogeshi.css" type="text/css" rel="stylesheet" />
-
/////////////////////////////////////////
-
//相關成員變量聲明
-
CFontDialog m_FontSetting; //字體選擇對話框
-
CBitmap m_pBitmap; //緩衝圖片
-
CString m_strLine; //字符串(爲了中文顯示正常,需要初始化爲一個空格)
-
CPoint m_ptOrigin; //輸入起點座標
-
-
-
BOOL CMyDlg::PreTranslateMessage(MSG* pMsg)
-
{
-
//判斷WM_CHAR消息,也可以相應該消息
-
if (pMsg->message == WM_CHAR)
-
{
-
//取得字符(當是中文時,這個爲半個中文,也就是1字節)
-
TCHAR nChar = pMsg->wParam;
-
-
/////////////////////////////////////////////////
-
//雙緩衝實現,爲了不使屏幕過分閃動(讀者請根據需要修改)
-
CDC dc;
-
CDC* pDC = GetDC();
-
dc.CreateCompatibleDC(pDC);
-
dc.SelectObject(m_pBitmap);
-
/////////////////////////////////////////////////
-
-
//選擇自己喜歡的字體,或者由外部指定
-
CFont font;
-
LOGFONT pLogFont;
-
m_FontSetting.GetCurrentFont(&pLogFont);
-
font.CreateFontIndirect(&pLogFont);
-
CFont *pOldFont=dc.SelectObject(&font);
-
-
//獲得當前字體物理信息,比如高度,寬度,間隔.....
-
TEXTMETRIC tm;
-
dc.GetTextMetrics(&tm);
-
-
if(0x0d==nChar) //回車
-
{
-
m_strLine=" "; //爲了中文顯示正常,需要初始化爲一個空格
-
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);
-
-
//字的顏色
-
COLORREF oldClr = dc.SetTextColor(m_FontSetting.GetColor());
-
int oldbkMode = dc.SetBkMode(TRANSPARENT);
-
-
//輸出
-
dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strLine);
-
-
dc.SetBkMode(oldbkMode);
-
dc.SetTextColor(oldClr);
-
-
dc.SelectObject(pOldFont);
-
-
pDC->DeleteDC();
-
-
Invalidate();
-
}
-
-
return false;
-
}
可以仔細想想退格和其他內部的實現,很好玩的.