Salut
Je sais d'avance que vous allez trouver ça c.. mais j'ai un problème pour utiliser les API dans un programme Delphi (suis loin d'être l'experte qu'on a pourtant confirmé).
J'ai coutume d'utiliser les API Windows dans des programmes VB6... d'où ma difficulté. Le problème c'est que c'est sans doute trop simple...
(de plus, il me semble avoir déjà posé la question, mais je ne trouve plus la discussion... sans doute qu'elle aura été flushée)
Voici
Il s'agit de la fonction SetWindowPos. Je l'ai déjà utilisé en VB pour faire en sorte qu'un fenêtre reste au dessus des autres sans empêcher celles-ci d'avoir le focus.
En VB, il faut déclarer une fonction de l'api (dans la section des déclaration) avant de pouvoir l'utiliser.
En Delphi, apparemment, non. A moins que je ne me sois gourée.
So (comme disent les angliches), j'ai un checkBox que s'il est coché cette fonction est activée, sinon la fenêtre se comporte normalement. Du moins, c'est ce qui devrait se passer.
Le code :
De plus, en VB, il faut explicitement déclarer les constantes HWND_TOPMOST et HWND_NOTOPMOST. J'ai donc essayé avec une déclaration de constante, et sans la déclaration. Avec, j'ai un message d'erreur. J'ai aussi essayé avec la syntaxe MajMin (Hwnd_TopMost, par exemple), et là non plus, pas de résultat...
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 procedure TFrmColorSelector.chbAuDessusClick(Sender: TObject); begin if chbAuDessus.Checked then begin SetWindowPos (handle, HWND_TOPMOST, Left, Top, Width, Height,0); // Et pour s'amuser... BorderStyle := bsNone; Height := lgHautMin; Color := clActiveCaption; AlphaBlend := true; AlphaBlendValue := 160 end else begin SetWindowPos (handle, HWND_NOTOPMOST, Left, Top, Width, Height,0); // Un peu de sérieux, tout de même... BorderStyle := bsSingle; Height := lgHautMax; Color := clBtnFace; AlphaBlend := true; AlphaBlendValue := 255 end end;
Alors, là, vraiment, je sais plus..
À titre indicatif, le code VB qui marche :
Oui, c'est vrai, il y a une différence.
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 Option Explicit Private Declare Function SetWindowPos Lib "user32" ( _ ByVal hwnd As Long, _ ByVal hWndInsertAfter As Long, _ ByVal x As Long, ByVal y As Long, _ ByVal cx As Long, ByVal cy As Long, _ ByVal wFlags As Long) As Long Private Const HWND_TOPMOST = -1 Private Const HWND_NOTOPMOST = -2 //'*** Fin des déclaration niveau module *** Private Function PositionForm(ByVal Feuille As Form, Optional PrePlan As Boolean = True) As Long Dim lgConst As Long If PrePlan Then lgConst = HWND_TOPMOST Else lgConst = HWND_NOTOPMOST End If PositionForm = SetWindowPos(Feuille.hwnd, lgConst, Feuille.Left \ Screen.TwipsPerPixelX, _ Feuille.Top \ Screen.TwipsPerPixelY, _ Feuille.Width \ Screen.TwipsPerPixelX, _ Feuille.Height \ Screen.TwipsPerPixelY, 0) End Function Private Sub Check1_Click() If Check1 Then PositionForm Form1, True Else PositionForm Form1, False End If End Sub
J'avais essayé aussi, en Delphi, de procéder de cette façon. Vu qu'un fonction, par définition, ça retourne une valeur. Évidemment, d'une modification à l'autre, je n'ai plus le code que j'avais alors tapé...et qui de toutes façons ne fonctionnait pas non plus.
Alors, si vous avez quelques pistes. Histoire de me désembrouiller.
Partager