Come ottenere dimensioni e posizione dei pulsanti dei sottotitoli (minimizza, ripristina, chiudi)
-
20-08-2019 - |
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?
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).
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();
}
}
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.