Mots-clés : boîte de dialogue, boîte de dialogue, résidable
1. Problème soulevé
Le problème provient de Stanley_Xu, dans l'espoir d'obtenir uniquement le bouton Fermer (il peut également aider), il n'y a pas d'icône pour le programme en haut à gauche et la boîte de dialogue est capable de modifier la taille de la fenêtre.
Les propriétés Borderstyle et BorderCons sont définies pour TFORM dans VCL afin de simplifier le réglage des styles de fenêtre (sinon, les fonctions API telles que SetWindowlong et GetWindowlong doivent être appelées). La définition et la description de TformBorderstyle et Tbordericon sont les suivantes:
Valoriser le sens
BSDIALOG NON RESSIZABLE; BONDE DE LA BOX DE DIALIQUE STANDARD // Impossible de modifier la taille
BSSIGLS NON RESSIZABLE;
BSNONENOTRÉSISIBLE;
bordure standard bssizable résidante standard
bstoolwindow comme bssingle mais avec une légende plus petite
bssizetoolwin comme bssizable avec une légende plus petite
type tbordericon = (bisystemmenu, biminimize, bimaximiser, bihelp);
Tbordericons = ensemble de tbordericon;
Valoriser le sens
BisystemMenu Le formulaire a un menu de contrôle (également connu sous le nom de menu système).
biminimer le formulaire a un bouton minimiser
bimaximiser le formulaire a un bouton maximiser
Bihelp Si Borderstyle est bsdialog ou biminimize et bimaximiser est exclu, un point d'interrogation apparaît dans la barre de titre du formulaire et lorsqu'il a cliqué, le curseur se transforme en crhelp;
De toute évidence, Borderstyle et Borderricons ne peuvent répondre que des besoins généraux, et il est impossible d'implémenter les boîtes de dialogue qui peuvent modifier les tailles.
D'une manière générale, si je veux obtenir une fenêtre qui ne peut pas être maximisée mais que je peux modifier la taille, je définis Borderstyle sur BSsizable, supprime la biminimiez et bimaximiser des frontières, et le résultat est comme ceci: la fenêtre peut être modifiée, mais il y a Une icône dans le coin supérieur gauche ,:
Figure 1 boîte de dialogue avec icône
Notez qu'il y a une icône dans le coin supérieur gauche.
Notre objectif est les deux effets ci-dessous.
Figure 2 Open Boîte de dialogue Fichier
Figure 3 Boîte de dialogue de dossiers de navigation
2. La moitié du problème est résolu
J'ai recherché MSDN et j'ai trouvé un article qui vous apprend à concevoir des pages de propriétés qui peuvent changer la taille (en MFC, CProperTysheet apparaît comme une sous-page CPRoperTypage, qui hérite de CDIALOG et ne peut généralement pas modifier la taille) "comment concevoir une propriété Resiable MFC Feuille, la méthode introduite dans l'article consiste à modifier le style de fenêtre avant la création de la page de propriété, puis à traiter manuellement le message WM_Size.
INT RAPPEL CMYPROPERTYSHEET :: XMNPROPSHETETCALLBACK (HWND HWND, Message Uint, lparam lparam)
{
EXTERN INT RAPPEL AFXPROPSHETETCALLBACH (HWND, Message UInt, lparam lparam);
// XMN: appelez le rappel de MFC
int nres = afxpropSheetCallback (hwnd, message, lparam);
commutateur (message)
{
Case PSCB_PRECREATE:
// Définissez nos propres styles de fenêtre
((LpdlgTemplate) lparam) -> style | = (ds_3dlook | ds_setfont
| WS_THICKFRAME |
casser;
}
retour nres;
}
J'ai essayé d'utiliser la même méthode dans une forme de VCL. Réglez Borderstyle sur BSDialog lors de la conception, puis surchargez la méthode CreateParams. Mais le résultat est que la boîte de dialogue devient une bordure épaisse (car elle a le style WS_THICKFRAME), la souris peut changer automatiquement après avoir déménagé à chaque bordure, et il n'y a pas d'icône dans le coin supérieur gauche, mais la fenêtre ne peut pas changer sa taille (Le processus de traitement des messages WM_Size ajouté n'est pas déclenché). Quel est le problème?
Figure 4 boîte de dialogue qui n'est pas encore complètement satisfaisante
3. Résoudre le problème
J'ai vérifié le code source des formations.pas et trouvé le problème. Il existe un processus d'intégration ModifySystemMenu dans le processus de traitement des messages WM_NCREATE de TCustomForm, qui est utilisé pour modifier le menu système de la forme. Notez que le texte rouge ci-dessous indique "Faire ressembler le menu système à une boîte de dialogue". Les phrases suivantes de code ont supprimé les éléments du menu du système au point où seul "bouger" et "fermer".
Procédure tCustomForm.wmnccreate (message var: twmnccreate);
Procédure ModifySystemMenu;
var
Sysmenu: hmenu;
Commencer
...
{Modifier le menu système pour ressembler davantage à ce qu'il soit à}
Sysmenu: = getSystemMenu (manche, false);
Si fborderstyle = bsdialog alors
Commencer
{Faire ressembler le menu du système à une boîte de dialogue qui n'a que
Se déplacer et fermer}
DeleteMenu (Sysmenu, SC_TaskList, MF_BYCommand);
Deletemenu (Sysmenu, 7, MF_BYPOSITION);
Deletemenu (Sysmenu, 5, MF_BYPOSITION);
Deletemenu (sysmenu, sc_maximize, mf_bycommand);
Deletemenu (sysmenu, sc_minimize, mf_bycommand);
Deletemenu (sysmenu, sc_size, mf_bycommand);
Deletemenu (sysmenu, sc_restore, mf_bycommand);
fin d'autre
...
fin;
Commencer
hérité;
SetMenu (fmenu);
Sinon (csdesigning dans ComponentState) alors modifystemMenu;
fin;
Par conséquent, le problème est que parce que "SC_SIZE" est supprimé, le style de fenêtre a une déformation: il y a WS_THICKFRAME (la taille de la fenêtre peut être modifiée), mais elle ne répond pas au message WM_Size (SC_SIZE est supprimé).
La solution est très simple: implémentez votre propre processus de traitement des messages WM_NCREATE et modifiez manuellement le menu système.
procédure tzocdlgresizable.wmnccreate (message var: twmnccreate);
// Les codes suivants sont copiés à partir de Form.PAS LINE 4047, Delphi 7 SP1.
Procédure ModifySystemMenu;
var
Sysmenu: hmenu;
Commencer
Sysmenu: = getSystemMenu (manche, false);
{Faire ressembler le menu du système à une boîte de dialogue qui n'a que
Commandes de déplacement, de taille et de fermeture}
DeleteMenu (Sysmenu, SC_TaskList, MF_BYCommand);
Deletemenu (Sysmenu, 7, MF_BYPOSITION);
// Ne supprimez pas la commande séparée avant de fermer.
// DeleteMenu (Sysmenu, 5, MF_BYPOSITION);
Deletemenu (sysmenu, sc_maximize, mf_bycommand);
Deletemenu (sysmenu, sc_minimize, mf_bycommand);
{Ne supprimez pas la commande de taille, sinon nous perdrons le
capacité de redimensionner la boîte de dialogue.
// Deletemenu (sysmenu, sc_size, mf_bycommand);
Deletemenu (sysmenu, sc_restore, mf_bycommand);
fin;
Commencer
{Skip TCustomForm's WM_NCcreate Handler, qui supprime
la commande de taille du menu système.}
hérité defaulthandler (message);
// traitant du menu du système à notre manière.
ModifySystemMenu;
fin;
4. Classe tzocdlgresable
La solution finale que je résume en tant que classe héritée de TFORM. Tzocdlgresisenable.
BTW: J'ai également ajouté un attribut sizegrip à tzocdlgreizable.
Figure 5 Boîte de dialogue avec tailleur sans icône
Télécharger (EXE et code source)
http://www.zocsoft.com/temp/Resizable_dialog.rar
5. Matériaux de référence:
MSDN: Comment concevoir une feuille de propriété MFC redonnable
Adresse de devis: "Implémentation d'une boîte de dialogue qui peut modifier la taille à Delphi"