BorderStyle changé dynamiquement [Résolu]

jmfmarques 7668 Messages postés samedi 5 novembre 2005Date d'inscription 22 août 2014 Dernière intervention - 27 janv. 2007 à 12:22 - Dernière réponse : PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention
- 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 !
Afficher la suite 

Votre réponse

85 réponses

Meilleure réponse
Charles Racaud 3181 Messages postés dimanche 15 février 2004Date d'inscription 9 avril 2017 Dernière intervention - 27 janv. 2007 à 18:25
3
Merci
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

Merci Charles Racaud 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 75 internautes ce mois-ci

Commenter la réponse de Charles Racaud
Meilleure réponse
jmfmarques 7668 Messages postés samedi 5 novembre 2005Date d'inscription 22 août 2014 Dernière intervention - 27 janv. 2007 à 18:30
3
Merci
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 +

Merci jmfmarques 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 75 internautes ce mois-ci

Commenter la réponse de jmfmarques
Meilleure réponse
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 27 janv. 2007 à 18:39
3
Merci
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

Merci PCPT 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 75 internautes ce mois-ci

Commenter la réponse de PCPT
Meilleure réponse
Charles Racaud 3181 Messages postés dimanche 15 février 2004Date d'inscription 9 avril 2017 Dernière intervention - 27 janv. 2007 à 18:55
3
Merci
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

Merci Charles Racaud 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 75 internautes ce mois-ci

Commenter la réponse de Charles Racaud
Meilleure réponse
mortalino 6812 Messages postés vendredi 16 décembre 2005Date d'inscription 21 décembre 2011 Dernière intervention - 27 janv. 2007 à 18:57
3
Merci
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"
<!--

Merci mortalino 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 75 internautes ce mois-ci

Commenter la réponse de mortalino
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 27 janv. 2007 à 12:51
0
Merci
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
Commenter la réponse de PCPT
Dolphin Boy 630 Messages postés vendredi 5 mai 2006Date d'inscription 17 février 2007 Dernière intervention - 27 janv. 2007 à 13:09
0
Merci
Salut,

API ? Pour une textbox ? Why ? Je ne donnerai pas non plus la solution. C'est trop simple.
Commenter la réponse de Dolphin Boy
jmfmarques 7668 Messages postés samedi 5 novembre 2005Date d'inscription 22 août 2014 Dernière intervention - 27 janv. 2007 à 13:09
0
Merci
<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 !
Commenter la réponse de jmfmarques
jmfmarques 7668 Messages postés samedi 5 novembre 2005Date d'inscription 22 août 2014 Dernière intervention - 27 janv. 2007 à 13:16
0
Merci
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 !)
Commenter la réponse de jmfmarques
jmfmarques 7668 Messages postés samedi 5 novembre 2005Date d'inscription 22 août 2014 Dernière intervention - 27 janv. 2007 à 13:17
0
Merci
Et sans, bien évidemment, cacher une partie de la textbox (en la mettant dans un container, par exemple ...) NON : ta seule textbox !
Commenter la réponse de jmfmarques
Dolphin Boy 630 Messages postés vendredi 5 mai 2006Date d'inscription 17 février 2007 Dernière intervention - 27 janv. 2007 à 13:24
0
Merci
Si c'est bien de vb6 qu'on parle alors, la propriété BorderStyle n'étant pas en read only :
Text1.BorderStyle = 0
Commenter la réponse de Dolphin Boy
Charles Racaud 3181 Messages postés dimanche 15 février 2004Date d'inscription 9 avril 2017 Dernière intervention - 27 janv. 2007 à 13:29
0
Merci
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
Commenter la réponse de Charles Racaud
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 27 janv. 2007 à 13:32
0
Merci
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
Commenter la réponse de PCPT
jmfmarques 7668 Messages postés samedi 5 novembre 2005Date d'inscription 22 août 2014 Dernière intervention - 27 janv. 2007 à 13:33
0
Merci
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 ... 
Commenter la réponse de jmfmarques
cs_Exploreur 4824 Messages postés lundi 11 novembre 2002Date d'inscription 15 novembre 2016 Dernière intervention - 27 janv. 2007 à 13:36
0
Merci
Bonjour à tous,

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

Salutations à tous

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

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

Faites vos jeux.....
Commenter la réponse de Dolphin Boy
jmfmarques 7668 Messages postés samedi 5 novembre 2005Date d'inscription 22 août 2014 Dernière intervention - 27 janv. 2007 à 13:47
0
Merci
OK !!
BONNE NOUVELLE ! (merci Dolphin)

On change alors la textbox pour un CommandButton...

ALLONS-y ! (pas toi, PCPT, toujours pas toi... hein ...)
Commenter la réponse de jmfmarques
Charles Racaud 3181 Messages postés dimanche 15 février 2004Date d'inscription 9 avril 2017 Dernière intervention - 27 janv. 2007 à 13:50
0
Merci
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
Commenter la réponse de Charles Racaud

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.