Pergunta

Eu estou escrevendo um programa que tem dois painéis (via CSplitter), porém estou tendo problemas para descobrir para fora para redimensionar os controles em cada quadro. Para simplificar, alguém pode me dizer como eu iria fazê-lo para uma estrutura básica com um único controle CEdit?

Estou bastante certeza de que ele tem a ver com a função CEdit::OnSize() ... Mas eu realmente não estou indo a lugar algum ...

Obrigado! :)

Foi útil?

Solução

Quando seu quadro recebe uma mensagem de OnSize ele vai te dar a nova largura e altura -. Você pode simplesmente chamar o método SetWindowPos CEdit passando estes valores

Suponha CMyPane é seu painel divisor e contém um CEdit você criou na OnCreate chamado m_wndEdit:

void CMyPane::OnSize(UINT nType, int cx, int cy)
{
    m_wndEdit.SetWindowPos(NULL, 0, 0, cx, cy, SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER);
}

Outras dicas

A janela recebe mensagem WM_SIZE (que é processado pelo manipulador OnSize no MFC) imediatamente depois que foi redimensionada, de modo CEdit :: OnSize não é o que você está procurando.

Você deve adicionar o manipulador de OnSize em sua classe de quadro e dentro deste manipulador como Rob apontou você vai ter largura e altura da área de cliente do seu quadro, em seguida, você deve adicionar o código que ajusta o tamanho ea posição de seu controle.

Algo como isto

void MyFrame::OnSize(UINT nType, int w, int h)
{
    // w and h parameters are new width and height of your frame
    // suppose you have member variable CEdit myEdit which you need to resize/move
    myEdit.MoveWindow(w/5, h/5, w/2, h/2);
}

GetDlgItem (IDC_your_slidebar) -> SetWindowPos (...) // na verdade você pode mover, redimensionar, etc ...

SetWindowPos é um pouco pesado para esta finalidade. MoveWindow tem apenas o que é necessário.

Outros têm apontado que WM_SIZE é a mensagem que deve manipular e redimensionar os controles filho naquele momento. WM_SIZE é enviado após o redimensionamento tenha terminado.

Você também pode querer manipular a mensagem WM_SIZING que é enviado enquanto o redimensionamento está em andamento. Isso permitirá que você redimensionar ativamente as janelas filho, enquanto o usuário ainda está arrastando o mouse. A sua não é estritamente necessário para lidar com WM_SIZING mas pode fornecer uma melhor experiência do usuário.

Eu uso classe CResize de CodeGuru para redimensionar todos os controles automaticamente. Você diga como você quer cada controle para ser redimensionada e ele faz o trabalho para você.

O paradigma de redimensionamento é especificar o quanto cada lado de um controle irá mover quando o diálogo é redimensionado.

SetResize(IDC_EDIT1, 0,   0,   0.5, 1);
SetResize(IDC_EDIT2, 0.5, 0,   1,   1);

Muito útil quando você tem um grande número de controles de diálogo.

código fonte

Quando se trata das alterações tamanho da janela, existem três mensagens de janela que você pode estar interessado em:. ON_WM_SIZE(), ON_WM_SIZING() e ON_WM_GETMINMAXINFO()

Como os documentos oficiais diz:

  • ON_WM_SIZE cujo manipulador de mensagem é ::OnSize() é acionado após o tamanho do CWnd mudou;
  • ON_WM_SIZING cujo manipulador de mensagem é ::OnSizing() é acionado quando o tamanho da área de cliente da janela do clipbord-viewer mudou;
  • ON_WM_GETMINMAXINFO cujo manipulador de mensagem é ::OnGetMinMaxInfo() é acionado sempre que as necessidades de janela para saber a posição maximizada ou dimensões, ou o tamanho máximo de rastreamento mínimo ou.

Se você quiser restringir o tamanho do cwnd a algum intervalo, você pode se referir a mensagem ON_WM_GETMINMAXINFO; e se você deseja recuperar as alterações de tamanho em tempo real, você pode se referir a outras duas mensagens.

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