Salut, je suis en train de créer un composant qui necessite d'intercepter un message en direction de la form ( WM_NCPAINT) comment puis je faire.
De plus, comment je peux changer de la barre de titre ou a defaut déplacer le menu.
Merci.
Salut, je suis en train de créer un composant qui necessite d'intercepter un message en direction de la form ( WM_NCPAINT) comment puis je faire.
De plus, comment je peux changer de la barre de titre ou a defaut déplacer le menu.
Merci.
Tu veux changer ta barre de titre? pour quoi faire exactement...?
Si tu veux changer son look, tu peux soit utiliser un composant ki change le skin de ta fenetre, soit supprimer ta barre de titre, et en créer une toi meme, sur mesure, ou tu affiche le titre et ou tu peux placer les boutons (fermer, reduire, etc...) ou tu veux exactement
Je sais pas si j'ai repondu a ta question...
++
c'est effectivement ça, mais je ne souhaite pas passer par un composant de skin, d'abord parce q'ils sont payant, ensuite parceque je controle rien , 'est pour ça que j'ai entrepris de le faire moi même mais là ou je bloque c'est que je veux changer la taille de la barre de titre( l'agrandir en hauteur) mais j'y arrive pas et pourtant je sais que c'est faisable, SUISkin le fait.Envoyé par Neo82
Ce que tu peux faire, c'est de supprimer completment ta barre de titre (il me semble que c'est possible avec Delphi)
Ensuite tu utilise le haut de ton composant form (ta fenetre koi....) pour placer un composant "label" qui contient "form.title" (il me semble que c'est ca...) et des boutons, à l'endroit ou tu le desire (comme ca c'est encore plus personnalisé), pour fermer agrandir et reduire ta form
Enfin, tu différencie cette nouvelle barre de titre du reste de ta form en posant le tout sur un composant "panel", qui va contenir comme image de backgroung l'image de ton choix...
Voila, tu as une toute nouvelle barre de titre
A+
Oui, je connais cette technique, c'est celle que j'utilisais jusqu'a présent mais je trouve que c'est du "bricolage", ça t'oblige a crer des TImage & co pour rien et je suis obligé de refaire cette présentation a chaque fois que je fais une nouvelle appli, à l'aide d'un composant c'est plus simple et rapide.
C'est sur que c'est de la bricole :)
Tu peux a ce compte la essayer de faire toi meme un composant, qui repondra alors a toutes tes attentes!!
C'est justement ce que je suis en train de faire et je bloque sur cette interception du message WM_NCPAINT de la form sur laquelle je pose mon compo.
Salut lil_jam63!
Salut tous le monde!
J'ai réalisé mon jeu d'Echecs un peu comme ça, sans barre de titre, et mes propres boutons en haut à droite... Pour déplacer la "form" (qui est un TPanel en réalité), il suffit de cliquer n'importe où sur celui-ci, déplacer et relacher la souris. Par contre, je n'ai pas rajouté une barre de titre, mais si j'avais dû, j'aurais utiliser un TImage + un TLabel probablement.
Si tu es intérressé par cette "form", demande-moi. Je dois tout de même t'avertir que cela ajoute pas mal de code et l'utilisation de quelques évènements du genre OnMouseMove, OnMouseDown, OnMouseUp, ... à+
Merci de ta proposition Sub0 mais c'est exactement ce que j'utilisais déja, et comme j'ai dis un peu plus haut, je trouve que c'est du bricolage, j'ai étudié le comportement de SUISkin et je pense avoir trouvé quasiment tout ce qui m'interesse, le seul obstacle est que je n'arrive pas a intercepter ce message justement.
Pour intercepter les messages, par exemple...
Mais ça n'a pas l'air de fonctionner avec WM_NCPAINT... non?
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 UNIT Unit1; INTERFACE USES Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls, Forms,Dialogs,StdCtrls; TYPE TForm1=CLASS(TForm) PROCEDURE ProcMess(var msg:TMsg; Var Handled:Boolean); PROCEDURE FormCreate(Sender:TObject); END; VAR Form1:TForm1; {----------------------------------------------------------------} { }IMPLEMENTATION{ } {----------------------------------------------------------------} {$R *.DFM} {----------------------------------------------------------------} PROCEDURE TForm1.ProcMess(var msg:TMsg; Var Handled:Boolean); BEGIN IF(msg.Message=WM_RBUTTONDOWN)THEN Close; END; {----------------------------------------------------------------} PROCEDURE TForm1.FormCreate(Sender:TObject); BEGIN Application.OnMessage:=Form1.ProcMess; END; {----------------------------------------------------------------} END.![]()
En fait, je me suis mal exprimé Sub0, je cherche à intercepter le message WM_NCPAINT de la form sur laquelle mon composant est posé et celà a partir de mon composant directement et c'est là que ça se complique, pour l'interception c'est reglé puisque je vais surcharger ce message par la suite.
Effectivement, ça ne va pas être évident pour t'aider sans ton compo sous la main pour faire des essais...
Peut-être devrais-tu essayer avec WaitMessage ou GetMessage...?
J'imagine que l'idéal est de surcharger ton compo pour créer l'évènement approprié...
Mais en fait, il suffirait de comparer le "winhandle" du message avec celui de la fenêtre parente de ton compo, non?
(hum, possible aussi que je sois hors-problème, dans ce cas, oublie!)
Bon courage, à+
Ben en fait, je sais pas si ce que je veux faire est possible aussi donc faudrais deja que je me penche un peu plus sur le probleme et que je regarde si il y a pas une alternative
Et un truc dans ce genre, ça t'irais ?
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; TTest = class(TMemo) private FWndProc: TWndMethod; procedure MyWndProc(var Message: TMessage); public constructor Create(AOwner: TComponent); override; destructor Destroy; override; end; var Form1: TForm1; implementation {$R *.dfm} { TTest } constructor TTest.Create(AOwner: TComponent); begin inherited; if AOwner is TControl then begin FWndProc:= TControl(AOwner).WindowProc; TControl(AOwner).WindowProc:= MyWndProc; end else FWndProc:= nil; end; destructor TTest.Destroy; begin if Assigned(FWndProc) then begin TControl(Owner).WindowProc:= FWndProc; FWndProc:= nil; end; inherited; end; procedure TTest.MyWndProc(var Message: TMessage); begin if Message.Msg = WM_NCPAINT then Lines.Add('Hop !'); if Assigned(FWndProc) then FWndProc(Message); end; procedure TForm1.FormCreate(Sender: TObject); begin with TTest.Create(self) do begin Parent:= self; Left:= 10; Top:= 10; Width:= 100; Height:= 200; end; end; end.
C'est parfait Pierre, merci de ton aide, je commencais à penser que c'etais pas possible maintenant reste a voir comment je peux surcharger cette fonction en dynamique.
Partager