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

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

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

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

实现代码:

href="http://www.j2megame.org/wupei/plugins/plogeshi/styles/plogeshi.css" type="text/css" rel="stylesheet" />

 

  1. /
  2. //相关成员变量声明
  3. CFontDialog m_FontSetting;      //字体选择对话框
  4. CBitmap m_pBitmap;              //缓冲图片
  5. CString m_strLine;              //字符串(为了中文显示正常,需要初始化为一个空格)
  6. CPoint m_ptOrigin;              //输入起点坐标
  7.  
  8.  
  9. BOOL CMyDlg:: PreTranslateMessage (MSG* pMsg )
  10. {
  11.         //判断WM_CHAR消息,也可以相应该消息
  12.         if (pMsg->message == WM_CHAR )
  13.         {
  14.                 //取得字符(当是中文时,这个为半个中文,也就是1字节)
  15.                 TCHAR nChar = pMsg->wParam;     
  16.  
  17.                 /
  18.                 //双缓冲实现,为了不使屏幕过分闪动(读者请根据需要修改)
  19.                 CDC dc;
  20.                 CDC* pDC = GetDC ( );
  21.                 dc. CreateCompatibleDC (pDC );
  22.                 dc. SelectObject (m_pBitmap );     
  23.                 /
  24.  
  25.                 //选择自己喜欢的字体,或者由外部指定
  26.                 CFont font;     
  27.                 LOGFONT pLogFont;
  28.                 m_FontSetting. GetCurrentFont (&pLogFont );
  29.                 font. CreateFontIndirect (&pLogFont );
  30.                 CFont *pOldFont=dc. SelectObject (&font );
  31.  
  32.                 //获得当前字体物理信息,比如高度,宽度,间隔.....
  33.                 TEXTMETRIC tm;
  34.                 dc. GetTextMetrics (&tm );
  35.  
  36.                 if (0x0d==nChar )  //回车
  37.                 {
  38.                         m_strLine= " "; //为了中文显示正常,需要初始化为一个空格
  39.                         m_ptOrigin. y+= tm. tmHeight;
  40.                 }
  41.                 else if (0x08==nChar )    //退格
  42.                 {
  43.                         COLORREF clr=dc. SetTextColor (dc. GetBkColor ( ) );
  44.                         dc. TextOut (m_ptOrigin. x,m_ptOrigin. y,m_strLine );
  45.                         m_strLine=m_strLine. Left (m_strLine. GetLength ( ) -1 );
  46.                         dc. SetTextColor (clr );
  47.                 }
  48.                 else
  49.                 {
  50.                         m_strLine+=nChar;
  51.                 }
  52.  
  53.                 //提示符位置
  54.                 CSize sz=dc. GetTextExtent (m_strLine );
  55.                 CPoint pt;
  56.                 pt. x=m_ptOrigin. x+sz. cx;
  57.                 pt. y=m_ptOrigin. y;
  58.                 SetCaretPos (pt );
  59.  
  60.                 //字的颜色
  61.                 COLORREF oldClr = dc. SetTextColor (m_FontSetting. GetColor ( ) );
  62.                 int oldbkMode = dc. SetBkMode (TRANSPARENT );
  63.                
  64.                 //输出
  65.                 dc. TextOut (m_ptOrigin. x,m_ptOrigin. y,m_strLine );
  66.                
  67.                 dc. SetBkMode (oldbkMode );
  68.                 dc. SetTextColor (oldClr );
  69.  
  70.                 dc. SelectObject (pOldFont );
  71.  
  72.                 pDC->DeleteDC ( );
  73.  
  74.                 Invalidate ( );
  75.         }
  76.        
  77.         return false;
  78. }

 

可以仔细想想退格和其他内部的实现,很好玩的.

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值