如何在richedit中显示一个ole对象

作者&投稿:逄欧 (若有异议请与网页底部的电邮联系)
OLE 控件怎么插入到richEdit中~

表行从控制字/trowd开始,/row结束。包含在一个表行中的每个段落必须指定/intbl控制字或者从前一段落继承。一个单元内可能有多个段落; 单元由单元格标志(/cell控制字)结束,行由行标志(/row控制字)结束。表行也可以被绝对定位。

一、存的方法是这样:

我们可以使用Request对象来获取上传上来的法规文件,使用的方法是Request.BinaryRead()

Request.BinaryRead语法:

variant = Request.BinaryRead(count)

参数

variant

返回值保存着从客户端读取到数据。

count

指明要从客户端读取的数据量大小,这个值小于或者等于使用方法Request.TotalBytes得到的数据量。


----------------------------------------------------------------

二、读的方法是用Request.BinaryWrite

Request.BinaryWrite语法:

Request.BinaryWrite data

参数

data

要写入到客户端浏览器中的数据包。

* Request.TotalBytes语法:

variant = Request.TotalBytes

参数

variant

返回从客户端读取到数据量的字节数。

* AppendChunk语法

将数据追加到大型文本、二进制数据 Field 或 Parameter 对象。

object.AppendChunk Data

参数

object Field 或 Parameter 对象

Data 变体型,包含追加到对象中的数据。

说明

使用 Field 或 Parameter 对象的 AppendChunk 方法可将长二进制或字符数据填写到对象中。在系统内存有限的情况下,可以使用 AppendChunk 方法对长整型值进行部分而非全部的操作。

* GetChunk语法

返回大型文本或二进制数据 Field 对象的全部或部分内容 。

variable = field.GetChunk( Size )

返回值

返回变体型。

参数

Size 长整型表达式,等于所要检索的字节或字符数。

说明

使用 Field 对象的 GetChunk 方法检索其部分或全部长二进制或字符数据。在系统内存有限的情况下,可使用 GetChunk 方法处理部分而非全部的长整型值。

GetChunk 调用返回的数据将赋给“变量”。如果 Size 大于剩余的数据,则GetChunk 仅返回剩余的数据而无需用空白填充“变量”。如果字段为空,则GetChunk 方法返回 Null。

每个后续的 GetChunk 调用将检索从前一次 GetChunk 调用停止处开始的数据。但是,如果从一个字段检索数据然后在当前记录中设置或读取另一个字段的值,ADO 将认为已从第一个字段中检索出数据。如果在第一个字段上再次调用 GetChunk 方法,ADO 将把调用解释为新的 GetChunk 操作并从记录的起始处开始读取。如果其他 Recordset 对象不是首个 Recordset 对象的副本,则访问其中的字段不会破坏 GetChunk 操作。

如果 Field 对象的 Attributes 属性中的 adFldLong 位设置为 True,则可以对该字段使用 GetChunk 方法。

如果在 Field 对象上使用 Getchunk 方法时没有当前记录,将产生错误 3021 (无当前记录)。

有时候,我们需要在一个容器中插入各种不同的对象,比如,QQ聊天对话框里可以插入各种静态和动态的图片,甚至还可以插入flash文件,这些都是通过OLE技术来实现的。OLE技术是基于COM的,而COM又是非常复杂的东西,想要学习COM得花很多的时间,《COM技术内幕》,《COM原理和应用》,《INSIDE OLE 2》都是非常好的学习COM和OLE的书,但要把这些书啃完,弄懂,几个月甚至半年都过去了。学习COM是一个郁闷、漫长的过程,虽然进步很慢,但坚持下去会很有意思。如果我们仅仅是使用别人的组件,并将别人的组件插入到自己的容器中,也不是很复杂,下面就是一个例子。
  我们以MSDN的ATL Tutorial中创建的组件做为我们要插入的对象(该组件的创建请看MSDN)。
1、创建一个COM客户端基于对话框的工程,命名为Client,按默认选项设置工程。
2、在主对话框中加入一个RichEdit控件,用ClassWizard为添加一个表示该控件的变量,为m_re,记住类型设为control。为主对话框加入一个按钮,ID设为IDC_INSERTPOLYGON,Caption设置为InsertPolygon。
3、在CClientApp::InitInstance()函数中,在创建对话框的代码前加入如下代码:
if (AfxInitRichEdit() == FALSE)
{
return FALSE;
}
如果不加入上面的代码,应用程序将无法运行。
4、在Client.cpp中添加头文件
#include "..//Polygon.h"  //DLL模块头文件
#include "..//Polygon_i.c" //接口定义
#include "Richole.h"
5、为对话框类加入私有成员函数BOOL InsertPolygon(IRichEditOle* lpRichEditOle);将该函数定义如下:
BOOL CClientDlg::InsertPolygon(IRichEditOle* lpRichEditOle)
{
IStorage* lpStorage = NULL;//存储接口
IOleObject* lpOleObject = NULL;//OLE对象
LPLOCKBYTES lpLockBytes = NULL;//LOCKBYTE
IOleClientSite* lpOleClientSite = NULL;
IPolyCtl* lpPolyCtl = NULL; //控件
CLSID clsid;
REOBJECT reobject;
HRESULT hr;

if(lpRichEditOle == NULL)
return FALSE;
//创建PolyCtl对象并获取接口
hr = ::CoCreateInstance(CLSID_PolyCtl,NULL,CLSCTX_INPROC,IID_IPolyCtl,(LPVOID*)&lpPolyCtl);
if( lpPolyCtl == NULL )
{
return FALSE;
}

// USES_CONVERSION;
BOOL bRet = TRUE;

try{
hr = lpPolyCtl->QueryInterface(&lpOleObject);//获得数据对象接口
if( hr != S_OK )
AfxThrowOleException(hr);
hr = lpOleObject->GetUserClassID(&clsid);
if ( hr != S_OK)
AfxThrowOleException(hr);

hr = ::CreateILockBytesOnHGlobal(NULL, TRUE, &lpLockBytes);//创建LOCKBYTE对象
if (hr != S_OK)
AfxThrowOleException(hr);
ASSERT(lpLockBytes != NULL);

hr = ::StgCreateDocfileOnILockBytes(lpLockBytes,//创建复合文档
STGM_SHARE_EXCLUSIVE|STGM_CREATE|STGM_READWRITE, 0, &lpStorage);
if (hr != S_OK)
{
VERIFY(lpLockBytes->Release() == 0);
lpLockBytes = NULL;
AfxThrowOleException(hr);
}
lpRichEditOle->GetClientSite(&lpOleClientSite);

ZeroMemory(&reobject, sizeof(REOBJECT));//初始化一个对象
reobject.cbStruct = sizeof(REOBJECT);
reobject.clsid = clsid;
reobject.cp = REO_CP_SELECTION;
reobject.dvaspect = DVASPECT_CONTENT;
reobject.dwFlags = REO_BELOWBASELINE;
reobject.poleobj = lpOleObject;
reobject.polesite = lpOleClientSite;
reobject.pstg = lpStorage;
hr = lpRichEditOle->InsertObject( &reobject );
if (hr != S_OK)
AfxThrowOleException(hr);
OleSetContainedObject(lpOleObject,TRUE);
}
catch( COleException* e )
{
TRACE(_T("OleException code:%d"),e->m_sc);
e->Delete();
bRet = FALSE;
}
// release the interface
if( lpPolyCtl != NULL ) lpPolyCtl->Release();
if( lpOleObject != NULL ) lpOleObject->Release();
if( lpOleClientSite != NULL ) lpOleClientSite->Release();
if( lpStorage != NULL ) lpStorage->Release();
return bRet;
}
6、为InsertPolygon按钮添加响应函数,定义如下:
void CClientDlg::OnInsertpolygon()
{
IRichEditOle* lpRichEditOle = NULL;
lpRichEditOle = m_re.GetIRichEditOle();
if (lpRichEditOle != NULL)
{
InsertPolygon(lpRichEditOle);
lpRichEditOle->Release();
}
}


珠山区15198148548: 如何在RichEditCtrl中显示UNICODE字符 -
藤何信可: 解决方法:C++ mRichEditCtrl.SetSel(-1, -1);#if UNICODE SETTEXTEX SetTxtEx = {0,}; SetTxtEx.flags = ST_SELECTION; SetTxtEx.codepage = 1200; BOOL bRet = ::SendMessage(mRichEditCtrl.GetSafeHwnd(), EM_SETTEXTEX, (WPARAM)&...

珠山区15198148548: 如何在RichEdit中查找一字符串 -
藤何信可: 以我的思路来分析是这样的步骤: 1、获取RichEdit1的TEXT 2、获取当前默认浏览器(可通过注册表获得) 3、打开浏览器,并将RichEdit1的网址以参数的形式付给浏览器

珠山区15198148548: 如何在RichEdit中实现上标下标??? -
藤何信可: 如何在RichEdit中实现上标下标 void __fastcall TForm1::Button1Click(TObject *Sender) {// 上标 MySetCharFormat(RichEdit1, CFM_Superscript); }//---------------------------------------------------------------------------// 先选中Richedit中的部分文本,然后点击...

珠山区15198148548: Delphi7的RichEdit问题 -
藤何信可: 一个光标位置,用的着这么复杂吗?如果想排出WORD一类的文本版面,用RichEdit文本框,肯定不行.首先,是它不能中英混排,也就是一行文字之中,如果你用上奇数个英文字符或者数字,右边就不是整齐的了.

珠山区15198148548: richedit如何显示内容和获取内容 -
藤何信可: /实现函数 function GetSelectedText( h:thandle; //EDIT或RICHEDIT的句柄 Buffer: PChar; //返回获取的选中文本 BufSize: Integer //指定返回的大小 ): Integer; //返回实际获取的文本的大小 var

珠山区15198148548: 在delphi7中怎么用richedit控件来显示我要打开的文本?
藤何信可: 在button的onclick事件中:richedit1.Lines.LoadFromFile('c:\sound.txt');就把sound.txt文件打开,并显示其内容.

珠山区15198148548: delphi 怎样使richedit的滚动条跳到0的位置?
藤何信可: 1、SendMessage(RichEdit1.handle,WM_VSCROLL,MakeLong(SB_THUMBTRACK,精确的位置),0);2、//最上方SendMessage(控件.Handle, WM_VScroll, SB_TOP, 0);//最下方SendMessage(控件.Handle, WM_VScroll, SB_BOTTOM, 0);

珠山区15198148548: 在RichEdit中如何实现上标?
藤何信可: 在RichEdit中如何实现上标?如2的3次方,如何让3显示在右上角.用Word实现后考入RichEdit显示是正常的,但如何用程序控制?

珠山区15198148548: delphi关于richedit的使用 -
藤何信可: 如果字符串a b的长度没有超过 richedit 的宽度,只要分别做add就可实现分别以一行输出.颜色的话,可以先选择一行,然后修改已选择文本的属性.procedure TForm1.BitBtn1Click(Sender: TObject); Var {}i,m,k:integer; {}a,b:string; begin //self....

珠山区15198148548: 如何在richedit中显示big5和日文字?望赐教!
藤何信可: 在memo控件中big5和日文文字通过修改charset属性都能正确显示,而在richedit控件中则不行,即使把字体的name属性设为支持big5和日文的MingLiU等其它字体名称都不行,不知何故?望赐教!(操作系统为win2000)

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网