Como obter o tamanho ea posição dos botões da janela de legenda (minimizar, restaurar, fechar)
-
20-08-2019 - |
Pergunta
Existe uma chamada de API para determinar o tamanho ea posição dos botões da janela de legenda? Eu estou tentando chamar de estilo vista de legenda botões em uma janela de proprietário desenhado. Estou lidando com c / c ++ / mfc.
Edit:? Alguém tem um exemplo de código para desenhar o botão de fechar
Solução
Eu encontrei a função necessária para obter a posição dos botões na vista: WM_GETTITLEBARINFOEX
Este link também mostra as métricas de sistema necessários para obter todo o espaçamento correto (vergonha não é uma imagem de diálogo cheia embora). Isso funciona perfeitamente no Vista, e principalmente no XP (no XP existe um pouco demasiado de uma lacuna entre os botões).
Outras dicas
GetSystemMetrics dá todas essas informações. Para desenhar dentro da decoração da janela, use GetWindowDC .
O código a seguir é adaptado a partir do exemplo "global Titlebar gancho" Encontrei em http: // www .catch22.net / content / trechos . Eu modifiquei o exemplo para torná-lo MFC-friendly. Ele retorna a coordenada X do botão mais à esquerda da barra de título, mas poderia ser facilmente modificado para encontrar a posição de qualquer um dos botões.
#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 função deve ajudá-lo com um tamanho (SM_CYSIZE e parâmetros SM_CXSIZE).
Editar
Eu não estou certo que você pode encontrar posições com esta função, mas você pode dar uma olhada em emule código fonte , eles conseguiram adicionar um botão para a legenda da janela.