ActiveX changement résolution

charret2002 Messages postés 4 Date d'inscription samedi 26 février 2005 Statut Membre Dernière intervention 1 décembre 2006 - 29 nov. 2006 à 15:09
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 - 1 déc. 2006 à 17:03
Bonjour.

Je travaille dans une boîte ou nous faisons des fours électriques industriels (je viens d'arriver). Sûr ces fours, nous avons un PC qui permet de tout paramètrer. Pour le moment, nous affichons tous cela sur des écrans CRT de 1600x1200 pixels. Nous aimerions passer à des écrans LCD et également prendre des résolutions plus faibles ce qui fait que je dois développer ou trouver un composant qui adaptera automatiquement la résolution des ActiveX et des exécutables déjà programmer.

Suite à cela, j'ai fait des recherches pour trouver un logiciel qui fait cela mais je n'ai pas trouver beaucoup de chose et ce que j'ai trouvé ne fonctionne pas sur notre projet. Maintenant mon but est de créer un ActiveX qui pourra transformer ses composants. J'ai donc fait un ActiveX mais je ne vois pas comment faire pour qu'il puisse voir les composants qui sont situé dans la même Form que mon ActiveX.
Je suis obligé de faire comme cela car il ne veulent pas avoir à modifier le logiciel de base qui est vraiment énorme. De plus je ne connais pas encore super bien Visual Basic ayant fait mes classes avec du Java et les technologies Web (non Microsoft)...

Merci d'avance pour vos réponses.

12 réponses

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
29 nov. 2006 à 15:44
Il te faut accèder au parent de ton usercontrol :

For Each oControl In UserControl.Parent.Controls

msgbox oControl.Name

Next oControl
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
29 nov. 2006 à 15:45
Ami,

Celà te coûtera beaucoup moins cher (et à ton entreprise également) d'acheter un ocx déjà fait. Il en existe quelques-uns sur le marché (pour un prix oscillant entre une trentaine et une centaine d'euros, selon les performances obtenues)....
Je t'en parle en parfaite connaissance de cause, crois-moi... (j'ai longtemps vendu Octopus.ocx - jmfien - , aujourd'hui dépassé mais dont je me suis engagé à ne céder ni les droits ni le source. Désolé).
0
charret2002 Messages postés 4 Date d'inscription samedi 26 février 2005 Statut Membre Dernière intervention 1 décembre 2006
29 nov. 2006 à 15:54
Je vais essayer ta solution DARKSIDIOUS. Je redonnerais des nouvelles mais j'aurais surement d'autre question vu mon peu connaissance en visual basic.

jmfmarques, je ne peux pas vraiment acheter quelque chose vu que sa ne fonctionne pas totalement et que dans la boîte ou je suis, ils voudraient pouvoir modifier complètement ce que j'ai codé... De plus tous les logiciel que j'ai trouvé ne fonctionnent pas totalement avec le programme que j'ai. Pour finir c'est un travail de dîplome donc voilà...
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
29 nov. 2006 à 18:42
Bon...
Quelques mots, alors, pour que tu t'y prépares bien...

Dans la bouclu suggérée par DARKSIDIOUS, intéresse-toi également (et je dirais principalement) au type de chaque contrôle

If typeof oControl is..... then...

Car tous les contrôles ne se gèrent pas toujours de la même façon

Commence à t'intéresser de très près à la retaille des polices de caractères (ce sera une difficulté importante). Vois par exemple ceci :

Private Sub Command1_Click()
  Label1.FontSize = 10 ' ceci est ce que tu as décidé
  MsgBox Label1.FontSize ' ceci est ce qu'en fait VB : 9,75
  Label1.FontSize = Label1.FontSize * 1.1 ' donc 11 dans ton esprit pour retailler
  MsgBox Label1.FontSize ' ceci est ce qu'en fait VB : est resté à 9,75
  Label1.FontSize = Label1.FontSize * 1.5 ' donc 15 dans ton esprit
  MsgBox Label1.FontSize ' ceci est ce qu'en fait VB : 13,75
End Sub

Ce sera un bon début de découverte des difficultés à attendre

Autres problèmes non moins importants : de nombreuses dimensions sont fixées par SystèmeMetrics de Windows (police des menus, dimensions des flèches des ascenseurs, largeur minimum de certains contrôles, etc...). Or, ton redimensionnement ne viendra pas changer ces valeurs....

Gaffe également au traitement de tout ce qui est graphique (il va falloir penser à tous les cas de figure...)

Prépare-toi, si tu prends ce chemin, à un gros labeur.

Reste évidemment la solution de facilité : modifier la résolution de l'écran client et la restituer in fine, ce qui est largement possible mais que ton entreprise n'acceptera pas pour diverses raisons, y compris si tu prends toutes les précautions pour un rétablissement par un RunOnce en cas d'interruption brutale de ton appli.

Voilà tout ce que je peux te dire à ce stade.
Si tu avances sur ce chemin et que tu te heurtes à une difficulté isolée et bien précisée, il me sera possible de t'orienter un peu, mais pas de donner la solution/code exacte.

Bon courage
0

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

Posez votre question
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
29 nov. 2006 à 20:51
"...modifier la résolution de l'écran client et la restituer in fine, ce qui est largement possible..."

Pas si possible que ça.

Résolution du logiciel : 1600x1200
Résolution souhaitée : ??? mais plus faible sur un écran LCD. 1280x1204 sur un 17", 1024x768 sur un 15"

Ces écrans là ne seront pas forcément (et même certainement) pas capable de supporter la résolution native du logiciel de 1600x1200.

Si dans l'autre sens (résolution du soft < à celle de l'écran) ta solution, jmfmarques, est envisageable. Dans le cas présent elle ne l'est pas. Et même elle peut se réléver dangereuse pour le matériel. Si les lcd accèptes sans trop de problèmes les surrésolutions en affichant un message d'erreur, il en va pas de même pour des crt. Il y a un risque non négligeable de griller l'écran voire de faire imploser le tube (j'ai testé )

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
29 nov. 2006 à 21:09
Hé ! Hé !

Bonsoir Casy...

Voilà une bonne raison de plus (parmi d'autres) de ne pas toucher sans réfléchir à la résolution de l'écran "client"...

Pour notre ami, maintenant (et bien qu'il aura quelques difficultés à saisir le rapport avec son problème... sauf s'il prend le temps de lire très soigneusement...) :

Une petite lecture :

http://www.xtremevbtalk.com/showthread.php?t=275354
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
29 nov. 2006 à 21:38
Ah.... (j'oubliais... pour Casy uniquement) :

Ce n'est pas une mauvaise chose que d'utiliser le "flag" CDS_TEST pour le paramètre dwFlags (le 2ème) de la fonction ChangeDisplaySettings de la librairie user32. Celà permet de décider en connaissance de cause et d'éviter bien des déboires.

Une fois la "chose" vérifiée, ma foi, on utilise à nouveau la fonction pour un "changement" dynamique ...
0
charret2002 Messages postés 4 Date d'inscription samedi 26 février 2005 Statut Membre Dernière intervention 1 décembre 2006
30 nov. 2006 à 08:17
Merci beaucoup tous le monde...

jmfmarques je te remercie pour tout et je vais essayer. Pour les différences entre les contrôle j'y avais pensé sa risque d'être long comme travail. Je vous ferais part de mes résultats.

Encore merci
0
charret2002 Messages postés 4 Date d'inscription samedi 26 février 2005 Statut Membre Dernière intervention 1 décembre 2006
1 déc. 2006 à 16:40
Nous voici à la fin de la semaine et il me semble que j'ai fait de l'avance... Je ne suis de loin pas doué en Visual Basic mais voilà ce que j'ai fait et sa à l'air de fonctionner plus ou moins bien... Encore quelques évolution à faire et c'est bon. Dites moi ce que vous en pensez


Option Explicit


Dim ratioHauteur As Double
Dim ratioLargeur As Double


Private Sub UserControl_Resize()
    'Mode Utilisateur et pas graphic designer
    If Ambient.UserMode Then
        Dim hauteur As Integer
        Dim largeur As Integer
        Dim controlIndex As Integer




        'Sert à trouver la résolution de l'écran
        hauteur = Screen.Height / Screen.TwipsPerPixelX
        largeur = Screen.Width / Screen.TwipsPerPixelY
    
        'Viendra modifier et se fera par rapport à la résolution de l'écran
        ratioLargeur = 1280 / 1600
        ratioHauteur = 1024 / 1200
   
        'Test tous les control dans une fenêtre
        For controlIndex = 0 To UserControl.ParentControls.Count - 1
            'Lorsque qu'une erreur arrive, on exécute pas les instructions
            On Error GoTo finBoucle
            With UserControl.ParentControls.Item(controlIndex)
                'Transforme les lignes
                If TypeOf UserControl.ParentControls.Item(controlIndex) Is Line Then
                    .X1 = .X1 * ratioLargeur
                    .X2 = .X2 * ratioLargeur
                    .Y1 = .Y1 * ratioHauteur
                    .Y2 = .Y2 * ratioHauteur
                'Tranforme le reste grâce à la gestion d'erreur
                Else
                    Call RedimComposant(UserControl.ParentControls.Item(controlIndex))
                    Call RedimTexte(UserControl.ParentControls.Item(controlIndex))
                    Call RedimImage(UserControl.ParentControls.Item(controlIndex))
                End If
            End With
finBoucle:
        Next
    End If
End Sub

Private Sub RedimComposant(composant As Control)
    'Lorsque qu'une erreur arrive, on exécute pas les instructions
    On Error GoTo finFonctionComposant
   
    'Redimensionnement du composant
    composant.Top = composant.Top * ratioHauteur
    composant.Width = composant.Width * ratioLargeur
    composant.Height = composant.Height * ratioHauteur
    composant.Left = composant.Left * ratioLargeur
finFonctionComposant:
End Sub



'Je ne doit pas modifier totalement les fonts. Juste pour que sa marche en 1280*1024 Sinon j'aurai de gros soucis mais c'est faisable (fonctionnait en partie)

Private Sub RedimTexte(composant As Control)
    'Lorsque qu'une erreur arrive, on exécute pas les instructions
    On Error GoTo finFonctionTexte
    Dim tailleTexte As Double
    Dim dblFSize As Double
   
    'Redimensionnement de la police
    dblFSize = CDbl(composant.Font.Size) * ratioHauteur
    composant.Font.Size = CLng(dblFSize)
finFonctionTexte:
End Sub



'Ne fonctionne pas encore

Private Sub RedimImage(composant As Control)
    On Error GoTo finFonctionImage
    composant.Picture.Height = composant.Picture.Height * ratioHauteur
    composant.Picture.Width = composant.Picture.Width * ratioLargeur
finFonctionImage:
End Sub
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
1 déc. 2006 à 16:46
remplace ta boucle for par un for each : bien plus rapide, et cà t'évite de faire :
With UserControl.ParentControls.Item(controlIndex) qui lui aussi va prend du temps pour rien !

Donc ca donnerai :
Dim ctlControl As Control
For each ctlControl in UserControl.ParentControls
            'Lorsque qu'une erreur arrive, on exécute pas les instructions
            On Error GoTo finBoucle
                'Transforme les lignes
                If TypeOf  ctlControl Is Line Then
                    ctlControl.X1 = ctlControl.X1 * ratioLargeur
                    ctlControl.X2 = ctlControl.X2 * ratioLargeur
                    ctlControl.Y1 = ctlControl.Y1 * ratioHauteur
                    ctlControl.Y2 = ctlControl.Y2 * ratioHauteur
                'Tranforme le reste grâce à la gestion d'erreur
                Else
                    Call RedimComposant(ctlControl)
                    Call RedimTexte(ctlControl)
                    Call RedimImage(ctlControl)
                End If
finBoucle:
        Next
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
1 déc. 2006 à 16:51
Petite correction :

        'Sert à trouver la résolution de l'écran
        hauteur = Screen.Height / Screen.TwipsPerPixelX
        largeur = Screen.Width / Screen.TwipsPerPixelY
    
        'Viendra modifier et se fera par rapport à la résolution de l'écran
        ratioLargeur = largeur / 1600
        ratioHauteur = hauteur / 1200

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
1 déc. 2006 à 17:03
Je vois que tu a pris le chemin...
C'est bien (je n'ai pas essayé mais vois que c'est pour l'instant bon en matière de redimensionnemen) des contrôles.... mais pas tous !)
Essaye avec des scrollbars, par exemple (dans les 2 sens, à savoir vers résolution plus haute et vers résolution plus basse... ou mieux : avec un controle data...) et constates....


Le redimensionnement des textes (fonts) ne peut se résoudre que très approximativement de cette façon (pas de problèmes réels avec des textboxes, mais quid des labels et boutons de commande ?). Une simple application de coeffocient correcteur ne sera acceptable (et pas toujours) que si, à la fois, tu as laissé de la marge (contrôles plus larges que nécessaire) et que tu as choisi la police la plus "élastique" possible (genre Tahoma). Je te rappelle à ce sujet que tu ne peux distribuer des polices avec ton application, sauf si elles ne sont pas proégées par des droits ou que tu as obtenu l'autorisation expresse de le faire). Mais même ainsi (avec des polices "élastiques") la seule application d'un coefficient conduira à des "occupations" différentes des contrôles par le texte qu'ils contiennent...


On en viendra après (seulement après ) aux PictureBoxes et contrôles image... (où de nombreuses considérations devront également être prises en compte)
0
Rejoignez-nous