[顶级][复杂][richedit]顶级复杂的 richedit 乱码问题。。。吐血狂晕~~
09月 18th, 2008 by admin
Posted in VC/MFC | No Comments »
不知道大家用过Nero 刻录软件没有,我正在改里面的一个终极郁闷的问题,用尽了一切手段和方法也搞不定!
问题如下:
编辑菜单的时候 ,输入框采用richedit,创建方法如下:
bool cr = RichEditCtrl::Create(0, WS_CHILD | (m_singleLine ? 0 : (ES_WANTRETURN | ES_MULTILINE)), Rect(-1, -1, -1, -1), parent, 1);
if (cr) {
SetEventMask(ENM_CHANGE | ENM_KEYEVENTS | ENM_SELCHANGE);
SetTextMode(TM_PLAINTEXT);
Subclass();
return true;
}
调入微软全拼,输入没有任何乱码问题,但是全拼输入时,输入法输入框跑到了屏幕最顶端。而且不能够使用输入法的选择词语功能。
我们这边的一位高手,找了一个参数ES_SELFIME解决了这个问题如下,
bool cr = RichEditCtrl::Create(0, WS_CHILD |ES_SELFIME| (m_singleLine ? 0 : (ES_WANTRETURN | ES_MULTILINE)), Rect(-1, -1, -1, -1), parent, 1);
if (cr) {
SetEventMask(ENM_CHANGE | ENM_KEYEVENTS | ENM_SELCHANGE);
SetTextMode(TM_PLAINTEXT);
Subclass();
return true;
}
结果输入法位置一切正常了,但是输入汉字的时候会出现乱码!!! 然后我就开始了慢慢查找乱码的旅途。 结果发现
// get required length (use user-specified CR translation setting)
GETTEXTLENGTHEX gtl;
gtl.codepage = 1200;
gtl.flags = GTL_NUMBYTES | ((flags & GT_USECRLF) ? GTL_USECRLF : GTL_DEFAULT);
int size = (int)SendMessage(EM_GETTEXTLENGTHEX, (WPARAM)>l, 0);
if (size <= 0)
return size;
wchar_t* p = new wchar_t[size];
// get text
GETTEXTEX gt;
gt.cb = size * sizeof(wchar_t);
gt.codepage = 1200;
gt.flags = flags;
gt.lpDefaultChar = 0;
gt.lpUsedDefChar = 0;
int rc = (int)SendMessage(EM_GETTEXTEX, (WPARAM)>, (LPARAM)p);
buffer = String(p, rc);
delete[] p;
获取到的输入就是乱码
本系统是 纯英文的vista 操作系统,软件在2005中编译,编译参数加了UNICODE
也采用了 richedit2.0 unicode版本了
LoadLibrary(L"RICHED32.DLL");
// LoadLibrary(L"RICHED20.DLL");
请问大家能不能帮我分析一下,我真是不尽感激。。
据说,微软输入法,输出的unicode,而全拼或智能ABC输出都是ANSI,自己转换吧
无视我的话吧,我自己建了一个unicode工程,发现RichEdit2可以用全拼输入。
资源里面相关行就是这样简单的一句
CONTROL "",IDC_RICHEDIT21,"RichEdit20A",ES_AUTOHSCROLL | WS_BORDER | WS_TABSTOP,7,7,200,101
不太明白,加上ES_SELFIME 后,所有输入发都有乱码了,不是所有都是乱码,有些字乱码?有些字不是乱码?
http://msdn2.microsoft.com/en-us/library/bb774250(VS.85).aspx
具体设置成什么参数?? IMF_DUALFONT??
[RichEdit][选中][文本]获取RichEdit被选中文本(编程中~在线等~)
09月 5th, 2008 by admin
Posted in VC/MFC | No Comments »
换句话说,GetSelText这个函数具体怎么用?
我要把编辑框里多行复制的文本选出,再赋到一个CString里,然后复制到剪贴板~
请大侠指教~
我需要的功能有获取当前选择区域内的文字就够了,但是网上好多这个函数的说明都没看明白,怎么实现呢?就是参数返回值什么的~
我的编辑框是IDC_RICHEDIT1,所在的对话框是IDD_RICHBOOK_DIALOG~
辛苦大侠编这行代码出来让小生学习学习,我刚学VC++,很多东西还不懂~
找了一个多小时了,着急死了~辛苦大侠了~在线等~
CString strText = ((CRichEditCtrl*)GetDlgItem(IDC_RICHEDIT1))->GetSelText();
太感激了!!!
谢谢了谢谢了!
[Richedit][复制][对象]问Richedit里复制ole对象问题
08月 25th, 2008 by admin
Posted in VC/MFC | No Comments »
我自己写了完成某些功能的 Ole 对象, 可以插入 RichEdit, 在里面工作也正常.
但是 RichEdit 在拖放这个 Ole 对象时, 实际上把原对象删除, 又新建了新的对象. 我原来给先前的 Ole 对象设定的一些参数, 新建的对象里面都没有这些参数值了. 拖放之后, ole对象已经不可正常工作了. 请问大侠, 如何处理这种关系?
同样的, CTRL+C、 CTRL+V 之后,新产生的 ole 对象虽然是我写的对象,但是里面并没有我设定的参数值,跟前面的问题实际上是一样的。
请问怎么处理??
分不多, 我尽量给。
没有人愿意帮忙??
唉,还是自己解决了.
经验放送, 在你写的 OleControl 里实现这两个函数就 OK 了:
STDMETHOD_(HRESULT, IPersistStreamInit_Save)(LPSTREAM pStm, BOOL fClearDirty, ATL_PROPMAP_ENTRY* pMap);
STDMETHOD_(HRESULT, IPersistStreamInit_Load)(LPSTREAM pStm, ATL_PROPMAP_ENTRY* pMap);
给你发留言了
[动态][创建][RichEdit]动态创建RichEdit 回帖有分
08月 22nd, 2008 by admin
Posted in VC/MFC | No Comments »
我动态添加了一个richedit,但是运行到下面一句设置richedit背景色就出错,这个是怎么回事呢?
好象设置其他的也都不行,请各位高人指点一下,万分感谢!!!
CRichEditCtrl* crctl;
crctl=CreateWindowEx(0, RICHEDIT_CLASS,_T("12"),WS_VISIBLE ⦠WS_CHILD ⦠ES_MULTILINE ⦅S_WANTRETURN ⦠
WS_VSCROLL ⦠WS_BORDER,20,20,200,200,m_hWnd,(HMENU)2,AfxGetInstanceHandle(),NULL);
crctl->SetBackgroundColor(false,RGB(0,255,0)); //运行到这句就出错
是不是我动态创建的方法不对?还是哪个参数设置有误?
还是我使用crctl变量有误?
不会,帮顶!!!!
得New个实体吧!
CreateWindowEx返回的是控件的句柄,不能当做指针来用。
能不能具体些给个简单代码,万分感谢!
应该:
CRichEditCtrl* crctl = new CRichEditCtrl;
crctl->Create(WS_VISIBLE⦗S_CHILD⦅S_MULTILINE⦅S_WANTRETURN⦗S_VSCROLL⦗S_BORDER,CRect(20,20,220,220),this,0);
crctl->SetBackgroundColor(false,RGB(0,255,0));
楼主蛮诚心的,大家会的 帮帮忙啊!
用CRichEditCtrl,
需要先调用下AfxInitRichEdit();
你用的是mfc还是sdk啊
crctl是一个指向CrichEdiCtrl类的指针啊,而CreateEindowEx返回的是创建好的窗口的句柄啊,怎么能在这里用CreateEindowEx呢?
你应该new一个实例,然后把这个实例的地址赋给crctl嘛
CRichEditCtrl* crctl;
crctl = new CRichEditCtrl;
然后在调用CRichEditCtrl的Create方法
crctl->Create(…) //参数自己看帮助
然后…
crctl->SetBackgroundColor(false,RGB(0,255,0));
[richedit][控件][读写]VC richedit控件读写RTF文件
07月 7th, 2008 by admin
Posted in VC/MFC | No Comments »
VC richedit控件读写RTF文件时,如何得到RTF文件中一行的字体大小,颜色以及格式?
我现在读取的RTF文件里有的行字体是蓝颜色的,
但是读取到对话框的richedit空间后,字体颜色全都是黑色的了,
怎么保持原来的颜色不变呢?
o(∩_∩)o…呵呵,我说的是读rtf,我觉得应该是word的类函数,Selection
终于研究明白啦,下面是我的代码,在VS2005下运行正常,若有不周,欢迎各位批评指正
void CVCreadwriteRTFDlg::OnBnClickedButton1()
{
// 变量的声明
COleVariant vTrue((short)TRUE),
vFalse((short)FALSE),
vOpt((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
CApplication oWordApp ;
CSelection oSel ;
CDocuments oDocs ;
CDocument0 oDoc ;
CParagraphs paragraphs ;
CStringArray aryText;
long paCounst;
int lc ;
// 首先建立一个word实例对象
if (!oWordApp.CreateDispatch(TEXT("Word.Application")) ){
AfxMessageBox( TEXT( "CreateDispatch failed." ) , MB_OK ¦MB_SETFOREGROUND);
return; // 一定要返回,否则程序崩溃
}
// 显示此对象文件 ,您也可以不调用此句,不显示对象文件
oWordApp.Set_Visible(TRUE);
// 创建文档
oDocs = oWordApp.get_Documents();
// 打开一个新文档,将e:\BuildJobEdit.rtf文件的内容添加到新文档中
CComVariant tpl(_T("e:\BuildJobEdit.rtf")), NewTemplate(false), DocType(0), Visble;
oDoc = oDocs.Add(&tpl,&NewTemplate,&DocType,&Visble);
// 选中文档中的所有内容
oSel = oWordApp.get_Selection();
oSel.WholeStory();// 此句必须有,否则后续代码无效。
// 得到所有段
paragraphs = oSel.get_Paragraphs();
paCounst = paragraphs.get_Count();
// 将所有段中的每一段都存在数组里
for( lc = 1 ; lc < paCounst+1 ; lc++ ){
// 得到一段
CParagraph paragraph;
paragraph = paragraphs.Item( (long)lc );
// 得到一段的文本
CRange range = paragraph.get_Range();
CString strRangeText = range.get_Text();
// AfxMessageBox( strRangeText );
// 保存到数组里
aryText.Add( strRangeText );
//释放对象
paragraph.ReleaseDispatch();
}
//// 检验
//INT_PTR iCount = aryText.GetCount();
//for(int lct=0; lct < iCount; lct++){
//
// AfxMessageBox( aryText.GetAt(lct) );
//}
//将当前文档保存到新的文档中
oDoc.SaveAs(COleVariant( TEXT("E:\new.rtf") ),
COleVariant((short)0),
vFalse, COleVariant( TEXT("") ), vTrue, COleVariant( TEXT("") ),
vFalse, vFalse , vFalse, vFalse , vFalse,
vFalse, vFalse , vFalse, vFalse , vFalse
);
// 释放各种对象
oSel.ReleaseDispatch();
paragraphs.ReleaseDispatch();
oDocs.ReleaseDispatch();
oDoc.ReleaseDispatch();
CComVariant SaveChanges(false), OriginalFormat, RouteDocument;
oWordApp.Quit( &SaveChanges,&OriginalFormat,&RouteDocument );
oWordApp.ReleaseDispatch();
}