急急急!高分请教!各位大位,有谁知道RxRichedit如何插入控件,例如进度条!!!! ( 积分: 200 )

  • 主题发起人 主题发起人 ninsen
  • 开始时间 开始时间
N

ninsen

Unregistered / Unconfirmed
GUEST, unregistred user!
[blue][/blue]急急急!高分请教!各位大位,有谁知道RxRichedit如何插入控件,例如进度条!!!!就是说在RICHEDIT中显示进度条!非常急,请望高手指教!不胜感激!
 
http://www.jztop.com/dev/db2/2006-06-30/22081.html

看看这个吧,也许有用
 
to weichao9999
你那个不行,概念跟本不一样.不过还是很谢谢你.这个问题真的这么难吗?还是没有人愿意回答
 
你可以设置进度条边框为none,放在上面就可以啊
 
来自:lovezyp, 时间:2007-10-16 11:36:38, ID:3842910
你可以设置进度条边框为none,放在上面就可以啊

当然不可以了,如果是这么简直就好了
 
你要详细说明,你要怎么插入,做到什么效果,插入到什么位置等等
 
你是想显示比如文件传输的进度吧,
我用的是webbrowser,Richedit比较难实现.
 
来自:qnaqbgss, 时间:2007-10-16 12:41:43, ID:3842929
你是想显示比如文件传输的进度吧,
我用的是webbrowser,Richedit比较难实现.

嗯,我就是要那样的效果,例如MSN,阿里旺旺那样传输的效果,webbrowser不能实现一些问题,所以我必须用RICHEDIT
听说RICHEDIT能挺入ACTIVEX组件,有谁做过,或者有这方面的资料帮一下偶了,谢谢大家!
 
用这各试试.
pb1.Parent:=RICHEDIT;
pb1.Top:=0;
pb1.Left:=0;
 
来自:xingkong97, 时间:2007-10-16 15:36:37, ID:3842994
用这各试试.
pb1.Parent:=RICHEDIT;
pb1.Top:=0;
pb1.Left:=0;

这样的方法进度条是插进去了,不过原来的RICHEDIT内容却不能正常运用了.呵呵.不过很感谢你.请大家有谁能帮忙的帮一下小弟,在线等
 
啊?怎么会呢?请你再说清楚些,你要实现什么样的功能?
 
来自:xingkong97, 时间:2007-10-16 16:11:09, ID:3843013
啊?怎么会呢?请你再说清楚些,你要实现什么样的功能?

我要实现像MSN,阿里旺旺那样传输文件的进度条
 
帮你顶一个,顺便发个交流群:
无论你是超极菜鸟,亦或是绝顶高手,在这里偶们静下心来平等地交流学习:
delphi交流群:4654765(delphi天堂)欢迎您的加入!让我们共同进步!!
加入者必须改名片为:{地点}+姓名 注:不改者勿扰!
 
为什么非要在聊天窗口里显示进度

像qq,在聊天窗口的右侧显示,既省事也不影响聊天
 
to 无俗则刚
因为有特别的原因,所以必须实现这样的功能.谢谢你的意见.
下面有一段从网上找的VC的例子,可是偶不懂VC,所以还请懂VC的帮忙转换成DELPHI,万分感谢,分数不够,另开贴再加!

VC原文如下:
有时候,我们需要在一个容器中插入各种不同的对象,比如,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();
}
}
7、运行效果图如下:


如果你有自己的控件,可以按上述的方法插入。
 
delphi群:23981160,爱好d的都来
 
to:ninsen
pb1.Parent:=RICHEDIT;
pb1.Top:=0;
pb1.Left:=0;

这样的方法进度条是插进去了,不过原来的RICHEDIT内容却不能正常运用了.
你可以调整它到合适的位置吧?

下面是在记事本里手工写的,会有错误,大概意思应该差不多
对话框CClientDlg类等原型你应该有吧?
function CClientDlg.InsertPolygon(lpRichEditOle: IRichEditOle): Boolean;
var
lpStorage: ^IStorage;//存储接口
lpOleObject: ^IOleObject;//OLE对象
lpLockBytes: LPLOCKBYTES;//LOCKBYTE
lpOleClientSite: ^IOleClientSite;
lpPolyCtl: ^IPolyCtl;//控件
clsid: CLSID;
reobject: REOBJECT;
hr: HRESULT;
bRet: Boolean;
begin
if (lpRIchEditOle = NULL) then
begin
result := False;
Exit;
end;
//创建PolyCtl对象并获取接口
hr := CoCreateInstance(CLSID_PolyCtl,NULL,CLSCTX_INPROC,IID_IPolyCtl,(^LPVOID)@lpPolyCtl);
if (lpPolyCtl = NULL) then
begin
result := False;
Exit;
end;

//USES_CONVERSION;
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); //判断断言,lpLockBytes是否为空.

hr := StgCreateDocfileOnILockBytes(lpLockBytes, //创建复合文档
STGM_SHARE_EXCLUSIVE or STGM_CREATE or STGM_READWRITE, 0, @lpStorage);
if (hr <> S_OK) then
begin
//VERIFY(lpLockBytes.Release() == 0);//ASSERT与VERIFY宏在Debug模式下作用基本一致
lpLockBytes := NULL;
AfxThrowOleException(hr);
end;

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);
except
On e:Exception do
ShowMessage(E.Message);
//TRACE在debug下有效
//TRACE(_T(&quot;OleException code:%d&quot;),e->m_sc);
//e->Delete();
bRet := FALSE;
end;
// release the interface
if( lpPolyCtl <> NULL ) then
lpPolyCtl.Release();
if( lpOleObject <> NULL ) then
lpOleObject.Release();
if( lpOleClientSite <> NULL ) then
lpOleClientSite.Release();
if( lpStorage <> NULL ) then
lpStorage.Release();
result := bRet;
end;
 
to bluesweet
对话框CClientDlg类等原型你应该有吧?没有.
看了还不是很明白,你有没有QQ,可否留下你的QQ:或者加我的QQ:52766942,这样方便交流,MSN也可以:HSRJ@example.com
 
为什么要显示传送文字的进度呢?又不是传送文件

richedit是ole组件,插入控件是会影响输入的,qq还有你给的vc例子都是dll实现的
 
to lovezyp
插入的如果是ACTIVEX就应该不会影响输入.本身就要显示文件传送的进度!
 
后退
顶部