Problème d'API SetWindowPos
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... :marteau:
(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 :
Code:
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; |
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...
Alors, là, vraiment, je sais plus..
:arf:
À titre indicatif, le code VB qui marche :
Code:
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 |
Oui, c'est vrai, il y a une différence.
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é... :oops: et qui de toutes façons ne fonctionnait pas non plus.
Alors, si vous avez quelques pistes. Histoire de me désembrouiller.