[顶级][复杂][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)&gtl, 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)&gt, (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,自己转换吧

引用 2 楼 w_anthony 的回复:
据说,微软输入法,输出的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??

Tags: , , ,

[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();

太感激了!!!

谢谢了谢谢了!

Tags: , , ,

[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);

给你发留言了

Tags: , , ,

[动态][创建][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));

Tags: , , ,

[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 &brvbarMB_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();

}

Tags: , , ,