Doc sur l'api setwindowlong

Contenu du snippet

vous persente une partie des constantes relatives à l'api SetWindowLong et yen a ke j'ai pas réussi a savoir ce que c'est, milles excuses

Source / Exemple :


'SetWindowLong est une API très puissantes, elle permet de changer les apparences, les états des feuilles (ce qui va être étudié dans ce chapitre), mais également sur des contrôles... (pour plus tard). Mais sa manipulation est rendu difficle par le nombre impressionant de constantes à maitriser, ne serait-ce que pour le descripteur GWL_STYLE. Petite note en passant, je travaille sur un WinXP, c'est pour ca que je parle de skin.

Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Const GWL_STYLE = (-16)
Private Const GWL_EXSTYLE = (-20)

'Utilisation
SetWindowLong Me.hwnd, GWL_STYLE, (Constante)
SetWindowLong Me.hwnd, GWL_EXSTYLE, (Constante)

'>> Pour les newbies (et pour les autres) : - Hexadécimal : Nombre de base 16, cad que l'on ajoute des lettres (jusqu'à F) pour pouvoir écrire 1F=31. Les nombres hexadécimaux sont généralement précedés de &H.
' - Binaire : Vous avez sans doute entendu parler du binaire ? C'est un codage sous forme d'octets de 8 bits (chiffres si vous voulez) pouvant prendre uniquement des valeurs booléenes (0 ou 1).
'
'______________________________________  << Ascii Art ;)
'|____/128/_64/_32/_16/_8_/_4_/_2_/_1_|
'|____/_1_/_0_/_1_/_1_/_1_/_0_/_0_/_0_| = 128 + 32 + 16 + 8 = 184
'|____________________________________|
'                            (c) Alan71, réutilisation autorisée dans le cadre privé [:)]
' Rq = Tout chiffre impaire aura son dernier Bit = 1
'
' Faudrait aussi voir à vous apprendre les opérateurs logiques si vous ne les connaissez pas, mais ça ferait sortir du sujet. Vous pouvez les retrouvés dans l'aide de VB, aux rubriques And, Eqv, Imp, Not, Or et XOr. (Imp et Eqv ne sont quasiment jamais utilisés, peu de gens en connaissent leur existance)
' Dernier point : un masque binaire traite deux nombres sout forme binaire puis applique l'opérateur logique sur chacun des bits. Si vous voulez des précisions ou quoi que ce soit, posez un commentaire ou envoyer moi un mail sur la messagerie VBFrance.
'______________________________________
'|____/128/_64/_32/_16/_8_/_4_/_2_/_1_|
'|____/_1_/_0_/_1_/_1_/_1_/_0_/_0_/_0_|
'|____/_0_/_1_/_1_/_0_/_1_/_0_/_1_/_0_|
'|Or__________________________________|
'|____/_1_/_1_/_1_/_0_/_1_/_0_/_1_/_0_|
'|____________________________________|

' Petite astuce pour calculer directement de l'hexa au binaire : 00 = un octet
' ex : &H100 = 1 00000000 00000000
' car chaque chiffre correspond à un demi-octet (4 bits)
' Tout chiffre decimal d'un nombre hexadécimal se calcule comme un chiffre décimal classique, pour les lettres, il faut convertir (A=10 ; B=11 ; C=12 ; D=13 ; E=14 ; F=15)
' ex : &H2 = 10 ; &C=1100
' De tête, on peut maintenant calculer en valeur binaire tout.

' Rien que pour ca, ca valait le déplacement, nan ? :)

' Revenons maintenant au sujet...
' Le Style d'une feuille est défini sur 4 octets
' J'ai mis les valeurs binaires si vous désirez faire des masques binaires (ce qui est quasi-obligatoire) et ca qui permet de mieux cerner les constantes
Const WS_ACTIVECAPTION = &H1
' - Active la barre de titre sans la skinnée. Ne bouffe pas de la hauteur à la fenêtre comme WS_CAPTION
'Valeur Binaire = 00000000 00000000 00000000 00000001
Private Const WS_BORDER = &H800000
' - Change la propriété BorderStyle comme pour une PictureBox avec l'Apparence Flat
'Valeur Binaire = 00000000 10000000 00000000 00000000
Private Const WS_CAPTION = &HC00000
' - Affiche la barre de titre skinnée.
'Valeur Binaire = 00000000 11000000 00000000 00000000
Private Const WS_CHILD = &H40000000
Private Const WS_CHILDWINDOW = (WS_CHILD)
' Je galère un peu pour vous trouvez à quoi ca correspond, je pense que ca la considère comme si la propriété MDIChild = True, mais de là a en être sûr.
'Valeur Binaire = 10000000 00000000 00000000 0000000
Private Const WS_CLIPCHILDREN = &H2000000
' Là, c'est pareil, j'arrive pas à trouver le sens de WS_CLIPCHILDREN et WS_CLIPSIBLINGS. Rien de visible, peut-être en étant combiné avec autre chose... Pour informations ou si çà peut aider quelqu'un à trouver : Clip signifie 'Pince' et Sibling 'Enfants de mêmes parents'
'Valeur Binaire = 00000010 00000000 00000000 00000000
Private Const WS_CLIPSIBLINGS = &H4000000
'Valeur Binaire = 00000100 00000000 00000000 00000000
Private Const WS_DISABLED = &H8000000
' Bah... là, faut pas chercher très très loin... Enabled = False
'Valeur Binaire = 00001000 00000000 00000000 00000000
Private Const WS_DLGFRAME = &H400000
' Theoriquement, ca donne BorderStyle = vbFixedDialog = 3 mais elle est à combiner avec d'autres constantes car la barre de titre n'est pas skinnée.
'Valeur Binaire = 00000000 01000000 00000000 00000000
Private Const WS_GROUP = &H20000
' Ca produit le même effet que WS_ACTIVECAPTION, quelqu'un pourrait m'aider pour cette constante ?
'Valeur Binaire = 00000000 00000010 00000000 00000000
Private Const WS_HSCROLL = &H100000
' Ca, c'est délirant ! çà fait appraître une ScrollBar au bas de votre feuille. Comprendre son fonctionnement sera le fruit de futures recherches. Les évenements seront à capter par sub-classing et les propriétés par d'autres API. J'en connais qui vont pas bcp dormir.
'Pour bien la voir, combinez la avec WS_OVERLAPPEDWINDOW.
'Valeur Binaire = 00000000 00010000 00000000 00000000
Private Const WS_MAXIMIZE = &H1000000
' La, on pourrait penser que ca vous maximize la feuille. Moi, j'y arrive pas. Ya peut-être quelque chose a mettre derrière ? Cette fonction est également possible avec l'API SetWindowPlacement.
'Valeur Binaire = 00000001 00000000 00000000 00000000
Private Const WS_MAXIMIZEBOX = &H10000
' C'est une constante qui ne sert que pour savoir si elle est la pour l'api GetWindowLong. Si elle est omise, on ne la voit pas.
'Valeur Binaire = 00000000 00000001 00000000 00000000
Private Const WS_MINIMIZE = &H20000000
Private Const WS_ICONIC = WS_MINIMIZE
' Minimize toi ! bordel :) pareil que WS_MAXIMIZE, je doit être glandu... :p
' Peut-être une Api de lecture comme WS_MAXIMIZEBOX ??? Mais à ce moment la, autant utliser l'api IsIconic 
'Valeur Binaire = 00010000 00000000 00000000 00000000
Private Const WS_MINIMIZEBOX = &H20000
' Même remarque que pour WS_MAXIMIZEBOX
'Valeur Binaire = 00000000 00000010 00000000 00000000
Private Const WS_OVERLAPPED = &H0&
Private Const WS_TILED = WS_OVERLAPPED
' Quelle est l'utilité d'avoir une Const = 0 ???? Je doit être aveugle enfin, OverLap = Chevaucher. Peut-être pour s'assuer que tout soit égal à 0.
'Valeur Binaire = 00000000 00000000 00000000 00000000
Private Const WS_POPUP = &H80000000
' Je vote pour BorderStyle = vbFixedSingle
'Valeur Binaire = 10000000 00000000 00000000 00000000
Private Const WS_SYSMENU = &H80000
' En théorie, ca fait apparaître l'icon de la form dans la barre de titre (avec le popupmenu quand on clique dessus), mais vous avez le droit, en prime, a avoir la case 'X' fermer.
'Valeur Binaire = 00000000 00001000 00000000 00000000
Private Const WS_TABSTOP = &H10000
' Je ne suis pas sur que cette constante s'applique aux fenêtres. La propriété TabStop défini normalement si un control peut avoir ou non le focus par la touche TAB. J'ai vérifier, elle apparaît tj dans l'Alt-Tab.
'Valeur Binaire = 00000000 00000001 00000000 00000000
Private Const WS_THICKFRAME = &H40000
Private Const WS_SIZEBOX = WS_THICKFRAME
' Propriété BorderStyle = vbSizableToolBox = 5
'Valeur Binaire = 00000000 00000100 00000000 00000000
Private Const WS_VISIBLE = &H10000000
'Surement une constante destinée à la lecture car j'ai tout tester, pas possible de la rendre invisible. De plus, logiquement, la constante devrait etre WS_INVISIBLE, car WS_VISIBLE nous oblige à le dire à chaque fois (car une feuille est le plus souvent visible). pas très clair mes propos, hein ?
'Valeur Binaire = 00010000 00000000 00000000 00000000
Private Const WS_VSCROLL = &H200000
' Comme WS_HSCROLL mais en vertical.
'Valeur Binaire = 00000000 00100000 00000000 00000000
Private Const WS_GT = (WS_GROUP Or WS_TABSTOP)
' Transforme votre fenêtre en voiture de Grand Tourisme.
' Nan, sérieusement, aucune idée
'Valeur Binaire = 00000000 00000011 00000000 00000000
Private Const WS_OVERLAPPEDWINDOW = (WS_OVERLAPPED Or WS_CAPTION Or WS_SYSMENU Or WS_THICKFRAME Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX)
Private Const WS_TILEDWINDOW = WS_OVERLAPPEDWINDOW
' La fenêtre 'Classique' BorderStyle = vbSizable = 2
'Valeur Binaire = 00000000 11001111 00000000 00000000
Private Const WS_POPUPWINDOW = (WS_POPUP Or WS_BORDER Or WS_SYSMENU)
' Ma feuille répond plus à aucun event... Bizarre tout ca...
'Valeur Binaire = 10000000 10001000 00000000 00000000

'Il reste des bits libres, je sais pas pourquoi, il me semble pourtant avoir pris toutes les constantes... EXStyle maintenant

Private Const WS_EX_ACCEPTFILES = &H10&
' Accepte les drag/drop mais, pour intercepter le drop faudra surement passer par le sub-classing
' Ca le dégage de la taskbar par contre....
'Valeur Binaire = 00000000 00000000 00000000 00010000
Private Const WS_EX_APPWINDOW = &H40000
' Là, ca le fait s'afficher dans la barre de tâches
'Valeur Binaire = 00000000 00000100 00000000 00000000
Private Const WS_EX_CLIENTEDGE = &H200&
'Ca crée un relief dans la fenetre, juste sur la limite
'Valeur Binaire = 00000000 00000000 00000010 00000000
Private Const WS_EX_CONTEXTHELP = &H400&
' Form non-sizable, ShowInTaskBar = False, Bouton '?' présent, Bouton '_' et agrandissement non présent
'Valeur Binaire = 00000000 00000000 00000100 00000000
Private Const WS_EX_CONTROLPARENT = &H10000
' Form non-sizable, ShowInTaskBar = False, Bouton '_' et agrandissement non présent (Bravo le copier/coller :p)
'Valeur Binaire = 00000000 00000001 00000000 00000000
Private Const WS_EX_DLGMODALFRAME = &H1&
' euh... aucune différence avec WS_EX_CONTROLPARENT
'Valeur Binaire = 00000000 00000000 00000000 00000001
Private Const WS_EX_LAYERED = &H80000
' Youhou, petite form, t'es passée ou ? nan mais avec un alt-tab, elle revient
'Valeur Binaire = 00000000 00001000 00000000 00000000
Private Const WS_EX_LAYOUTRTL = &H400000
' A essayer impérativement, en fait, c'est WS_EX_CONTROLPARENT, avec une barre à la con (un trait simple) mais une barre de titre présente, la croix est à gauche, l'icône à droite. Mais le must, c'est que si vous avez XP et les powertoys dans le Alt-Tab, vous avez le droit a un effet mirror, bref, que du délire. (Je l'ai mis dans le screenshot). En fait c'est pour des raisons expliquées ci-après.
'Valeur Binaire = 00000000 01000000 00000000 00000000
Private Const WS_EX_LEFT = &H0&
' Comme prévu, ca fait... rien. Mais je viens de comprendre qu'il faut tj mettre WS_EX_APPWINDOW pour avoir le droit à la taskbar.
'Valeur Binaire = 00000000 00000000 00000000 00000000
Private Const WS_EX_LEFTSCROLLBAR = &H4000&
' J'ai du mal à repérer la ScrollBar perso, enfin, vous avez le droit pour le prix à la bordure à la con.
'Valeur Binaire = 00000000 00000000 01000000 00000000
Private Const WS_EX_LTRREADING = &H0&
' Je vous pas ce que ca fait, ca doit venir du fait que je comprend pas le LTR (toutes mes excuses). En fait, c'est Left To Right
'Valeur Binaire = 00000000 00000000 00000000 00000000
Private Const WS_EX_MDICHILD = &H40&
' Je vois pas l'interêt car une MDIChild n'a rien de particulier. enfin, si vous voulez coller une feuille dans une autre ou même dans une picturebox (tout control pouvant faire office de conteneur) utilisez l'API SetParent.
'Valeur Binaire = 00000000 00000000 00000000 01000000
Private Const WS_EX_NOACTIVATE = &H8000000
' Encore une que je comprend pas (on les compte plus, hein ?)
'Valeur Binaire = 00001000 00000000 00000000 00000000
Private Const WS_EX_NOINHERITLAYOUT = &H100000
' On a dit qu'on les comptait plus, c'est ca ?
'Valeur Binaire = 00000000 00010000 00000000 00000000
Private Const WS_EX_NOPARENTNOTIFY = &H4&
' c'est ca ? nan, parce que je vous ai pas bien entendu la...
'Valeur Binaire = 00000000 00000000 00000000 00000100
Private Const WS_EX_RIGHT = &H1000&
' Ca fait la bordure à la con, je dois être aveugle aux différences.
'Valeur Binaire = 00000000 00000000 00000001 00000000
Private Const WS_EX_RIGHTSCROLLBAR = &H0&
' Faut qu'il arrête avec ce foutage de gueule de constante = 0
'Valeur Binaire = 00000000 00000000 00000000 00000000
Private Const WS_EX_RTLREADING = &H2000&
' Right To Left, mais j'ai jamais réussi à utiliser cette propriété. Apparement, ca vient de mon Win qui n'est pas en version Arabe ou Hébraïque.
'Valeur Binaire = 00000000 00000000 00010000 00000000
Private Const WS_EX_STATICEDGE = &H20000
' Aucune idée chez vous ?
'Valeur Binaire = 00000000 00000010 00000000 00000000
Private Const WS_EX_TOOLWINDOW = &H80&
' BoderStyle = vbFixedToolWindow
'Valeur Binaire = 00000000 00000000 00000000 10000000
Private Const WS_EX_TOPMOST = &H8&
' Et nan ! ca mets pas votre feuille always-on-top, pour ca, c'est :
'   > Const HWND_TOPMOST = -1
'   > Const HWND_NOTOPMOST = -2
'   > Const SWP_NOSIZE = &H1
'   > Const SWP_NOMOVE = &H2
'   > Const SWP_NOACTIVATE = &H10
'   > Const SWP_SHOWWINDOW = &H40
'   > Private Declare Sub 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)
'   > 
'   > Private Sub Form_Activate()
'   >     'KPD-Team 1998                         << extrait de l'api-guide, vous l'aurez remarqué, pour ceux qui ne l'ont pas allez sur l'url
'   >     'URL: http://www.allapi.net/
'   >     'E-Mail: KPDTeam@Allapi.net
'   >     'Set the window position to topmost
'   >     SetWindowPos Me.hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE Or SWP_SHOWWINDOW Or SWP_NOMOVE Or SWP_NOSIZE
'   > End Sub
'Valeur Binaire = 00000000 00000000 00000000 00001000
Private Const WS_EX_TRANSPARENT = &H20&
' Une autre constante délirante, il ne reste plus rien sur l'ecran, sauf quand vous passez le pointeur sur les trois cases de votre feuille qui réapparaissent (un gros défaut de XP, quand on veut peindre sur la feuille, on a le même problème)
'Valeur Binaire = 00000000 00000000 00000000 00100000
Private Const WS_EX_WINDOWEDGE = &H100&
' (haussement d'épaules)
'Valeur Binaire = 00000000 00000000 00000001 00000000
Private Const WS_EX_OVERLAPPEDWINDOW = (WS_EX_WINDOWEDGE Or WS_EX_CLIENTEDGE)
' On revoit l'effet de WS_EX_CLIENTEDGE.
'Valeur Binaire = 00000000 00000000 00000011 00000000
Private Const WS_EX_PALETTEWINDOW = (WS_EX_WINDOWEDGE Or WS_EX_TOOLWINDOW Or WS_EX_TOPMOST)
' Ca vient peut-être de mon Win le topmost ? même en MDI, il reste pas au top.
'Valeur Binaire = 00000000 00000000 00000001 10001000

' Voila pour les Style et Style Etendu relatifs au form, même si il n'est pas très complet, j'espère que ce fichier vous a été utile. Pour les constantes relatifs aux contrôles, regardez à ES_ pour les TextBox, BS_ Pour les CommandButton, et LVS_ pour les listviews (c'est ceux que j'ai retenu de mémoire).
'
'     Alan71  

'> Après quelques recherches et surtout grâce à l'illustre Mehdi, voilà une src qui va être
'> complétée.
'> (quelques recherches << erf, vous croyez que je fais quoi le dimanche ! toujours un VB pour
'>  les nuls sur la table de chevet)
'>
'> Effectivement, j'ai appris que certaines constantes ne fonctionne que sur la création
'> de fenetre brute, par les API RegisterClass et CreateWindow. (J'avais un peu la flème de
'> faire des updates, milles excuses).
'> Mehdi, concernant tes remarques désobligeantes pour ma flagrante ignorance face à certaines
'> (et malheureusement nombreuses) constantes, tu te les gardes ! [:p]
'>
'> Voici donc le petit update, extrait d'un gentil mail (11/04/03 21:37:34 GMT au moment
'> j'écris). Les numéros de page font référence à la MSDN.

'>> WS_CHILD, c'est bien pour faire une fenêtre fille
'>> WS_CLIPCHILDREN et WS_CLIPSIBLING, tu trouveras des infos à la page 25, nommée
'>> "Child Window", section Clipping
'>> ou plus simplement à la page 29 "Parent and Child Styles"
'>> WS_DLGFRAME, avec ce style, une fenêtre ne peut avoir de barre de titre
'>> WS_MAXIMIZE, ce n'est à utiliser que lors de la création de la fenêtre
'>> idem pour WS_MAXIMIZEBOX idem pour le MINIMIZE idem pour WS_VISIBLE  (voir ça à la page 28 

'>> "Initial State"
'>> bon, je vais pas tout te détailler, tu trouveras également ce que tu cherchais sur WS_GROUP
'>> 
'>> par contre pour le fonctionnement des scrollbars, il n'est pas indiqué qu'il faut chercher
'>> du côté des messages WM_HSCROLL et WM_VSCROLL.
'>> pour le WS_TILED je te l'accorde 0 c'est un peu con mais bon, faut pas trop en demander à
'>> MS ;) Evidemment, la définir ou pas, ça ne change rien, mais c'est pour expliquer ce que
'>> ça fait quand on met 0 : (Overlapped, ça indique simplement que c'est une fenêtre, oui,
'>> "superposable", donc comme toutes les autres ;) sont vraiment cons.., mais c'est surtout
'>> pour ne pas mélanger avec les contrôles qui sont créés avec la mm API (CreateWindow(Ex))
'>> (d'où le WS_TABSTOP), là encore, sont pas très intello, pour créer un controle, faut 
'>> demander à créer une fenêtre ;) mais en fait, c'est pask'ils sont gérés de la mm manière,
'>> ou presk) pour le drag-drop de fichiers, oui, il faut passer par un chti hook ;) et 
'>> attendre le message
'>> WM_DROPFILES pour ce qui est de certains styles (notamment les styles étendus), ils ne sont
'>>  pas tous dans win32.hlp (Microsoft ayant sûrment arrêté d'éditer ce fichier au profit
'>> de MSDN Library) mais tu les trouveras sur le site de MSDN Library qui lui est tenu à
'>> jour.
'>> donc, pour WS_EX_LAYOUTRTL par exemple, c'est sur le site que l'on voit que c'est pour la
'>> gestion des langues orientales (Arabic and Hebrew versions of Windows 98/Me, Windows
'>> 2000/XP).

'> A ceci, j'ajoute que pour WM_HSCROLL et WM_VSCROLL sont des messages Windows, ils
'> interceptables en VB par le subClaassing (j'en ai parlé plus haut). pour de plus amples
'> informations : www.allapi.net (section tuto, puis subclassing) ou dans votre API-GUIDE
'>  sur la meme url, section Hook entre autre)
'>
'> WS_GROUP sert, de mémoire à créer des groupes de contrôles, il est a couplé avec WS_TabStop.
'>
'> Un dernier truc, les RTL, j'avais trouvé il me semble ! (et tok ! dans tes dents ;) )
'>
'> ah ! aussi les urls pour la MSDN sont :
'> pour les WindowsStyles : '> 

http://msdn.microsoft.com/library/en-us/winui/WinUI/WindowsUserInterface/Windowing/Windows/Windo

wReference/WindowStyles.asp
'> et par ici pour les Styles Extended : '> 

http://msdn.microsoft.com/library/en-us/winui/WinUI/WindowsUserInterface/Windowing/Windows/Windo

wReference/WindowFunctions/CreateWindowEx.asp

'> A bah, tiens, info de dernière minute (12/04/03 14:18:07 GMT, nan nan, j'ai pas travaillé 

toute la nuit :þ )
'> WS_EX_LAYERED sert lorsqu'on veut passer un alpha-blend sur une form /s Win2k/XP
'> (transparence partielle, ya des codes sur VBFrance)

Conclusion :


enfin, si G réussi a ouvrir le sujet ou a aider kelkun, C déjà ca...

(G été rapide sur la description, vu ke G u un pb avec le serveur, G du tout retapé et ca m'a saouler, enfin, je réponds à toutes les kestions sur la messagerie VBFrance)

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.