jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 2014
-
27 janv. 2007 à 12:22
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 2018
-
27 janv. 2007 à 23:04
Je suis désespéré de constater qu'il n'y a pas foule aujourd'hui...
J'ai donc décidé d'animer un peu tout la chose :
Question : comment faire en sorte de faire disparaître dynamiquement la bordure d'un contrôle existante lors de sa création ,
Prenons l'exemple d'une textbox créée avec une bordure, bordure qu'on veut faire disparaître dynamiquement .
Pour que cette question puisse ici servir, je demande aux développeurs des 2 catégories suivantes de s'abstenir de donner la solution :
- Développeurs aguerris (niveau déjà élevé)
- Développeurs de niveau encore trop faible
Elle s'adresse principalement, donc, aux développeurs d'au moins une année d'expérience (mais pas plus de 6) et déjà suffisamment à l'aise avec l'utilisation de fonctions de l'API de Windows
Je connais la solution, oui, mais ne la donnerai qu'in Fine. J'accepte toutefois de répondre par oui ou par non à toute interrogation faite quant à l'utilité d'utiliser telle ou telle autre fonction.
Private Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function SetWindowRgn Lib "user32" (ByVal hwnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As Rectangle) As Long
Private Declare Function ScreenToClient Lib "user32" (ByVal hwnd As Long, lpPoint As Point) As Long
Private Type Point
x As Long
y As Long
End Type
Private Type Rectangle
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Sub RemoveControlBorder(hwnd As Long, Optional BorderSize As Long = 2)
Dim Rgn As Long
Dim Rect As Rectangle
Call GetWindowRect(hwnd, Rect)
Dim Size As Point
Size.x = Rect.Right
Size.y = Rect.Bottom
Call ScreenToClient(hwnd, Size)
Rgn = CreateRectRgn(BorderSize, BorderSize, Size.x - BorderSize, Size.y - BorderSize)
Call SetWindowRgn(hwnd, Rgn, True)
Call DeleteObject(Rgn)
End Sub
Private Sub Form_Load()
Call RemoveControlBorder(Drive1.hwnd)
Call RemoveControlBorder(Dir1.hwnd)
Call RemoveControlBorder(List1.hwnd)
Call RemoveControlBorder(Command1.hwnd)
End Sub,
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 27 janv. 2007 à 18:30
Youpi et bravo, Charles ! Je vais l'essayer .... Merci
Voilà le mien en attendant (plus court)
Sur une Form
- un bouton de commande command1, "normal"
- un bouton de commande Command2 avec sa prop style = graphical (pour l'essayer également)
- un bouton de commande nimmé mettreaplat (pour lancer et voir la différence)
code :
Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Long, ByVal hRgn As Long, _
ByVal bRedraw As Boolean) As Long
Private Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, _
ByVal X2 As Long, ByVal Y2 As Long) As Long
Const coucou = 3 'faites varier et vous verrez ce qu'il est possible de faire (retrécir, entre autres..)
Private Sub mettreaplat_Click()
aplat Command1
aplat Command2
'aplat Check1
'aplat Option1
'aplat List1
'aplat HScroll1
'aplat Combo1
'aplat Text1
'aplat Frame1
End Sub
Private Sub Form_Activate()
Me.ScaleMode = 3 '(ici en pixels)
Me.BackColor = vbWhite ' (juste pour y "voir clair" dans cette affaire)
Command2.BackColor = vbGreen
End Sub
Private Sub aplat(controle As Control)
Dim hRegion As Long
With controle
hRegion = CreateRectRgn(coucou, coucou, .Width - coucou, .Height - coucou)
SetWindowRgn .hWnd, hRegion, True
End With
End Sub
J'ai mis en commentaires d'autres contrôles. Si on les insère et qu'on décommente, celà marche aussi, bien sur.
Je vais regarder ce que fait ton code, maintenant.
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 27 janv. 2007 à 18:39
beh de mon côté c'est la fête des lignes ....
Option Explicit
Private Declare Function GetClipRgn Lib "gdi32" (ByVal hdc As Long, ByVal hRgn As Long) As
Long
Private Declare Function IntersectClipRect Lib "gdi32" (ByVal hdc As Long, ByVal x1 As Long, ByVal y1 As
Long, ByVal x2 As Long,
ByVal y2 As Long) As
Long
Private Declare Function SelectClipRgn Lib "gdi32" (ByVal hdc As Long, ByVal hRgn As Long) As
Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Private Declare Function SetWindowRgn Lib "user32" (ByVal hwnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
Private Declare Function CreateRectRgn Lib "gdi32" (ByVal x1 As Long, ByVal y1 As Long, ByVal x2 As
Long, ByVal y2 As Long)
As Long
Private Declare Function GetWindowDC Lib "user32" (ByVal hwnd As Long) As Long
Private Sub Form_Load()
List1.AddItem "ListBox1"
List2.AddItem "ListBox2"
Call EraseRect(Command1)
Call EraseRect(Command2)
Call EraseRect(Command3)
Call EraseRect(Text1)
Call EraseRect(Drive2)
Call EraseRect(List1)
Call EraseRect(VScroll2)
End Sub
Sub EraseRect(ByRef oCtrl As Object)
Dim lRgn&, lRet&, lDC&
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 27 janv. 2007 à 13:09
<hr />
Tu peux jouer, PCPT, mais avec les mêmes limites que celles que je me suis fixées (tu n'es en effet pas dans la "tranche" acceptée ) : ne répondre que par oui ou par non et laisser chercher ceux qui à la fois le "en velulent", le peuvent, et ne l'ont pas déjà fait !
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 27 janv. 2007 à 13:16
Dolphin, bonjour...
Si tu as la solution sans API et sans substituer une textbox à l'autre (en créer une dynamiquement et t'en servir en la substituant à la première) donne-la : je t'y autorise (et ne la connais pas !)
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 27 janv. 2007 à 13:33
Nom de nom !
Elle n'est pas en Read Only, cette propriété, sous VB6 ? (je suis avec VB5)...
Si c'est vrai, ce sujet ne tient plus, alors...
Quelqu'un pour confirmer ?
Si c'est confirmé : et pour un commandButton ? .... Tu pourrais me trouver s'il te plait, alors, Dolphin, un contrôle avec cette propriété ReadOnly pour un BorderStyle sous VB6 (et avec un hwnd... car nécessaire)... et on change TextBox par ce contrôle ...
Trouves-en-un et dis mois.
Il est maintenant clair que si la propriété BorderStyle n'est pas ReadOnly pour tous les contrôles de VB6 la possédant, ce sujet n'a plus lieu d'être, sauf.... (hé hé ! ) peut-être... pour faire un CommandButton complètement "plat".
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 27 janv. 2007 à 13:37
Charles, bonjour,
Toi, tu viens de créer dynamiquement une textbox !
Or, il s'agit d'oter dynamiquement la bordure d'une textbox créée manuellement avec bordure !
Voir de toutes façons mon message présédent : trouver un contrôle qui, sous VB6 n'a pas cette propriété modifiable dynamiquement alors qu'il a été crée manuellement .