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

作者:Wupei  |  发表时间:  |  所属分类:VC

以前在看孙鑫老师的视频时,发现了一个在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;
}

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

Trackback from your site.

(2)条评论

  • WLY374

    |

    以上代码,实现时,再输入中文时,中文后面同时显示出英文怎么办?(主要是英文的:?)另外,删除输入的文字后,删除部位仍然有白色字迹如何处理?求解?

    回复

    • Wupei

      |

      以前的这个方法是无法删除(退格)的。。。。

      回复

请在这里留言: