Wie Größe und Position der Fenster Beschriftung Schaltflächen erhalten (minimieren, wiederherstellen, in der Nähe)

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

Frage

Gibt es einen API-Aufruf die Größe und Position der Fensterbeschriftung Tasten zu bestimmen? Ich versuche, Vista-Stil Beschriftung Schaltflächen auf einen Eigentümer gezeichnet Fenster zu zeichnen. Ich bin der Umgang mit C / C ++ / mfc.

Edit: Hat jemand ein Codebeispiel hat die Schließen-Schaltfläche ziehen

War es hilfreich?

Lösung

Ich habe die Funktion gefunden erforderlich, um die Position der Schaltflächen in Vista zu bekommen: WM_GETTITLEBARINFOEX

Dieser Link zeigt auch die Systemmetriken richtig alle den Abstand bekommen erforderlich (Schande es ist kein Volldialogbild obwohl). Das funktioniert perfekt in Vista, und vor allem in XP (in XP gibt es etwas zu viel von einer Lücke zwischen den Tasten).

Andere Tipps

GetSystemMetrics gibt all diese Informationen. So zeichnen Sie in der Fensterdekoration, benutzen GetWindowDC .

Der folgende Code von "Global Titlebar Hook" Beispiel angepasst ist, ich unter http: // www .catch22.net / content / snippets . Ich änderte das Beispiel, um es MFC freundlich. Es gibt die X-Koordinate der äußersten linken titlebar Taste, aber es leicht modifiziert werden könnte, um die Position einen der Tasten zu finden.

#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 Funktion sollten Sie mit einer Größe helfen (SM_CYSIZE und SM_CXSIZE Parameter).

Bearbeiten

Ich bin mir nicht sicher, dass Sie Positionen mit dieser Funktion finden können, aber Sie vielleicht einen Blick auf emule Quellcode herunterladen , sie haben es geschafft, eine Schaltfläche, um ein Fenster Beschriftung hinzuzufügen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top