OVH Cloud OVH Cloud

Comment modifier les boites de dialogue standards?

2 réponses
Avatar
Michael
Bonjour à tous,

j'ai déjà vu dans quelques logiciels des boites de dialogue (Ouvrir,
Enregistrer...) standards, mais sur lesquelles avaient été ajoutées des
élèments supplémentaires, comme des checkboxes, etc...

Pour faire cela, est-ce que je dois recréer de toutes pièces une boite de
dialogue semblable, ou bien est-ce que je peux intercepter le handle et la
trafiquer dans le code?

Merci d'avance

Mike

2 réponses

Avatar
Christian ASTOR
Michael wrote:

j'ai déjà vu dans quelques logiciels des boites de dialogue (Ouvrir,
Enregistrer...) standards, mais sur lesquelles avaient été ajoutées des
élèments supplémentaires, comme des checkboxes, etc...



OFN_ENABLETEMPLATE | OFN_ENABLEHOOK
Avatar
Michael
J'ai le fichier RC suivant, qui me permet d'ajouter un checkbox à la
boite de dialogue standard "Enregistrer"

MYDIALOG DIALOG 0, 0, 200, 40
STYLE WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | DS_3DLOOK | DS_CONTROL
FONT 8, "MS Sans Serif"
BEGIN
CONTROL "Offset audio to maintain a/v sync", 1000
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,5, 15, 180, 5
END

J'ai la classe suivante qui me permet de gérer cette modification:

class TExSaveDialog : public TSaveDialog
{
public:
__fastcall TExSaveDialog(TComponent *Owner): TSaveDialog(Owner)
{ Template = "MYDIALOG"; }

BOOL __fastcall TaskModalDialog(void * DialogFunc, void
*DialogData)
{
((LPOPENFILENAMEA)DialogData)->Flags = ((LPOPENFILENAMEA)
DialogData)->Flags | OFN_ENABLETEMPLATE;
((LPOPENFILENAMEA)DialogData)->lpTemplateName = "MYDIALOG";
((LPOPENFILENAMEA)DialogData)->hInstance = (void*)
FindClassHInstance(this->ClassType());
((LPOPENFILENAMEA)DialogData)->lpfnHook = OFNHookProc;

return TCommonDialog::TaskModalDialog(DialogFunc, DialogData);
}
};

Je l'appelle comme suit:

TExSaveDialog *Dialog = new TExSaveDialog(this);
if (Dialog->Execute())
{
//Récupération de l'état du checkbox
switch (IsDlgButtonChecked(Dialog->Handle,1000))
{
case BST_CHECKED:
ShowMessage("checked");
break;
case BST_INDETERMINATE:
ShowMessage("indeterminate");
break;
case BST_UNCHECKED:
ShowMessage("unchecked");
break;
}

}
delete Dialog;

Le souci est qu'il m'indique tout le temps Unchecked...

Quel est le souci?