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 篇原創文章 · 獲贊 2 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章