MFC 对话框上打字

本文是根据

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

这篇文章改写而成。

原文链接:http://wupei.j2megame.org/archives/83

需要说明的是,本程序仍然有缺陷,即在删除已输入的文字后,再输入文字时有时会出现乱码。故还有待修正!

 

1.新建一个基于对话框的程序;

 

2.相关成员变量声明;

	CFontDialog m_FontSetting; //字体选择对话框
 	CBitmap m_pBitmap;  //缓冲图片
	CString m_strLine;  //字符串(为了中文显示正常,需要初始化为一个空格)
 	CPoint m_ptOrigin;  //输入起点坐标

 

3.添加PreTranslateMessage(MSG* pMsg)消息响应,在其中添加下面代码:

	//判断WM_CHAR消息,也可以相应该消息
	if (pMsg->message == WM_CHAR)
	{
		//取得字符(当是中文时,这个为半个中文,也就是1字节)
		TCHAR nChar = pMsg->wParam;	
		
		/
		//双缓冲实现,为了不使屏幕过分闪动(读者请根据需要修改)
		CClientDC dc(this);
	//	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;

 

4.在OnInitDialog()中添加:

m_ptOrigin = (200,100);//初始化输入字符的位置


源码下载:

http://download.csdn.net/detail/c_s_d_n_user/5310917

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值