Comment obtenir la taille et la position des boutons de légende de la fenêtre (minimiser, restaurer, fermer)

StackOverflow https://stackoverflow.com/questions/479332

Question

Y at-il un appel d'API pour déterminer la taille et la position des boutons de légende de fenêtre? Je suis en train de dessiner des boutons de légende de style vista sur une fenêtre drawn propriétaire. Je traite avec c / c ++ / SFM.

Edit:? Quelqu'un at-il un exemple de code pour dessiner le bouton Fermer

Était-ce utile?

La solution

J'ai trouvé la fonction nécessaire pour obtenir la position des boutons dans vista: WM_GETTITLEBARINFOEX

Ce lien indique également les mesures nécessaires du système pour obtenir toute l'espacement correct (dommage qu'il n'est pas une image complète de dialogue bien). Cela fonctionne parfaitement dans Vista, et surtout dans XP (dans XP il y a un peu trop d'un écart entre les touches).

Autres conseils

GetSystemMetrics donne toutes ces informations. Pour dessiner au sein de la décoration de fenêtre, utilisez GetWindowDC .

Le code suivant est adapté de la quot &; & Crochet Global Titlebar quot; par exemple, j'ai trouvé à http://www.catch22.net/content/snippets . J'ai modifié l'exemple pour le rendre MFC convivial. Il retourne la coordonnée X du bouton gauche de la barre de titre, mais il pourrait facilement être modifié pour trouver la position de l'un des boutons.

#define B_EDGE 2

int CMyWindow::CalcRightEdge()
{
 if(GetStyle() & WS_THICKFRAME)
  return GetSystemMetrics(SM_CXSIZEFRAME);
 else
  return GetSystemMetrics(SM_CXFIXEDFRAME);
}


int CMyWindow::findNewButtonPosition()
{
 int   nButSize  = 0;
 DWORD dwStyle   = GetStyle();
 DWORD dwExStyle = GetExStyle();

 if(dwExStyle & WS_EX_TOOLWINDOW)
 {
  int nSysButSize = GetSystemMetrics(SM_CXSMSIZE) - B_EDGE;

  if(GetStyle() & WS_SYSMENU) 
   nButSize += nSysButSize + B_EDGE;

  return nButSize + CalcRightEdge();
 }
 else
 {
  int nSysButSize = GetSystemMetrics(SM_CXSIZE) - B_EDGE;

 // Window has Close [X] button. This button has a 2-pixel
 // border on either size
  if(dwStyle & WS_SYSMENU) 
   nButSize += nSysButSize + B_EDGE;

 // If either of the minimize or maximize buttons are shown,
 // Then both will appear (but may be disabled)
 // This button pair has a 2 pixel border on the left
  if(dwStyle & (WS_MINIMIZEBOX | WS_MAXIMIZEBOX) )
   nButSize += B_EDGE + nSysButSize * 2;

 // A window can have a question-mark button, but only
 // if it doesn't have any min/max buttons
  else if(dwExStyle & WS_EX_CONTEXTHELP)
   nButSize += B_EDGE + nSysButSize;

 // Now calculate the size of the border...aggghh!
  return nButSize + CalcRightEdge();
 }
}

GetSystemMetrics fonction devrait vous aider avec une taille (SM_CYSIZE et SM_CXSIZE paramètres).

EDIT

Je ne suis pas sûr que vous pouvez trouver des postes avec cette fonction, mais vous pouvez jeter un oeil à emule code source , ils ont réussi à ajouter un bouton à une légende de la fenêtre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top