Question

Je suis en train d’écrire un programme qui a deux volets (via CSplitter ), mais j’ai du mal à comprendre comment redimensionner les contrôles dans chaque image. Pour plus de simplicité, quelqu'un peut-il me dire comment je le ferais pour une image de base avec un seul contrôle CEdit ?

Je suis presque sûr que cela a à voir avec la fonction CEdit :: OnSize () ... Mais je ne vais vraiment pas nulle part ...

Merci! :)

Était-ce utile?

La solution

Lorsque votre cadre reçoit un message OnSize, il vous donne les nouvelles largeur et hauteur. Vous pouvez simplement appeler la méthode CEdit SetWindowPos en lui transmettant ces valeurs.

Supposons que CMyPane est votre volet de fractionnement et qu'il contient un CEdit que vous avez créé dans OnCreate et appelé 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);
}

Autres conseils

Une fenêtre reçoit le message WM_SIZE (traité par le gestionnaire OnSize dans MFC) immédiatement après son redimensionnement. CEdit :: OnSize n'est donc pas ce que vous recherchez.

Vous devez ajouter le gestionnaire OnSize dans votre classe de cadre et à l'intérieur de ce gestionnaire, comme l'a souligné Rob vous obtiendrez la largeur et la hauteur de la zone cliente de votre cadre, puis vous devrez ajouter le code qui ajuste la taille et la position de votre contrôle.

Quelque chose comme ça

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 (...) // en fait, vous pouvez déplacer, redimensionner ... etc

SetWindowPos est un peu lourd pour cela. MoveWindow a exactement ce dont vous avez besoin.

D'autres ont fait remarquer que WM_SIZE est le message que vous devez gérer et redimensionner les contrôles enfants à ce stade. WM_SIZE est envoyé une fois le redimensionnement terminé.

Vous pouvez également vouloir gérer le message WM_SIZING envoyé pendant le redimensionnement. Cela vous permettra de redimensionner activement les fenêtres enfants pendant que l'utilisateur fait toujours glisser la souris. Ce n’est pas strictement nécessaire pour gérer WM_SIZING, mais cela peut fournir une meilleure expérience utilisateur.

J'utilise la classe CResize de CodeGuru pour redimensionner automatiquement tous les contrôles. Vous indiquez comment vous souhaitez redimensionner chaque contrôle et le travail est fait pour vous.

Le paradigme de redimensionnement consiste à spécifier le degré de déplacement de chaque côté d’un contrôle lors du redimensionnement de la boîte de dialogue.

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

Très pratique lorsque vous avez un grand nombre de commandes de dialogue.

code source

En ce qui concerne les changements de taille de la fenêtre, trois messages de fenêtre peuvent vous intéresser: ON_WM_SIZE () , ON_WM_SIZING () et ON_WM_GETMINMAXINFO () .

As les documents officiels dit:

  • ON_WM_SIZE dont le gestionnaire de messages est :: OnSize () est déclenché après la modification de la taille du CWnd;
  • ON_WM_SIZING dont le gestionnaire de messages est :: OnSizing () est déclenché lorsque la taille de la zone cliente de la fenêtre Visualiseur de clipbord a été modifiée;
  • ON_WM_GETMINMAXINFO dont le gestionnaire de messages est :: OnGetMinMaxInfo () est déclenchée chaque fois que la fenêtre doit connaître la position ou les dimensions maximisées, ou la taille de suivi minimale ou maximale.

Si vous souhaitez limiter la taille du cwnd à une plage, vous pouvez vous référer au message ON_WM_GETMINMAXINFO ; et si vous souhaitez récupérer les modifications de taille en temps réel, vous pouvez vous référer aux deux autres messages.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top