Licence Informatique
Module Interface Homme Machine
TD 8
MFC – Architecture basée sur des boîtes de dialogue
L’environnement MFC propose d’autres types d’organisation que les architectures Vue/Document. Il est par exemple possible de développer des applications dont la « fenêtre » principale est basée sur une boîte de dialogue.
Le listing en annexe montre annexe le code « vide » généré lorsqu’on choisit cette option dans l’assistant de création d’applications (avec toutes les options gardées par défaut).
1. Etudier les classes générées en donnant les élément principaux (attributs, méthodes surchargées, …) On souhaite compléter ce squelette d’application pour créer l’applications suivante :
Les boutons OK et Annuler sont automatiquement générés. Les boutons « Haut, Bas, Gauche et Droite » ont été ajoutés pour déplacer le cercle rouge dans la boîte de dialogue.
2. Proposer une implémentation de cette application. Expliquer la démarche à suivre et donner le code C++ à insérer dans le squelette.
// Fichier IHM2Vide.h
class CIHM2VideApp : public CWinApp {
public:
CIHM2VideApp();
public:
virtual BOOL InitInstance();
DECLARE_MESSAGE_MAP() };
extern CIHM2VideApp theApp;
// Fichier IHM2Vide. Cpp
BEGIN_MESSAGE_MAP(CIHM2VideApp, CWinApp) ON_COMMAND(ID_HELP, &CWinApp::OnHelp) END_MESSAGE_MAP()
CIHM2VideApp::CIHM2VideApp() {
}
CIHM2VideApp theApp;
BOOL CIHM2VideApp::InitInstance() {
// InitCommonControlsEx() est requis sur Windows XP si le manifeste de l'application
// spécifie l'utilisation de ComCtl32.dll version 6 ou ultérieure pour activer les
// styles visuels. Dans le cas contraire, la création de fenêtres échouera.
INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize = sizeof(InitCtrls);
// À définir pour inclure toutes les classes de contrôles communs à utiliser
// dans votre application.
InitCtrls.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);
CWinApp::InitInstance();
AfxEnableControlContainer();
// Initialisation standard
// Si vous n'utilisez pas ces fonctionnalités et que vous souhaitez réduire la taille
// de votre exécutable final, vous devez supprimer ci-dessous // les routines d'initialisation spécifiques dont vous n'avez pas besoin.
1
// Changez la clé de Registre sous laquelle nos paramètres sont enregistrés
// TODO : modifiez cette chaîne avec des informations appropriées,
// telles que le nom de votre société ou organisation
SetRegistryKey(_T("Applications locales générées par AppWizard"));
CIHM2VideDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK) {
// TODO : placez ici le code définissant le comportement // lorsque la boîte de dialogue est fermée avec OK
}
else if (nResponse == IDCANCEL) {
// TODO : placez ici le code définissant le comportement lorsque la boîte
// de dialogue est fermée avec Annuler }
return FALSE;
}
// IHM2VideDlg.h : fichier d'en-tête class CIHM2VideDlg : public CDialog {
public:
CIHM2VideDlg(CWnd* pParent = NULL);//
constructeur standard
enum { IDD = IDD_IHM2VIDE_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange*
pDX); // Prise en charge de DDX/DDV protected:
HICON m_hIcon;
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP() };
// IHM2VideDlg.cpp : fichier class CAboutDlg : public CDialog {
public:
CAboutDlg();
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange*
pDX); //
protected:
DECLARE_MESSAGE_MAP() };
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) {}
void CAboutDlg::DoDataExchange(CDataExchange* pDX) {
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) END_MESSAGE_MAP()
CIHM2VideDlg::CIHM2VideDlg(CWnd* pParent =NULL) : CDialog(CIHM2VideDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()-
>LoadIcon(IDR_MAINFRAME);
}
void CIHM2VideDlg::DoDataExchange(CDataExchange*
pDX) {
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CIHM2VideDlg, CDialog) ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP
END_MESSAGE_MAP()
BOOL CIHM2VideDlg::OnInitDialog() {
CDialog::OnInitDialog();
// Ajouter l'élément de menu "À propos de..." au menu Système.
// IDM_ABOUTBOX doit se trouver dans la plage des commandes système.
ASSERT((IDM_ABOUTBOX & 0xFFF0) ==
IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL) {
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty()) {
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
} }
// Définir l'icône de cette boîte de dialogue.
// L'infrastructure effectue cela automatiquement // lorsque la fenêtre principale de l'application n'est pas //une boîte de dialogue
SetIcon(m_hIcon, TRUE);
// Définir une grande icône
2
SetIcon(m_hIcon, FALSE);
// Définir une petite icône
// TODO : ajoutez ici une initialisation supplémentaire return TRUE;
}
void CIHM2VideDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX) {
CAboutDlg dlgAbout;
dlgAbout.DoModal();
} else {
CDialog::OnSysCommand(nID, lParam);
} }
// Si vous ajoutez un bouton Réduire à votre boîte de dialogue, // vous devez utiliser le code ci-dessous
// pour dessiner l'icône. Pour les applications MFC utilisant le //modèle Document/Vue,
// cela est fait automatiquement par l'infrastructure.
void CIHM2VideDlg::OnPaint() {
if (IsIconic()) {
CPaintDC dc(this);
// contexte de périphérique pour la peinture SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// Centrer l'icône dans le rectangle client int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Dessiner l'icône
dc.DrawIcon(x, y, m_hIcon);
} else
{
CDialog::OnPaint();
} }
// Le système appelle cette fonction pour obtenir le curseur à // afficher lorsque l'utilisateur fait glisser
// la fenêtre réduite.
HCURSOR CIHM2VideDlg::OnQueryDragIcon() {
return static_cast<HCURSOR>(m_hIcon);
}
3