深入浅出CChart 每日一课——快乐高四第三十一课 再上光明顶,Delphi直接调用Dll版的CChart
作者:互联网
前面介绍了ActiveX控件版的CChart在Delphi中的应用。其实,对于Delphi这么强大的工具,完全可以不用ActiveX,直接用Dll版的CChart。下面给出一个简单的例子。
Delphi使用的语言是Object Pascal,CChart用的语言是C++,C++的类接口无法在Delphi下使用。但是,通过Dll,Delphi可以调用C++的函数,这样我们前面提到的C风格代码又可以发挥作用了。
Object Pascal中C++函数声明格式如下:
Function FunName(i:integer): integer; cdecl; external ‘aaa.dll’; name ’realName’
Procedure FunName(i:integer); cdecl; external ‘aaa.dll’; name ’realName’
其中realName是函数在Dll中的实际名称。在CChart发行版中,实际名称需要到CChartu_EXPORTS.txt这个文件中查询。
下面正式开始。
第一步,打开Delphi7,将自动建立Form1窗体。点击菜单“File”->“Save Project As…”,保存文件LessonA31文件夹。
第二步,通过Object Inspector添加Form1的OnCreate函数、OnDestroy函数和OnResize函数。
第三步,在Unit1.pas文件里,{$R *.dfm}的下一行,添加函数导入代码。
procedure CreateChart(); cdecl; external 'CChartu.dll' name '?CreateChart@Classless@@YAXXZ'
procedure DestroyChart(); cdecl; external 'CChartu.dll' name '?DestroyChart@Classless@@YAXXZ'
function Attach(hWnd:HWND):integer; cdecl; external 'CChartu.dll' name '?Attach@Classless@@YAHPAUHWND__@@@Z'
function SetType(charttype:integer):boolean; cdecl; external 'CChartu.dll' name '?SetType@Classless@@YA_NH@Z'
procedure SetFieldFcn(field:FieldFunction); cdecl; external 'CChartu.dll' name '?SetFieldFcn@Classless@@YAXP6ANNN@Z@Z'
procedure SetPlotRange(x1:double; x2:double; y1:double; y2:double); cdecl; external 'CChartu.dll' name '?SetPlotRange@Classless@@YAXNNNN@Z'
procedure SetTitle(title:PWideChar); cdecl; external 'CChartu.dll' name '?SetTitle@Classless@@YAXPB_W@Z'
function SetConfineRect(rect:TRect):Boolean; cdecl; external 'CChartu.dll' name '?SetConfineRect@Classless@@YA_NUtagRECT@@@Z'
procedure ReDraw(); cdecl; external 'CChartu.dll' name '?ReDraw@Classless@@YAXXZ
这里导入了CChartu.dll文件中的一些函数,后面将用到。同样,这是这里工作量的最大头。
这里,我们需要把CChart发行包里的CChartu.dll文件拷贝到LessonA31文件夹。
第四步,在上面代码的前面,添加一个函数指针的定义。
type
FieldFunction=function(x:double; y:double):double;cdecl;
第五步,编写场函数。
function fieldfcn(x:double; y:double):double;cdecl;
begin
fieldfcn:=1.0/(x*x + y*y + 1.0);
end;
第六步,完成OnCreate函数。
procedure TForm1.FormCreate(Sender: TObject);
begin
CreateChart();
Attach(Handle);
SetType(6);
SetTitle('Delphi标题');
SetFieldFcn(@fieldfcn);
SetPlotRange(-2.0, 2.0, -2.0, 2.0);
end;
注意到,Handle就是主窗体的句柄。
第七步,完成OnDestroy函数。
procedure TForm1.FormDestroy(Sender: TObject);
begin
DestroyChart();
end;
第八步,完成OnResize函数。
procedure TForm1.FormResize(Sender: TObject);
var
lpRect: TRect;
begin
Windows.GetClientRect(Handle, lpRect);
SetConfineRect(lpRect);
ReDraw();
end;
最后的效果如图。
可以看到,效果和C++里面没有什么不一样的地方。
标签:CChart,name,cdecl,double,光明顶,dll,external,Dll,CChartu 来源: https://blog.csdn.net/baita96/article/details/89735295