VC下在对话框上直接输入字母或文字的实现 (Input word on CDialog directly)
2008-02-17 17:54
363 查看
以前在看孙鑫老师的视频时,发现了一个在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;
}
可以仔细想想退格和其他内部的实现,很好玩的.
说白了就是直接在对话框上画出文字
根据孙鑫老师的代码,经过了自己的小小的修改,发现还是比较好用的,现公布出来
实现代码:
/////////////////////////////////////////
//相关成员变量声明
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;
}
可以仔细想想退格和其他内部的实现,很好玩的.
相关文章推荐
- input 标签实现输入框带提示文字效果(两种方法)
- js实现文本框或文本域在用户输入时(oninput)触发事件,操作元素
- .net C# inputBox文字输入对话框,类似delphi的inputBox
- .net C# inputBox文字输入对话框,类似delphi的inputBox
- 输入文字自动筛选--类似百度的功能(onchange与oninput和 onpropertychange 两者的区别)
- 各种对话框的实现(文字对话框,选择对话框,弹出输入对话框,单选,多选对话框,自定义对话框)
- 已知字母序列【d, g, e, c, f, b, o, a】,请实现一个函数针对输入的一组字符串 input[] = {"bed", "dog", "dear", "eye"},按照字母顺序排序并打印
- 已知字母序列【d, g, e, c, f, b, o, a】,请实现一个函数针对输入的一组字符串 input[] = {"bed", "dog", "dear", "eye"},按照字母顺序排序并打印
- 已知字母序列【d, g, e, c, f, b, o, a】,请实现一个函数针对输入的一组字符串 input[] = {"bed", "dog", "dear", "eye"},按照字母顺序排序并打印
- vc 实现文字旋转 文字旋转 对话框
- EditText+Span实现Android版Word的输入文字编辑
- .net C# inputBox文字输入对话框,类似delphi的inputBox
- 如何 实现 input 判断客户输入的首字母必须为m
- js实现input输入文字搜索功能
- word直接输入希腊字母
- vc嵌入Word后怎莫实现数据的同步刷新及在视图里显示所有文字
- FckEditor中从word文档粘贴过来的内容在点击确定清除格式后直接清除而不是再弹出从MS WORD粘贴对话框的实现
- VC实现对话框置顶并获取键盘输入焦点
- .net C# inputBox文字输入对话框,类似delphi的inputBox收藏
- vc+如何实现模拟键盘输入,自动输入文字(创世纪篇)