您的位置:首页 > 其它

VC下在对话框上直接输入字母或文字的实现 (Input word on CDialog directly)

2008-02-17 17:54 363 查看
以前在看孙鑫老师的视频时,发现了一个在CDialog直接输入字母或文字的思路及其实现方法

说白了就是直接在对话框上画出文字

根据孙鑫老师的代码,经过了自己的小小的修改,发现还是比较好用的,现公布出来

实现代码:

/////////////////////////////////////////

//相关成员变量声明

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;

}

可以仔细想想退格和其他内部的实现,很好玩的.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐