#1 Wed 12 October 2011 20:31
- jean94
- Participant assidu
- Date d'inscription: 13 Aug 2009
- Messages: 436
Taille d'écran en pixel
Bonjour,
Je cherche une fonction, je sais qu'elle existe, qui me permet de connaître la largeur et hauteur d'un écran en pixel.
Le but est de lancer la fonction en ouvrant un mbx afin que le formulaire soit toujours centré peut importe les paramètres de l'écran.
Merci!
JF
Hors ligne
#2 Wed 12 October 2011 21:03
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3199
- Site web
Re: Taille d'écran en pixel
Bonjour,
Je ne sais pas si cela existe dans le langage de programmation de Mapinfo, mais comme il est issu de VB6, je vous le donne en VB6:
Objet screen
Attribut : twipsperpixel (X et Y)
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne
#3 Wed 12 October 2011 21:53
- jean94
- Participant assidu
- Date d'inscription: 13 Aug 2009
- Messages: 436
Re: Taille d'écran en pixel
Bonjour,
Merci ChristopheV,
Ce que je recherche ressemble plus à ceci:
http://groups.google.com/group/mapinfo- … 4561a9f3df
J'essaie maintenant de déchiffrer le tout.
JF
Hors ligne
#4 Wed 12 October 2011 22:55
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3199
- Site web
Re: Taille d'écran en pixel
Bonjour,
C'est la deuxième solution dont il faut s'inspirer. Je ne savait pas qu'en Mapbasic (c'est ça le nom ?) on pouvait utiliser une instruction DECLARE qui permet l'utilisation des API's. Attention le code fournit retourne la zone client de la fenêtre mapbasic (ie: la fenêtre moins la bordure et la barre de titre)
Je vous commente le code:
Déclaration des constantes WINDOWS utilisées par les API nécessaires (ne rien changer).
Code:
Define LOGPIXELSX 88 ' Logical pixels/inch in X Define LOGPIXELSY 90 ' Logical pixels/inch in Y Define SM_CXSIZEFRAME 32 Define SM_CYSIZEFRAME 33 Define SM_CYHSCROLL 3 Define SM_CXVSCROLL 20 Define SM_CYCAPTION 4
Déclaration de la structure RECT (rectangle pour les APIs
Code:
Type RECT_t left As Integer top As Integer right As Integer bottom As Integer End Type
Déclaration des API (je passe) mais je suis surpris si le type de données Long existe en mapbasic le préférer à Integer !!
Code:
hWnd = SystemInfo(SYS_INFO_MDICLIENTWND)
récupère le handle de fenêtre mapbasic
Code:
nStatus = GetClientRect (hWnd, tRect)
Fonction qui renvoie dans la structure tRect la zone client de la fenêtre de handle hWnd ce en cooredonnées de périphérique (pixel pour faire simple).
Code:
GetSystemMetrics (SM_CXSIZEFRAME)
La fonction getsystemmetrics renvoie en fonction de la constante (ou de la combinaison de constante via un OU logique) une valeur en pixel pour différents paramètres relatifs aux fenêtres:
ici CXSIZEFRAME renvoie l'épaisseur en pixel de la bordure de fenêtre. La consultation de cette fonction sur la MSDN permet de constater que le passage d'un paramètre : SM_CXSCREEN permet d'obtenir la largeur de l'écran en pixels et de ce passer de la fonction GetDEviceCaps.
Noter que tous les paramètres CX... ont leur homologue en CY pour obtenir la valeur verticale.
Donc :
Code:
hWnd = SystemInfo(SYS_INFO_MDICLIENTWND) nStatus = GetClientRect (hWnd, tRect) nWidth = tRect.right - 2*GetSystemMetrics (SM_CXSIZEFRAME) nHeight = tRect.bottom - GetSystemMetrics (SM_CYCAPTION) - 2*GetSystemMetrics (SM_CYSIZEFRAME)
permet d'obtenir la largeur et la hauteur de la fenêtre mapbasic.
Un appel à GetsystemMetrics avec CX et CYSCREEN permet d'obtenir la largeur et la hauteur de l'écran, le tout en pixel.
Après je suppose que
Code:
Set Window FrontWindow() Position (0,0) Width fWidth Height fHeight
Est une fonction Mapbasic, mais allons plus loin et soyons puriste, remplaçons la par l'API
MoveWindows que l'on appellera avec le hwnd obtenu précédemment: cf http://msdn.microsoft.com/en-us/library … 85%29.aspx
Pour l'API getsystemmetrics :
http://msdn.microsoft.com/en-us/library … 85%29.aspx
Si vous avez d'autres questions j'essaierai de répondre, mais pas sur le mapbasic
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne
#5 Wed 12 October 2011 22:56
- Maurice
- Membre
- Lieu: Montpellier
- Date d'inscription: 5 Sep 2005
- Messages: 5331
Re: Taille d'écran en pixel
Bonjour,
Bravo d'avoir exhumé ça !!
La "bonne" solution est celle donnée par Bill Thoen dans son post du 25/08/2008 (complété par un post le lendemain 26/08...à la demande d'un certain Maurice34 que je crois bien connaître ! )
Hors ligne
#6 Wed 12 October 2011 22:57
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3199
- Site web
Re: Taille d'écran en pixel
Grillé par le BOSS !
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne
#7 Wed 26 October 2011 18:57
- jean94
- Participant assidu
- Date d'inscription: 13 Aug 2009
- Messages: 436
Re: Taille d'écran en pixel
Bonjour,
1. J'ai mis au point un petit mbx, je vous le joint en .txt, qui devrait en principe centrer un formulaire peut importe la résolution de l'écran en question. Mais, il ne fonctionne pas sur mon ordi j'ai donc une erreur. Mon écran est 1024x768. Pouvez-vous m'aider à trouver le bug.
2. Comment ferait-on pour utiliser la même logique dans le txt pour centrer un fenêtre. car à ma conaissance les paramêtres des fenêtres son en "pouces" ou "cm" et non en pixel.
Merci,
JF
Hors ligne
#8 Thu 27 October 2011 16:33
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3199
- Site web
Re: Taille d'écran en pixel
Bonjour,
Difficile pour moi de vous répondre car votre mbx fait appel à des fonctions qui sont propres à MAPINFO.
Je ne sais pas comment MAPBASIC gère les coordonnées des fenêtres.
car à ma conaissance les paramêtres des fenêtres son en "pouces" ou "cm" et non en pixel.
Ben ... en VB ou VBA les coordonnées sont gérées en Twips, en Windows pur elles sont gérées en pixel ou plus précisément en coordonnées de périphérique.
Deuxièmement : si vous utilisez une boîte de dialogue standard, c'est un peu particulier dans windows car ce sont des fenêtres modales qui sont appelées via une API spécifique.
Donc : Reprenez l'exemple commenté plus haut ce pour obtenir le handle de la fenêtre MAPINFO puis calculer sa taille (en pixel) puis un "SET WINDOWS FRONT WINDOWS POSITION ..."
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne
#9 Sat 05 November 2011 20:54
- jean94
- Participant assidu
- Date d'inscription: 13 Aug 2009
- Messages: 436
Re: Taille d'écran en pixel
Re-Bonjour,
Je crois avoir trouver une façon rapide de connaitre la taille de l'écran en métrique.
http://msdn.microsoft.com/en-US/library … d.60).aspx Voir HORZSIZE et VERTSIZE.
GetDeviceCaps était déjà utilisé dans le modèle de Mapinfo-L. Or, sur le site que je vien de déposer, il n'y pas de nIndex pour les paramètres HORZSIZE et VERTSIZE non plus pour LOGPIXELSX et LOGPIXELSY, mais nous savons pour les deux derniers qu'il s'agit de 88 et 90. Comment trouver le nIndex de HORZSIZE et VERTSIZE ?
Bref, avec la résolution en pixel/pouce, la largeur et la longeur de l'écran en millimètres et en pixel, je crois avoir tout ce que j'ai de besoin.
Merci.
Hors ligne
#10 Sat 05 November 2011 22:38
- Maurice
- Membre
- Lieu: Montpellier
- Date d'inscription: 5 Sep 2005
- Messages: 5331
Re: Taille d'écran en pixel
le 12/10
... afin que le formulaire soit toujours centré peut importe les paramètres de l'écran...
le 05/11
... afin que le formulaire soit toujours centré peut importe les paramètres de l'écran...
Bravo...mais en relisant le souhait initial il me vient à l'idée que votre formulaire, s'il s'agit d'un "dialog", sera toujours centré par défaut !!
Aide MapBasic pour Dialog: Position x, y specifies the dialog's initial position, in pixels, representing distance from the upper-left corner of MapInfo's work area; if the Position clause is omitted, the dialog appears centered
Hors ligne
#11 Sun 06 November 2011 08:19
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3199
- Site web
Re: Taille d'écran en pixel
Bonjour,
Comment trouver le nIndex de HORZSIZE et VERTSIZE ?
La MSDN est parfois obscure mais avec un peu d'habitude on trouve :
Code:
Global Const DRIVERVERSION = 0 Global Const TECHNOLOGY = 2 Global Const HORZSIZE = 4 Global Const VERTSIZE = 6 Global Const HORZRES = 8 Global Const VERTRES = 10 Global Const BITSPIXEL = 12 Global Const PLANES = 14 Global Const NUMBRUSHES = 16 Global Const NUMPENS = 18 Global Const NUMMARKERS = 20 Global Const NUMFONTS = 22 Global Const NUMCOLORS = 24 Global Const PDEVICESIZE = 26 Global Const CURVECAPS = 28 Global Const LINECAPS = 30 Global Const POLYGONALCAPS = 32 Global Const TEXTCAPS = 34 Global Const CLIPCAPS = 36 Global Const RASTERCAPS = 38 Global Const ASPECTX = 40 Global Const ASPECTY = 42 Global Const ASPECTXY = 44 Global Const LOGPIXELSX = 88 Global Const LOGPIXELSY = 90 Global Const SIZEPALETTE = 104 Global Const NUMRESERVED = 106 Global Const COLORRES = 108 Global Const DT_PLOTTER = 0 Global Const DT_RASDISPLAY = 1 Global Const DT_RASPRINTER = 2 Global Const DT_RASCAMERA = 3 Global Const DT_CHARSTREAM = 4 Global Const DT_METAFILE = 5 Global Const DT_DISPFILE = 6 Global Const CP_NONE = 0 Global Const CP_RECTANGLE = 1 Global Const RC_BITBLT = 1 Global Const RC_BANDING = 2 Global Const RC_SCALING = 4 Global Const RC_BITMAP64 = 8 Global Const RC_GDI20_OUTPUT = &H10 Global Const RC_DI_BITMAP = &H80 Global Const RC_PALETTE = &H100 Global Const RC_DIBTODEV = &H200 Global Const RC_BIGFONT = &H400 Global Const RC_STRETCHBLT = &H800 Global Const RC_FLOODFILL = &H1000 Global Const RC_STRETCHDIB = &H2000
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne
#12 Sun 06 November 2011 16:07
- jean94
- Participant assidu
- Date d'inscription: 13 Aug 2009
- Messages: 436
Re: Taille d'écran en pixel
Bonjour,
@Maurice, j'ai vue aussi, mais je veux comprendre comment le faire manuellement, car ensuite j'aimerais appliquer la même logique à une fenêtre carto et pas toujours centré.
@Christophe, en plein cela, Merci.
JF
Hors ligne
#13 Sun 06 November 2011 16:54
- jean94
- Participant assidu
- Date d'inscription: 13 Aug 2009
- Messages: 436
Re: Taille d'écran en pixel
Bonjour,
Je crois que ces mon dernier commentaire sur se sujet héhé. Bref, j'ai utiliser les fonctions HORZSIZE et VERTSIZE. Elles fonctionne...mal pour moi, j'explique :
Quand j'utilise VERTSIZE, cela me donne 230mm. J'ai sortie le ruban à mesurer et sa fonctionne.
Quand j'utilise HORZTSIZE, cela me donne 306mm. Et la sa fonctionne pas! Mon écran est de type 16:9 et non 4:3 (Le ratio est bon pour 4:3...(306/4)*3 = ±230).
Bref, sa commence à être trop compliqué pour mes connaissances en programmation.
Hors ligne