Come ottenere dimensioni e posizione dei pulsanti dei sottotitoli (minimizza, ripristina, chiudi)

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

Domanda

Esiste una chiamata API per determinare la dimensione e la posizione dei pulsanti di didascalia della finestra? Sto cercando di disegnare pulsanti di didascalia in stile Vista su una finestra disegnata dal proprietario. Ho a che fare con c / c ++ / mfc.

Modifica: qualcuno ha un esempio di codice per disegnare il pulsante di chiusura?

È stato utile?

Soluzione

Ho trovato la funzione richiesta per ottenere la posizione dei pulsanti in vista: WM_GETTITLEBARINFOEX

Questo link mostra anche le metriche di sistema richieste per ottenere tutta la spaziatura corretta (peccato però che non sia un'immagine di dialogo completa). Funziona perfettamente in Vista, e principalmente in XP (in XP c'è un po 'troppo spazio tra i pulsanti).

 Da http://shellrevealed.com/photos/blog_images/images/4538/original.aspx

Altri suggerimenti

GetSystemMetrics fornisce tutte queste informazioni. Per disegnare all'interno della decorazione della finestra, utilizzare GetWindowDC .

Il seguente codice è adattato dalla " Global Titlebar Hook " esempio che ho trovato su http://www.catch22.net/content/snippets . Ho modificato l'esempio per renderlo compatibile con MFC. Restituisce la coordinata X del pulsante più a sinistra della barra del titolo, ma potrebbe essere facilmente modificata per trovare la posizione di uno qualsiasi dei pulsanti.

#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();
 }
}
La funzione

GetSystemMetrics dovrebbe aiutarti con una dimensione (SM_CYSIZE e Parametri SM_CXSIZE).

Modifica

Non sono sicuro che puoi trovare posizioni con questa funzione, ma puoi dare un'occhiata a codice sorgente emule , sono riusciti ad aggiungere un pulsante a una didascalia della finestra.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top