Como obter o tamanho ea posição dos botões da janela de legenda (minimizar, restaurar, fechar)

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

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

Foi útil?

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).

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

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top