一个在unicode文本插入标签的程序小结
2011-08-01 11:08
393 查看
声明一下开发环境,xp mfc vc6.0
实现的大致要求是,读入一个unicode编码的文件,显示在EditBox中,分页显示(因为我的目标文件能够清晰的分页)。在选定标签后,单击Editbox在光标处插入标签。如果是选定一段文本内容,则在两边插入标签。同时支持回车和退格操作。
1.首先我要实现读取unicode编码的文件并在Editbox上显示。
vc上默认是不支持unicode显示的,所以要自己做一些改变。至于为何做这样修改,不太清楚。
在project -> settings -> c/c++ 下,将Prepreocessor definitions的默认的_MDBS去掉,加上_UNICODE和UNICODE , 在settings -> Link 下,Catagory选为Output, Entry-point symbol 改为 wWinMainCRTStartup。
这样就能对unicode编码文件正确显示,下面是读入的代码
这里使用了CFIleDialog类,选定文件后,文件全名保存为CString,因为我要使用FILE对文件进行读取和写入,所以要将CString 转换成 char *,这是在unicode环境下的,CString保存的对象是wchar_t,即2个字节的?
文件读入要使用wchar_t作为基本读入单位。
2. 插入标签和其他操作
这个直接利用Cedit的Getsel函数,得到光标的位置然后插入指定标签就可以了。因为要在鼠标点击时响应插入事件所以,必须拦截点击事件。在你的DLG对象中,重载
BOOL PreTranslateMessage(MSG *pMsg)函数
代码如下:
3.
实现的大致要求是,读入一个unicode编码的文件,显示在EditBox中,分页显示(因为我的目标文件能够清晰的分页)。在选定标签后,单击Editbox在光标处插入标签。如果是选定一段文本内容,则在两边插入标签。同时支持回车和退格操作。
1.首先我要实现读取unicode编码的文件并在Editbox上显示。
vc上默认是不支持unicode显示的,所以要自己做一些改变。至于为何做这样修改,不太清楚。
在project -> settings -> c/c++ 下,将Prepreocessor definitions的默认的_MDBS去掉,加上_UNICODE和UNICODE , 在settings -> Link 下,Catagory选为Output, Entry-point symbol 改为 wWinMainCRTStartup。
这样就能对unicode编码文件正确显示,下面是读入的代码
CFileDialog dlg(TRUE); if(dlg.DoModal() == IDOK) { headPosVec.clear(); tailPosVec.clear(); total = 0; str.Empty(); fileName = dlg.GetPathName(); //transfer CString to char* for FILE int nSize = WideCharToMultiByte(CP_ACP, NULL, fileName.GetBuffer(fileName.GetLength()), -1, NULL, 0, NULL, FALSE ); char *pName = new char[nSize]; WideCharToMultiByte(CP_ACP, NULL, fileName.GetBuffer(fileName.GetLength()), -1, pName, nSize, NULL, FALSE ); FILE *file; if((file = fopen(pName,"rb")) == NULL) return; int len; while(1) { wchar_t tempStr[10240 + 1] = {0}; len = fread(tempStr, sizeof(wchar_t), 10240, file); str += tempStr; if(len != 10240) break; }
}
GetDlgItem(XXX)->SetWindowText(str);
这里使用了CFIleDialog类,选定文件后,文件全名保存为CString,因为我要使用FILE对文件进行读取和写入,所以要将CString 转换成 char *,这是在unicode环境下的,CString保存的对象是wchar_t,即2个字节的?
文件读入要使用wchar_t作为基本读入单位。
2. 插入标签和其他操作
这个直接利用Cedit的Getsel函数,得到光标的位置然后插入指定标签就可以了。因为要在鼠标点击时响应插入事件所以,必须拦截点击事件。在你的DLG对象中,重载
BOOL PreTranslateMessage(MSG *pMsg)函数
代码如下:
BOOL CNextPreEditDlg::PreTranslateMessage(MSG *pMsg) { if(pMsg->message == WM_LBUTTONUP && pMsg->hwnd == m_txtBox->m_hWnd) { if(!startLabel.IsEmpty()) { insertLabel(); //saveFile(); } } if(pMsg->message == WM_KEYDOWN) { //为什么这里回车事件会响应2次??? 原因是响应了 keydown 和 keyup , if(pMsg->wParam == VK_RETURN ) { insertReturn(); //saveFile(); } if(pMsg->wParam == VK_BACK) { deleteCurWchar(); } if(pMsg->wParam == VK_LEFT) { OnButtonPrevious(); } if(pMsg->wParam == VK_RIGHT) { OnButtonNext(); } } return CDialog::PreTranslateMessage(pMsg); }同理,可响应其他事件,例如回车啊,退格啊。
3.
相关文章推荐
- 在iOS中UILabel作为一个文本标签,在实现程序中几乎每个页面都会用到UILabel,UILabel的常用属性:textColor(文本颜色),text(文本值),font(文本字体),textA
- 用IO流编写一个程序,统计并输出某个文本文件中“a”字符的个数
- 一个简单的程序,统计文本文档中的单词和汉字数,逆序排列(出现频率高的排在最前面)。python实现。
- 写一个程序,分析一个文本文件中各个词出现的频率,并且把频率最高的10个词打印出来。文本文件大约是30KB~300KB大小。
- python中怎么写一个替代txt文本所有回车为空格的程序 ,使文本只有了连续一行 ?
- 建立一个文本文件in.txt,在其中输入若干个正整数,中间用空格分隔,然后保存起来;在窗体上添加一个命令按钮和一个标签框,当单击命令按钮时将in.txt文件中存放的所有的能被3整除的数的和显示在标签框
- symbian在程序的导航条中插入文本或图片
- ACM题目:第一行输入n m,第二行输入一个数列,n为数列长度,m为要插入的值,排序后输出,m n为零时退出程序
- java笔试题---程序产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。
- 如何把一个程序中 Edit 中的文本赋给另一个程序的 Edit ? - 回复 "Disk_" 的问题
- 将其他程序中的大纲文本插入到 PowerPoint 演示文稿中
- Java实训——编写一个窗体程序,能够对文本区中的文字设置字体和大小。
- 面试题,小程序,在一个排序完毕的数组中,按顺序插入一个数
- 增加一个复选框到上一个程序中使得选中或不选中复选框时插入的文字不同
- [举一反三]解决IE下select标签innerHTML插入option的BUG(兼容IE,FF,Opera,Chrome,Safari) 前言: 这是一个老bug了,现在提供一个完美解决方案。由于我一直是用createElement来创建动态的op
- 小结:实验8 分析一个奇怪的程序
- 18.9 随机生成一些数字并传入某个插入方法。 编写一个程序,高效地插入过的元素的维护中位数。
- 一个小程序(类似VA的注释文本功能)
- 一个文本抽取分析的shell程序
- C#--第11周实验--任务2--设计一个窗体--实现将文本框中选择文本复制至标签。