J'utilise Delphi 6 Personal Edition sous Windows W10, toutes mises ç jour faites.
J'ai un programme princial avec un composant TImage sur Form1. J'y dessine une ellipse dans le code de création de Form1 - ça marche bien.
J'ai aussi une DLL dont j'appelle une fonction en lui passant Tmage1.Canvas.Handle en paramètre.
J'ai vérifié - le bon HDC arrive bien dans la fonction DLL.
Dans cette fonction, je crée un TCanvas et j'affecte le HDC passé en paramètre via Canvas.Handle. L'affectation se passe bien et la valeur est bonne.
Maintenant, je veux dessiner dans ce canvas à l'intérieur de ma fonction DLL. J'y dessine simplement un rectangle.
Puis, je fais un Canvas.Refresh, je mets le Canvas.Handle à zéro, puis je libère le canvas dans la DLL.
Finalement, je quitte la fonction.
Or, le dessin effectué dans la DLL n'est pas visible dans Image1 de Form1. Pourquoi ?
J'ai pourtant suivi
Au retour de la fonction DLL, je dessine un trait oblique dans le canvas à l'intérieur du programme principal et ce trait s'affiche.
Voici le programme principal dans la Form1 qui contient juste un TImage et un TButton:
Voici le code de la DLL qui ne contient qu'une petite fonction dont le but est de dessiner un rectangle sur le TIage de la Form1
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 library KGF; uses SysUtils, Graphics, Dialogs, Classes; {$R *.res} function TestScalableGraphic(aHandle: pinteger; aWidth, aHeight: integer): integer; stdcall; export; var canvas: TCanvas; begin result := -1; try canvas := TCanvas.Create; canvas.Handle := aHandle^; canvas.Rectangle(200,200,400,200); canvas.Refresh; canvas.Handle := 0; canvas.Free; result := 0; except end; end; exports TestScalableGraphic; begin end.
Mode d'emploi:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; type TForm1 = class(TForm) Image1: TImage; Button1: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private { Déclarations privées } public { Déclarations publiques } end; Type TestScalableGraphic = function (aHCanvas: pinteger; aWidth, aHeight: integer): integer; stdcall; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin Image1.Canvas.Brush.Color := clWhite; Image1.Canvas.Pen.Color := clWhite; Image1.Canvas.FillRect(Rect(0,0,Image1.Width,Image1.Height)); Image1.Canvas.Pen.Color := clBlack; Image1.Canvas.Ellipse(100,100,300,200); end; procedure TForm1.Button1Click(Sender: TObject); var res: integer; hCanvas: integer; HInst: THandle; FPointer: TFarProc; MyFunct: TestScalableGraphic; begin hCanvas := Image1.Canvas.Handle; HInst := SafeLoadLibrary('KGF.dll'); if HInst > 0 then begin try FPointer := GetProcAddress(HInst,'TestScalableGraphic'); if FPointer <> nil then begin MyFunct := TestScalableGraphic(FPointer); res := MyFunct(@hCanvas,Image1.Width,Image1.Height); Image1.Canvas.MoveTo(20,20); Image1.Canvas.LineTo(300,100); end else ShowMessage(' TestScalableGraphic DLL function not found'); finally FreeLibrary(HInst); end end else ShowMessage('KGF.dll library not found'); end; end.
au lancement du programme Project1.exe, le composant Image1 montre bien l'ellipse dessinée dans le code de création de Form1.
Un clic surle bouton libellé "Go" devrait dessiner un rectange - or celui-ci n'apparaît pas.
Puis on essine une ligne oblique qui, elle par contre, apparaît bien.
Question: pourquoi est-ce que je ne peux pas dessiner sur le canvas de Image1 à partir de la DLL ?
Ci-joint un ZIP avec les deux projets.
Partager