VC下在对话框上直接输入字母或文字的实现 (Input word on CDialog directly)
以前在看孙鑫老师的视频时,发现了一个在CDialog直接输入字母或文字的思路及其实现方法
说白了就是直接在对话框上画出文字
根据孙鑫老师的代码,经过了自己的小小的修改,发现还是比较好用的,现公布出来
实现代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
///////////////////////////////////////// //相关成员变量声明 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; } |
可以仔细想想退格和其他内部的实现,很好玩的.
Trackback from your site.
(2)条评论
WLY374
| #
以上代码,实现时,再输入中文时,中文后面同时显示出英文怎么办?(主要是英文的:?)另外,删除输入的文字后,删除部位仍然有白色字迹如何处理?求解?
回复
Wupei
| #
以前的这个方法是无法删除(退格)的。。。。
回复