2009-01-26 5 views

Odpowiedz

6

Znalazłem funkcję wymagane, aby uzyskać pozycję przycisków w Vista:

http://msdn.microsoft.com/en-us/library/aa969436.aspx (WM_GETTITLEBARINFOEX)

Ten link pokazuje również dane systemowe wymagane, aby uzyskać wszystkie odstępy prawidłowe (wstyd to jest nie jest to jednak pełny obraz dialogowy). Działa to doskonale w systemie Vista, a głównie w XP (w XP jest nieco za dużo luki między przyciskami).

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

Jeśli link jest uszkodzony można spróbować archiwum internetowego (dzięki Dan Groom!):
http://web.archive.org/web/20070301202835/http://shellrevealed.com/photos/blog_images/images/4538/original.aspx

+0

Niestety, odsłonięty link jest teraz uszkodzony - jeśli masz tę informację w innym miejscu, możesz dodać ją bezpośrednio do odpowiedzi? Dzięki. –

3

GetSystemMetrics podaje wszystkie te informacje. Aby narysować w obrębie dekoracji okna, użyj GetWindowDC.

+0

Co ze stanowiskiem? –

+0

Jeśli rysujesz własne elementy sterujące, nie powinieneś sam wybierać tych wartości zgodnie ze swoimi potrzebami? – fbonnet

+0

Cóż, rysuję własne tła itp., A na XP narysujemy własne przyciski min/restore/close - jednak w systemie Vista chcemy narysować odpowiednie przyciski widoków w odpowiednim miejscu. –

0

GetSystemMetrics funkcja powinna ci pomóc w rozmiarze (SM_CYSIZE i SM_CXSIZE parametry).

EDIT

nie jestem pewien, że można znaleźć pozycje z tej funkcji, ale można spojrzeć na emule source code, że udało się dodać przycisk do okna podpisie.

+0

Co ze stanowiskiem? –

1

Poniższy kod jest adaptacją "Global Titlebar Hook" przykład znalazłem w http://www.catch22.net/content/snippets. Zmodyfiowałem ten przykład, aby był przyjazny dla MFC. Zwraca współrzędną X lewego przycisku paska tytułowego, ale można go łatwo zmodyfikować, aby znaleźć położenie któregokolwiek z przycisków.

#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(); 
} 
} 
Powiązane problemy