深入浅出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++里面没有什么不一样的地方。

猜你喜欢

转载自blog.csdn.net/baita96/article/details/89735295
今日推荐