BorderStyle changé dynamiquement

Résolu
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 - 27 janv. 2007 à 12:22
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Derniè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.

On va l'animer un peu, ce week-end !

85 réponses

Utilisateur anonyme
27 janv. 2007 à 18:25
Ok, voilà ma solution :





Option Explicit

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,

----

(Coloration syntaxique automatique par Kenji)





__________
Kenji
3
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
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.


A +
3
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
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&
    
    lDC =  GetWindowDC(oCtrl.hwnd)
    lRgn = CreateRectRgn(0&, 0&, oCtrl.Width, oCtrl.Height)
    Call SelectClipRgn(lDC, lRgn)
    Call IntersectClipRect(lDC, 3, 3, (oCtrl.Width / Screen.TwipsPerPixelX) - 3, (oCtrl.Height /
Screen.TwipsPerPixelY) - 3)
    lRet = CreateRectRgn(0&, 0&, 0&, 0&)
    Call GetClipRgn(lDC, lRet)
    Call SetWindowRgn(oCtrl.hwnd, lRet, False)
    Call DeleteObject(lRgn)
End Sub

<small>Coloration
syntaxique automatique [AFCK] </small>
       

<hr size ="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
3
Utilisateur anonyme
27 janv. 2007 à 18:55
Bon, ben je vais poster ca sur Codyx alors.
Merci à tous et surtout à toi Jmf qui a lancer le sujet. Ca m'as bien occupé.




__________
Kenji
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
27 janv. 2007 à 18:57
Avec GetTickCount, et à nombre égal de contrôles : 0 ms chacun...
Bref, c'est de l'instantanné  ;)

@++

<hr size="2" width="100%" />
  --Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
<!--
3
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
27 janv. 2007 à 12:51
salut,

j'ai peur que tu aies très peu de tentatives de réponses
(ceux qui cherchent trouvent, ceux qui cherchent ne postent pas)

mais pourquoi pas...
bonne anim d'aprem

(j'peux jouer? )
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
0
Dolphin Boy Messages postés 630 Date d'inscription vendredi 5 mai 2006 Statut Membre Dernière intervention 17 février 2007
27 janv. 2007 à 13:09
Salut,

API ? Pour une textbox ? Why ? Je ne donnerai pas non plus la solution. C'est trop simple.
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
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 !
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
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 !)
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
27 janv. 2007 à 13:17
Et sans, bien évidemment, cacher une partie de la textbox (en la mettant dans un container, par exemple ...) NON : ta seule textbox !
0
Dolphin Boy Messages postés 630 Date d'inscription vendredi 5 mai 2006 Statut Membre Dernière intervention 17 février 2007
27 janv. 2007 à 13:24
Si c'est bien de vb6 qu'on parle alors, la propriété BorderStyle n'étant pas en read only :
Text1.BorderStyle = 0
0
Utilisateur anonyme
27 janv. 2007 à 13:29
Heu, comme Dolphin, je ne vois pas trop de difficulté.
La propriété BorderStyle existe et n'est pas en ReadOnly

Allez, un petit code :




Dim LaTextBox As TextBox

Private Sub UnBouton_Click()
  Set LaTextBox = Me.Controls.Add("VB.TextBox", "LaTextBox")
  LaTextBox.Visible = True
End Sub

Private Sub PlusDeBordure_Click()
  LaTextBox.BorderStyle = 0
End Sub,

----

(Coloration syntaxique automatique par Kenji)





__________
Kenji
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
27 janv. 2007 à 13:32
bien joué Dolphin Boy

(et oui, cette propriété est modifiable en execution)

<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
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".


Je compte sur toi ... 
0
cs_Exploreur Messages postés 4821 Date d'inscription lundi 11 novembre 2002 Statut Membre Dernière intervention 15 novembre 2016 15
27 janv. 2007 à 13:36
Bonjour à tous,

Et bien Jmfmarques..Faut trouver un autre exercice !!!!

Salutations à tous

A+
Exploreur
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
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 .
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
27 janv. 2007 à 13:39
Allons bon !
Je change de contrôle, alors :

Me mettre un CommandButton complètement "plat", cliqué ou non !
0
Dolphin Boy Messages postés 630 Date d'inscription vendredi 5 mai 2006 Statut Membre Dernière intervention 17 février 2007
27 janv. 2007 à 13:44
Pour le commandbutton, ok. La propriété Appearance est  ReadOnly.

Faites vos jeux.....
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
27 janv. 2007 à 13:47
OK !!
BONNE NOUVELLE ! (merci Dolphin)

On change alors la textbox pour un CommandButton...

ALLONS-y ! (pas toi, PCPT, toujours pas toi... hein ...)
0
Utilisateur anonyme
27 janv. 2007 à 13:50
En effet, j'ai confondu.
Ha par contre, avec un bouton, c'est tout de suite plus dur.
J'ai même réusit à faire planter vb en esseyant.






__________
Kenji
0
Rejoignez-nous