2010-08-20 7 views
1

Je dois obtenir en quelque sorte la largeur de la bordure d'une fenêtre (fixe) (la verticale). Par défaut sur WinXP c'est assez mince mais sur Win7 avec Aero on, c'est beaucoup plus épais.Taille de la bordure d'une fenêtre fixe

Je pensais que GetSystemMetrics ferait l'affaire, mais il semble qu'il retourne les mêmes valeurs pour les systèmes XP et Win7, j'ai vérifié les paramètres suivants:

SM_CXBORDER 
SM_CXEDGE 
SM_CYFIXEDFRAME 
SM_CYBORDER 
SM_CXFIXEDFRAME 

Mais comme je l'ai écrit, ils retournent les mêmes valeurs pour les deux OS, peu importe l'épaisseur de la bordure de la fenêtre verticale. La fenêtre a été créée avec les drapeaux WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX si cela aide (ce n'est pas important).

Merci pour vos commentaires.

Kra

Répondre

0

Probablement GetClientRect est ce que vous avez besoin du tout. Quoi qu'il en soit, vous pouvez les calculer les dimensions de retour par GetClientRect et GetWindowRect

pseudocode:

wr = GetWindowRect() 
cr = GetClientRect() 

left_border_width = cr.left 
right_border_width = wr.right - wr.left - cr.right 
+0

qui ne fonctionne pas non plus, malheureusement. Je reçois le résultat 6 pour les deux systèmes d'exploitation. Je n'ai pas vraiment besoin de calculer la superficie du client ou quelque chose comme ça. J'ai besoin d'aligner une autre fenêtre à celle-ci et je dois considérer l'épaisseur de la bordure verticale droite pour le faire (je connais la largeur de fenêtre utilisée dans CreateWindowEx mais qui ne contient pas de bordure). Basé sur votre idée, j'ai également essayé d'utiliser GetWindowRect (hwnd, & rect) et d'aligner l'autre fenêtre sur rect.right mais aussi loin d'une bordure. – Kra

+0

Ensuite, il doit être 6. Pouvez-vous donner un exemple que cette valeur est erronée (capture d'écran)? Rappelez-vous qu'une ombre ne fait pas partie de la bordure de la fenêtre. – adf88

+0

Voici à quoi cela ressemble dans Win7, notez que la deuxième fenêtre chevauche la bordure: http://img17.imageshack.us/img17/9882/win7i.png Voici à quoi ça ressemble dans XP, c'est correctement aligné: http://img838.imageshack.us/img838/3656/85193079.png Cette valeur dans la boîte de message est la suivante: GetClientRect (hMainWnd, & smaller); GetWindowRect (hMainWnd, & plus grand); MsgBox val = plus grand.pièce - plus grand.pièce - plus petit.proissant); Notez que je 2ème fenêtre coin gauche est aligné avec une valeur fixe, il n'est pas calculé .. mais .. après je sais comment calculer la frontière, je vais la mettre en œuvre :) – Kra

0

GetWindowRect() renvoie les coordonnées du DESKTOP comme origine. En haut à gauche de votre écran. renvoie les coordonnées de la zone client de la fenêtre que vous avez appelé contre

GetClientRect().

Vous avez de transformer les coords d'un à l'autre.

Comme adf88 dit, cela se fait avec ScreenToClient et ClientToScreen. "Screen" étant le bureau.

Levez les yeux vers GetWindowRect(), GetClientRect(), ScreenToClient() et ClientToScreen().

HTH

+0

Merci pour votre commentaire, mais cela ne marche toujours pas le problème. La largeur de la zone de la fenêtre et la largeur de la zone client sont identiques sur deux fenêtres identiques, même lorsque l'épaisseur de la bordure est différente. Cela me fait penser que la zone de fenêtre ne contient tout simplement pas de bordure (entière). – Kra

+0

Regardez ensuite toutes les fonctions de type "NC". NC signifie non-client. Exemple: WM_NCHITTEST, WM_NCLBUTTONDBLCLK, WM_NCLBUTTONUP, WM_NCPAINT, etc. – JustBoo

5

Eh bien, après avoir passé quelque temps là-dessus, voici un code qui semble renvoyer la largeur réelle de la frontière (si quelqu'un a besoin jamais il):

NONCLIENTMETRICS ncm; 
OSVERSIONINFO OS; 

OS.dwOSVersionInfoSize = sizeof (OSVERSIONINFO); 

GetVersionEx (&OS); 

if (OS.dwMajorVersion < 6) 
{ 
    ncm.cbSize = sizeof (ncm) - sizeof(ncm.iPaddedBorderWidth); 
    SystemParametersInfo (SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0); 
    BorderWidth = ncm.iBorderWidth; 
} 
else 
{ 
    ncm.cbSize = sizeof (ncm); 
    SystemParametersInfo (SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0); 
    BorderWidth = ncm.iBorderWidth + ncm.iPaddedBorderWidth; 
} 

Je crois qu'il ya encore un petit pépin mais c'est acceptable pour moi :)) Le problème que je connais, c'est qu'il calcule la largeur de la bordure d'une fenêtre de taille, si vous avez une fenêtre popup, sa taille est légèrement différente (mais par exemple sur XP il semble vous ne pouvez pas définir la taille de la bordure de la fenêtre contextuelle, vous pouvez le faire uniquement pour une fenêtre de taille importante).

+0

OK. J'ai calculé des frontières pendant des années en utilisant les "autres" informations données. Mais si cela fonctionne, c'est cool aussi. :-) – JustBoo

2

Si le problème sous-jacent est, vous devez calculer la taille « fenêtre » pour parvenir à un rect client desirect, puis passez le calcul.

AdjustWindowRectEx est beaucoup plus évolutive. Même AdjustWindowRect doit faire quelques suppositions car, sans une fenêtre réelle, il ne connaît pas les barres de défilement ou les menus d'enveloppement: Envoyer une fenêtre existante un message WM_NCCALCSIZE et DefWindowProc calculera et retournera la zone client qui en résulte. Gonflez la fenêtre rect par la différence entre la zone client calculée et requise.

+0

C'est ce que vous voulez. –

2

Kra, le mot clé est DwmApi (pour Vista et plus récent):

  1. DwmIsCompositionEnabled
  2. DwmGetWindowAttribute (DWMWA_EXTENDED_FRAME_BOUNDS)
0

Le plus proche que je peux obtenir est la suivante: -
top: GetSystemMetrics(SM_CXPADDEDBORDER) + GetSystemMetrics(SM_CYDLGFRAME) + GetSystemMetrics(SM_CYMENU) + GetSystemMetrics(SM_CYCAPTION)
fond: GetSystemMetrics(SM_CXPADDEDBORDER) + GetSystemMetrics(SM_CYDLGFRAME)
gauche ou à droite: GetSystemMetrics(SM_CXPADDEDBORDER) + GetSystemMetrics(SM_CXDLGFRAME)

Ajouter ces valeurs à la taille de la fenêtre pour obtenir la taille du client souhaité.

Questions connexes