banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#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 wink


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 ! big_smile)

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


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

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

jean94 a écrit:

... afin que le formulaire soit toujours centré peut importe les paramètres de l'écran...


le 05/11

jean94 a écrit:

... 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 !! smile
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

 

Pied de page des forums

Powered by FluxBB