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

本文介绍了一种在CDialog中实现直接输入文本的方法,通过双缓冲技术和字体选择对话框来绘制文本,有效避免了屏幕闪烁,并支持中文显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以前在看孙鑫老师的视频时,发现了一个在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、付费专栏及课程。

余额充值