RichEdit中显示JPG,BMP图片(20分)

  • 主题发起人 主题发起人 assuredness
  • 开始时间 开始时间
A

assuredness

Unregistered / Unconfirmed
GUEST, unregistred user!
请问如何在RichEdit中显示图片?
谁可以给我段代码参考呀?
谢谢!
 
帮你顶一下,我也不没有搞过
 
用richedit98
 
可下载RXRichEdit。
RXRichEdit为图文显示控件,
在word中用web版式编辑文字图片(像编辑网页文件),
将编辑好的文件存为 XXX.rft格式,
将.rft文件Load到RXRichEdit中,
RXRichEdit就可以显示你编辑好的文本和图片了。
也可以将.rft文件装入数据库,
用RXRichEdit显示。
 
RxLib
TRxRichEdit
 
如果不用其它控件就用richedit这个控件不能实现吗?
 
我以前看到过的,你可以去查一下Delphi图象编程,你或着看一下richedit有没有CANVANS属性。有用COPYCANVANS()试一下,我在From上试过的!![:)]
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1336602
 
问题: 实现插入BMP图片到RichEdit中? ( 积分: 100 )
分类: 局域网 / 通讯

来自: nest, 时间: 2002-11-12 11:17:00, ID: 1426709
下面的程序可以实现插入BMP图片到RichEdit中,不过要直接插入BMP文件,不知道要如何改造成直接插入TBitmap变量。
改造的关键把函数OleCreateFromFile改造成OleCreateFromData。
如果能解决,分数加倍!
unit InsRich;
interface
uses
...ActiveX;
const
REO_CP_SELECTION = ULONG(-1);
REO_BELOWBASELINE = $00000002;
REO_RESIZABLE = $00000001;
REO_STATIC = $40000000;
EM_GETOLEINTERFACE = WM_USER + 60;
IID_IUnknown: TGUID = (D1:$00000000;D2:$0000;D3:$0000;D4:($C0,$00,$00,$00,$00,$00,$00,$46));
IID_IOleObject: TGUID = (D1:$00000112;D2:$0000;D3:$0000;D4:($C0,$00,$00,$00,$00,$00,$00,$46));
type
_ReObject = record
cbStruct: DWORD; { Size of structure }
cp: ULONG; { Character position of Object }
clsid: TCLSID; { Class ID of Object }
pOleObj: IOleObject; { Ole Object interface }
pstg: IStorage; { Associated storage interface }
pOleSite: IOleClientSite; { Associated Client Site interface }
sizel: TSize; { Size of Object (may be 0,0) }
dvAspect: Longint; { Display aspect to use }
dwFlags: DWORD; { Object status flags }
dwUser: DWORD; { Dword for user's use }
end;
TReObject = _ReObject;
TCharRange = record {Copy From RichEdit.pas}
cpMin: Integer;
cpMax: Integer;
end;
TFormatRange = record
hdc: Integer;
hdcTarget: Integer;
rectRegion: TRect;
rectPage: TRect;
chrg: TCharRange;
end;
IRichEditOle = interface(System.IUnknown)
['{00020d00-0000-0000-c000-000000000046}']
function GetClientSite(out ClientSite: IOleClientSite): HResult; stdcall;
function GetObjectCount: HResult; stdcall;
function GetLinkCount: HResult; stdcall;
function GetObject(iob: Longint; out ReObject: TReObject; dwFlags: DWORD): HResult; stdcall;
function InsertObject(var ReObject: TReObject): HResult; stdcall;
function ConvertObject(iob: Longint; rclsidNew: TIID;lpstrUserTypeNew: LPCSTR): HResult; stdcall;
function ActivateAs(rclsid: TIID; rclsidAs: TIID): HResult; stdcall;
function SetHostNames(lpstrContainerApp: LPCSTR; lpstrContainerObj: LPCSTR): HResult; stdcall;
function SetLinkAvailable(iob: Longint; fAvailable: BOOL): HResult; stdcall;
function SetDvaspect(iob: Longint; dvaspect: DWORD): HResult; stdcall;
function HandsOffStorage(iob: Longint): HResult; stdcall;
function SaveCompleted(iob: Longint; const stg: IStorage): HResult; stdcall;
function InPlaceDeactivate: HResult; stdcall;
function ContextSensitiveHelp(fEnterMode: BOOL): HResult; stdcall;
function GetClipboardData(var chrg: TCharRange; reco: DWORD; out dataObj: IDataObject): HResult; stdcall;
function ImportDataObject(dataObj: IDataObject; cf: TClipFormat; hMetaPict: HGLOBAL): HResult; stdcall;
end;
function InsertBitmap(Editor: TRxRichEdit; BmpFile: String): Boolean;

implementation

function InsertBitmap(Editor: TRxRichEdit; BmpFile: String): Boolean;
var
FRTF: IRichEditOle;
FOle: IOleObject;
FormatEtc: tagFormatETC;
FStorage: ISTORAGE;
FClientSite: IOleClientSite;
FLockBytes: ILockBytes;
ReObject: TReObject;
xt: TGuid;
FTemp: IUnknown;
begin
Result:=false;
if not FileExists(BmpFile) then Exit;
try
SendMessage(Editor.Handle, em_GetOleInterFace, 0, LongInt(@FRTF));
if not Assigned(FRTF) then Exit;
if CreateILockBytesOnHGlobal(0,true,FLockBytes)<>S_OK then Exit;
if StgCreateDocfileOnILockBytes(FLockBytes,STGM_SHARE_EXCLUSIVE or STGM_CREATE or STGM_READWRITE,0,FStorage)<>S_OK then Exit;
FormatEtc.cfFormat:=0;
FormatEtc.ptd:=nil;
FormatEtc.dwAspect:=DVASPECT_CONTENT;
FormatEtc.lindex:=-1;
FormatEtc.tymed:=TYMED_NULL;
FRTF.GetClientSite(FClientSite);
//从文件中创建一个Ole对象
if OleCreateFromFile(GUID_NULL,PWideChar(WideString(BmpFile)),IID_IUnknown,0,@FormatEtc,FClientSi

来自: 爱元元的哥哥, 时间: 2002-12-08 19:01:00, ID: 1494674
用rxRichEdit,在rxLib中

来自: nest, 时间: 2002-12-09 9:42:00, ID: 1495405
可能是我表达不是很清除,之所以采用这种方法是因为这样插入的图片不能被更改大小,而其他的方法(比如BmpToRtf、或粘贴到RxRichEdit)插入的图片则可以被鼠标拖动改变大小!

来自: 张无忌, 时间: 2002-12-09 9:43:00, ID: 1495410
用RX,如果是做数据库用IP

来自: nest, 时间: 2002-12-09 9:48:00, ID: 1495432
关于如何在RichEdit中插入图片的技术,目前我掌握的3种方法,但好像只有这种方法所插入的图片不能被改变大小。
对于使用RxRichEdit的,如果能让插入的图片也不能改变大小,则同样算解决我的问题!
请参考:http://www.delphibbs.com/delphibbs/dispq.asp?lid=1421080

来自: yb33, 时间: 2003-06-17 9:04:00, ID: 1957735
这种方法插入图片的速度很慢,有明显的停顿感觉

来自: iseek, 时间: 2003-07-04 15:24:00, ID: 2003131
to nest
我试了你的代码,可以插入图片,而且,图片也保存到文件里了。但是,我用Delphi带的
RichEdit打开文件时,不能显示图片,但我用WORD打开时却可以。请问这是怎么回事?
如果你能帮我解决用RichEdit显示图片的问题,我愿出300分答谢你。还有,你如有武汉
来,我请你喝酒。:-)

来自: aolo, 时间: 2003-07-04 15:29:00, ID: 2003148
做一个能够放图像的RichEdit并不难, 只需要继承一个TRichEdit, 将csAcceptsControls
加入到它的ControlStyle中即可作为Parent容纳其他控件了.

难的是处理文字环绕及滚动时候控件的的位置.



来自: aolo, 时间: 2003-07-04 15:30:00, ID: 2003151
以下是我把一幅位图和一些文字都有放在一起的一些语句

var
pic:Trect;
map:Tbitmap;
...
implementation

......
image1.canvas.textout(50,x-50,'字幕标题'); { 列,行,‘内容’}
image1.canvas.font.size:=20;
image1.canvas.font.color:=$120000ff;
pic.topleft.x:=150; //位图的横坐标点
pic.topleft.Y:=tt; //位图的纵坐标点
pic.bottoMright.x:=pic.topleft.x+200; {位图宽}
pic.bottoMright.y:=pic.topleft.y+130; {位图高}
image1.canvas.strEtchdraw(pic,map);
....
image1.Canvas.Brush.Style := bsClear;
//使后背景不受文字破坏(无白色)

pic:=rect(0,0,image1.width,image1.height);
image1.canvas.fillRect(pic);
pic:=rect(-1,-1,1,1);
map:=Tbitmap.create;
map.loadfromFile('c:/windows/Clouds.bmp');
image1.canvas.stretchdraw(pic,map);



来自: shaga, 时间: 2003-12-22 22:01:00, ID: 2370148
请问nest找出了不能改变大小的好方法没?

我试过你的方法,虽然不可以该大小,但是双击图片时会打开画板,可以编辑图片。

问题讨论没有结束 ...
 
问题: 如何在richedit中插入图片 ( 积分: 50 )
分类: 控件 - 开发

来自: 涛子_1966, 时间: 2004-05-12 22:47:00, ID: 2606933
如何在richedit中插入图片
rxrichedit中插入图片可以的,要插入视频,则不行,似乎是链接,打开时需要原文件,
请问有什么办法?(我不希望打包,打包太大)


来自: netfun2000, 时间: 2004-05-12 23:21:51, ID: 2606969
到playicq去下一个richedit2控件。


来自: 涛子_1966, 时间: 2004-05-12 23:24:18, ID: 2606974
找不到啊

来自: zhangpanfeng, 时间: 2004-05-13 0:25:31, ID: 2607014
在richedit中插入图片可以用RXLib里的RxRichedit控件
到 www.51delphi.net 去下载 rxlib套件


来自: netfun2000, 时间: 2004-05-13 8:52:04, ID: 2607169
RichEdit3.01 for D7
http://www.playicq.com/down_file.php?id=14969


来自: netfun2000, 时间: 2004-05-13 8:53:23, ID: 2607172
补充一下,delphi5、6、7都能用。


来自: 涛子_1966, 时间: 2004-05-14 3:40:25, ID: 2609110
rxrichedit中插入图片可以的,要插入视频,则不行,似乎是链接,打开时需要原文件,
请问有什么办法?(我不希望打包,打包太大)

来自: netfun2000, 时间: 2004-05-16 9:45:26, ID: 2612372
找lmd v7
很好用。


来自: wqhatnet, 时间: 2004-05-16 9:53:59, ID: 2612381
Richedit中插入图片

uses

RichEdit;

// Stream Callback function

type

TEditStreamCallBack = function(dwCookie: Longint; pbBuff: PByte;

cb: Longint; var pcb: Longint): DWORD;

stdcall;

TEditStream = record

dwCookie: Longint;

dwError: Longint;

pfnCallback: TEditStreamCallBack;

end;

// RichEdit Type

type

TMyRichEdit = TRxRichEdit;

// EditStreamInCallback callback function

function EditStreamInCallback(dwCookie: Longint; pbBuff: PByte;

cb: Longint; var pcb: Longint): DWORD; stdcall;

// by P. Below

var

theStream: TStream;

dataAvail: LongInt;

begin

theStream := TStream(dwCookie);

with theStream do

begin

dataAvail := Size - Position;

Result := 0;

if dataAvail <= cb then

begin

pcb := read(pbBuff^, dataAvail);

if pcb <> dataAvail then

Result := UINT(E_FAIL);

end

else

begin

pcb := read(pbBuff^, cb);

if pcb <> cb then

Result := UINT(E_FAIL);

end;

end;

end;

// Insert Stream into RichEdit

procedure PutRTFSelection(RichEdit: TMyRichEdit; SourceStream: TStream);

// by P. Below

var

EditStream: TEditStream;

begin

with EditStream do

begin

dwCookie := Longint(SourceStream);

dwError := 0;

pfnCallback := EditStreamInCallBack;

end;

RichEdit.Perform(EM_STREAMIN, SF_RTF or SFF_SELECTION, Longint(@EditStream));

end;

// Convert Bitmap to RTF Code

function BitmapToRTF(pict: TBitmap): string;

// by D3k

var

bi, bb, rtf: string;

bis, bbs: Cardinal;

achar: ShortString;

hexpict: string;

I: Integer;

begin

GetDIBSizes(pict.Handle, bis, bbs);

SetLength(bi, bis);

SetLength(bb, bbs);

GetDIB(pict.Handle, pict.Palette, PChar(bi)^, PChar(bb)^);

rtf := '{{';

SetLength(hexpict, (Length(bb) + Length(bi)) * 2);

I := 2;

for bis := 1 to Length(bi) do

begin

achar := Format('%x', [Integer(bi[bis])]);

if Length(achar) = 1 then

achar := '0' + achar;

hexpict[I - 1] := achar[1];

hexpict := achar[2];

Inc(I, 2);

end;

for bbs := 1 to Length(bb) do

begin

achar := Format('%x', [Integer(bb[bbs])]);

if Length(achar) = 1 then

achar := '0' + achar;

hexpict[I - 1] := achar[1];

hexpict := achar[2];

Inc(I, 2);

end;

rtf := rtf + hexpict + ' }}';

Result := rtf;

end;

 

// Example to insert image from Image1 into RxRichEdit1

procedure TForm1.Button1Click(Sender: TObject);

var

SS: TStringStream;

BMP: TBitmap;

begin

BMP := TBitmap.Create;

BMP := Image1.Picture.Bitmap;

SS := TStringStream.Create(BitmapToRTF(BMP));

try

PutRTFSelection(RxRichEdit1, SS);

finally

SS.Free;

end;

end;

****************************************

下面的代码可以不调用那个InsertObject的对话框而直接插入一张图片:

var

Bmp:TBitmap;

begin

if not OpenPictureDialog1.Execute then exit;

Bmp:=TBitmap.Create;

Bmp.LoadFromFile(OpenPictureDialog1.FileName);

Clipboard.Assign(BMP);

RxRichEdit201.PasteFromClipboard;

Bmp.Free;

end;

**************************************

: TechnoFantasy(www.applevb.com)

RichEdit中,插入图片

代码:

procedure proPrintRTFWithBMP(strCaption,strPic,strTitle:string;rtf:TRichEdit);

{strText为要打印的文本 strCaption为打印标题 strPic为图像文件目录

strTitle为要显示在图像右侧的图像标题}

var

FRTF:IRichEditOle;

FOLE:IOLEObject;

formatEtc:tagFORMATETC;

FStorage :ISTORAGE;

FClientSite:IOLECLIENTSITE;

FLockBytes:ILockBytes;

ReObject:TReObject;

xt:TGuid;

FTemp:IUnknown;

strTemp:string;

bCreateNew:boolean;

ABMP:TBitmap;

Ajpeg:TJpegImage;

i:Longint;

begin

// rtfTemp:=TRichEdit.Create(frmPrintFrame);

try

{ with rtfTemp do

begin

Parent := frmPrintFrame;

width:=200;

height:=200;

visible:=false;

Text := strText;

end; }

//图片文件不存在,直接打印文本并退出

if not fileexists(strPic)then

begin

PrintRichEdit(strCaption,rtf);

exit;

end;

abmp:=TBitmap.Create;

ajpeg:= TJpegImage.Create;

try

if ExtractFileExt(strPic)='.jpg' then

begin

bCreateNew:=true;

ajpeg.LoadFromFile(strPic);

abmp.Assign(ajpeg);

strTemp:=ExtractFilePath(strPic)+'0099www.bmp';

abmp.SaveToFile(strTemp);

for i:=1 to 30000 do

application.ProcessMessages;

end

else

strTemp:= strPic;

finally

abmp.Free;

ajpeg.free;

abmp:=nil;

ajpeg:=nil;

end;

sendmessage(rtf.handle,EM_GETOLEINTERFACE,0,LongInt(@FRTF));

if not assigned(FRTF)then

begin

showmessage('Error to get Richedit OLE interface');

exit;

end;

//建立一个可以访问全局内存的Byte数组 FLockBytes

//返回ILockBytes接口

if CreateILockBytesOnHGlobal(0,true,FLockBytes)<>S_OK then

begin

showmessage('Error to create Global Heap');

exit;

end;

//建立一个混合文档存取对象

if StgCreateDocfileOnILockBytes(FLockBytes,STGM_SHARE_EXCLUSIVE or

STGM_CREATE or STGM_READWRITE,0,FStorage)<>S_OK then

begin

showmessage('Error to create storage');

exit;

end;

 

formatEtc.cfFormat := 0;

FormatEtc.ptd := nil;

FormatEtc.dwAspect := DVASPECT_CONTENT;

FormatEtc.lindex := -1;

FormatEtc.tymed := TYMED_NULL;

FRTF.GetClientSite(FClientSite);

//从文件中创建一个OLE对象

if OleCreateFromFile(GUID_NULL,PWideChar(WideString(strTemp)),IID_IUnknown,0,@formatEtc,

FClientSite,FStorage,FOLE)<>S_OK then

begin

showmessage('Error');

exit;

end;

//现在的FOLE还是一个IUnKnown接口,将其转换为一个 IOleObject接口

FTemp:=FOLE;

FTemp.QueryInterface(IID_IOleObject, FOle);

OleSetContainedObject(FOle, TRUE);

 

//step 2

reobject.cbStruct := sizeof(TReObject);

FOLE.GetUserClassID(xt);

ReObject.clsid := xt;

reobject.cp := ULong(REO_CP_SELECTION);

reobject.dvaspect := DVASPECT_CONTENT;

reobject.dwFlags := ULong(REO_RESIZABLE) or ULong(REO_BELOWBASELINE);

reobject.dwUser := 0;

reobject.poleobj := FOle;

reobject.polesite := FClientSite;

reobject.pstg := FStorage;

reobject.sizel.cx := 0;

reobject.sizel.cy := 0;

FRTF.InsertObject(reobject);

PrintRichEdit(strCaption,rtf);

finally

if bCreateNew then

Deletefile(strTemp);

FRTF:=nil;

FOLE:=nil;

end;

end;

上面的代码是一个在RTF控件当前位置插入图像并打印的,你运行上面的代码需要首先引用

ActiveX, ComObj, RichEdit, Jpeg

并且将PrintRichEdit(strCaption,rtf);去掉

以下的结构是需要手工加入的:

type

_ReObject = record

cbStruct: DWORD; { Size of structure }

cp: ULONG; { Character position of object }

clsid: TCLSID; { Class ID of object }

poleobj: IOleObject; { OLE object interface }

pstg: IStorage; { Associated storage interface }

polesite: IOleClientSite; { Associated client site interface }

sizel: TSize; { Size of object (may be 0,0) }

dvAspect: Longint; { Display aspect to use }

dwFlags: DWORD; { Object status flags }

dwUser: DWORD; { Dword for user's use }

end;

TReObject = _ReObject;

type

IRichEditOle = interface(IUnknown)

['{00020d00-0000-0000-c000-000000000046}']

function GetClientSite(out clientSite: IOleClientSite): HResult; stdcall;

function GetObjectCount: HResult; stdcall;

function GetLinkCount: HResult; stdcall;

function GetObject(iob: Longint; out reobject: TReObject;

dwFlags: DWORD): HResult; stdcall;

function InsertObject(var reobject: TReObject): HResult; stdcall;

function ConvertObject(iob: Longint; rclsidNew: TIID;

lpstrUserTypeNew: LPCSTR): HResult; stdcall;

function ActivateAs(rclsid: TIID; rclsidAs: TIID): HResult; stdcall;

function SetHostNames(lpstrContainerApp: LPCSTR;

lpstrContainerObj: LPCSTR): HResult; stdcall;

function SetLinkAvailable(iob: Longint; fAvailable: BOOL): HResult; stdcall;

function SetDvaspect(iob: Longint; dvaspect: DWORD): HResult; stdcall;

function HandsOffStorage(iob: Longint): HResult; stdcall;

function SaveCompleted(iob: Longint; const stg: IStorage): HResult; stdcall;

function InPlaceDeactivate: HResult; stdcall;

function ContextSensitiveHelp(fEnterMode: BOOL): HResult; stdcall;

function GetClipboardData(var chrg: TCharRange; reco: DWORD;

out dataobj: IDataObject): HResult; stdcall;

function ImportDataObject(dataobj: IDataObject; cf: TClipFormat;

hMetaPict: HGLOBAL): HResult; stdcall;

end;

Type TCharRange=record

cpMin:integer;

cpMax:integer;

End;

Type TFormatRange=record

hdc : Integer;

hdcTarget:integer;

rectRegion:trect;

rectPage:trect;

chrg : TCharRange;

End;

************************************

以下不通过剪切板而直接在Richedit中插入一张图片:

var

frmMain: TfrmMain;

implementation

{$R *.DFM}

{$R Smiley.res}

uses

RichEdit;

type

TEditStreamCallBack = function(dwCookie: Longint; pbBuff: PByte;

cb: Longint; var pcb: Longint): DWORD;

stdcall;

TEditStream = record

dwCookie: Longint;

dwError: Longint;

pfnCallback: TEditStreamCallBack;

end;

type

TMyRichEdit = TRxRichEdit;

// EditStreamInCallback callback function

function EditStreamInCallback(dwCookie: Longint; pbBuff: PByte;

cb: Longint; var pcb: Longint): DWORD; stdcall;

var

theStream: TStream;

dataAvail: LongInt;

begin

theStream := TStream(dwCookie);

with theStream do

begin

dataAvail := Size - Position;

Result := 0;

if dataAvail <= cb then

begin

pcb := read(pbBuff^, dataAvail);

if pcb <> dataAvail then

Result := UINT(E_FAIL);

end

else

begin

pcb := read(pbBuff^, cb);

if pcb <> cb then

Result := UINT(E_FAIL);

end;

end;

end;

// Insert Stream into RichEdit

procedure PutRTFSelection(RichEdit: TMyRichEdit; SourceStream: TStream);

var

EditStream: TEditStream;

begin

with EditStream do

begin

dwCookie := Longint(SourceStream);

dwError := 0;

pfnCallback := EditStreamInCallBack;

end;

RichEdit.Perform(EM_STREAMIN, SF_RTF or SFF_SELECTION, Longint(@EditStream));

end;

// Load a smiley image from resource

function GetSmileyCode(ASimily: string): string;

var

dHandle: THandle;

pData, pTemp: PChar;

Size: Longint;

begin

pData := nil;

dHandle := FindResource(hInstance, PChar(ASimily), RT_RCDATA);

if dHandle <> 0 then

begin

Size := SizeofResource(hInstance, dHandle);

dhandle := LoadResource(hInstance, dHandle);

if dHandle <> 0 then

try

pData := LockResource(dHandle);

if pData <> nil then

try

if pData[Size - 1] = #0 then

begin

Result := StrPas(pTemp);

end

else

begin

pTemp := StrAlloc(Size + 1);

try

StrMove(pTemp, pData, Size);

pTemp[Size] := #0;

Result := StrPas(pTemp);

finally

StrDispose(pTemp);

end;

end;

finally

UnlockResource(dHandle);

end;

finally

FreeResource(dHandle);

end;

end;

end;

procedure InsertSmiley(ASmiley: string);

var

ms: TMemoryStream;

s: string;

begin

ms := TMemoryStream.Create;

try

s := GetSmileyCode(ASmiley);

if s <> '' then

begin

ms.Seek(0, soFromEnd);

ms.Write(PChar(s)^, Length(s));

ms.Position := 0;

PutRTFSelection(frmMain.RXRichedit1, ms);

end;

finally

ms.Free;

end;

end;

procedure TfrmMain.SpeedButton1Click(Sender: TObject);

begin

InsertSmiley('Smiley1');

end;

procedure TfrmMain.SpeedButton2Click(Sender: TObject);

begin

InsertSmiley('Smiley2');

end;

// Replace a :-) or :-( with a corresponding smiley

procedure TfrmMain.RxRichEdit1KeyPress(Sender: TObject; var Key: Char);

var

sCode, SmileyName: string;

procedure RemoveText(RichEdit: TMyRichEdit);

begin

with RichEdit do

begin

SelStart := SelStart - 2;

SelLength := 2;

SelText := '';

end;

end;

begin

If (Key = ')') or (Key = '(') then

begin

sCode := Copy(RxRichEdit1.Text, RxRichEdit1.SelStart-1, 2) + Key;

SmileyName := '';

if sCode = ':-)' then SmileyName := 'Smiley1';

if sCode = ':-(' then SmileyName := 'Smiley2';

if SmileyName <> '' then

begin

Key := #0;

RemoveText(RxRichEdit1);

InsertSmiley('Smiley1');

end;

end;

end;




来自: www.eVget.com, 时间: 2004-05-16 11:33:33, ID: 2612496
这个控件:http://www.evget.com/view/viewProductInfo.asp?productId=110
由你需要的所有功能!

问题讨论没有结束 ...
 
后退
顶部