本文是根据
VC下在对话框上直接输入字母或文字的实现 (Input word on CDialog directly)
这篇文章改写而成。
原文链接:http://wupei.j2megame.org/archives/83
需要说明的是,本程序仍然有缺陷,即在删除已输入的文字后,再输入文字时有时会出现乱码。故还有待修正!
1.新建一个基于对话框的程序;
2.相关成员变量声明;
CFontDialog m_FontSetting; //字体选择对话框
CBitmap m_pBitmap; //缓冲图片
CString m_strLine; //字符串(为了中文显示正常,需要初始化为一个空格)
CPoint m_ptOrigin; //输入起点坐标
3.添加PreTranslateMessage(MSG* pMsg)消息响应,在其中添加下面代码:
//判断WM_CHAR消息,也可以相应该消息
if (pMsg->message == WM_CHAR)
{
//取得字符(当是中文时,这个为半个中文,也就是1字节)
TCHAR nChar = pMsg->wParam;
/
//双缓冲实现,为了不使屏幕过分闪动(读者请根据需要修改)
CClientDC dc(this);
// 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;
4.在OnInitDialog()中添加:
m_ptOrigin = (200,100);//初始化输入字符的位置
源码下载:
http://download.csdn.net/detail/c_s_d_n_user/5310917