I- Applications MDI - Freedcanl.free.fr/Etudes/COURS_L3/COURS_ANNEE_DERNIERE/... · 2007-09-24 ·...

14
1 L3 informatique Interface Homme Machine 1 I- Applications MDI II- Vues fractionnables III- Application non Doc/View IV- Contrôles ActiveX V- Manipulation des images Bitmaps L3 informatique Interface Homme Machine 2 I- Applications MDI Généralités Liaison d’un document avec ses vues Création des modèles de document Particularités des applications MDI Synchronisation des vues multiples d’un document Exemple L3 informatique Interface Homme Machine 3 Les applications MDI A la différence d’une application SDI, une application MDI prend en charge l’ouverture simultanée de plusieurs documents, dont chacun peut contenir plusieurs vues. En plus des 4 classes standards (Application, Frame, Doc et vue) devant exister dans toute application MFC, les applications MDI exposent une nouvelle classe CChildFrame. La classe CChildFrame est héritière de la classe MFC CMDIChildWnd Un objet CChildFrame crée la fenêtre cadre enfant de chaque vue d’un document La figure suivante montre une app. MDI avec deux documents ouverts avec deux vues ouvertes pour chaque document. Pour ouvrir un nouveau document : Fichier, Nouveau Pour ouvrir une nouvelle vue pour un document : fenêtre, Nouvelle Fenêtre L3 informatique Interface Homme Machine 4 Fenêtre crée par CMainFrame Barre de menus et barre d’outils crées par CMainF rame, mais partagées Fen. créées par CChildFrame Deux vues du document Sketch1 Deux vues du document Sketch2 L3 informatique Interface Homme Machine 5 Liaison d’un document avec ses vues Les MFC intègrent un mécanisme permettant de lier un document avec ses vues, et chaque fenêtre cadre avec une vue active. Un objet document gère une liste de ptrs sur les vues qui lui sont associées Un objet vue contient un ptr désignant son document Chaque fenêtre cadre possède un ptr sur la vue active La coordination entre une fen. cadre, un doc. et une vue est assurée par la classe MFC modèles de document (document template) Il existe un modèle de document pour chq doc du programme Plus précisément, un modèle de document sert à créer les documents et les fenêtres cadre, qui servent elles-mêmes à créer les vues Le modèle de document est créé par l’application, dans la fonction InitInstance de la classe application SDI : CSingleDocTemplate est la classe qui définit le modèle de doc. MDI : CMultiDocTemplate est la classe qui définit le modèle de doc. L3 informatique Interface Homme Machine 6 Création des modèles de document Application SDI CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CTestSourisDoc), RUNTIME_CLASS(CMainFrame), RUNTIME_CLASS(CTestSourisView)); AddDocTemplate(pDocTemplate); Application MDI CMultiDocTemplate* pDocTemplate; pDocTemplate = new CMultiDocTemplate( IDR_SKETCHTYPE, RUNTIME_CLASS(CSketcherDoc), RUNTIME_CLASS(CChildFrame), RUNTIME_CLASS(CSketcherView)); AddDocTemplate(pDocTemplate);

Transcript of I- Applications MDI - Freedcanl.free.fr/Etudes/COURS_L3/COURS_ANNEE_DERNIERE/... · 2007-09-24 ·...

Page 1: I- Applications MDI - Freedcanl.free.fr/Etudes/COURS_L3/COURS_ANNEE_DERNIERE/... · 2007-09-24 · Deux vues Ddu document Sketch1 euxv s do cmn tSk h2 L3 informatique Interface Homme

1

L3 informatique Interface Homme Machine 1

I- Applications MDI

II- Vues fractionnables

III- Application non Doc/View

IV- Contrôles ActiveX

V- Manipulation des images Bitmaps

L3 informatique Interface Homme Machine 2

I- Applications MDI

Généralités Liaison d’un document avec ses vues Création des modèles de document Particularités des applications MDI Synchronisation des vues multiples d’un document Exemple

L3 informatique Interface Homme Machine 3

Les applications MDI A la différence d’une application SDI, une application MDI prend en charge

l’ouverture simultanée de plusieurs documents, dont chacun peut contenirplusieurs vues.

En plus des 4 classes standards (Application, Frame, Doc et vue) devantexister dans toute application MFC, les applications MDI exposent unenouvelle classe CChildFrame.

La classe CChildFrame est héritière de la classe MFC CMDIChildWnd Un objet CChildFrame crée la fenêtre cadre enfant de chaque vue d’un

document

La figure suivante montre une app. MDI avec deux documents ouverts avecdeux vues ouvertes pour chaque document.

Pour ouvrir un nouveau document : Fichier, Nouveau Pour ouvrir une nouvelle vue pour un document : fenêtre, Nouvelle Fenêtre

L3 informatique Interface Homme Machine 4

Fenêtre crée par CMainFrame

Barre de menus et barre d’outils crées par CMainF rame, mais partagées

Fen. créées par CChildFrame

Deux vues du document Sketch1 Deux vues du document Sketch2

L3 informatique Interface Homme Machine 5

Liaison d’un document avec ses vues

Les MFC intègrent un mécanisme permettant de lier un document avec sesvues, et chaque fenêtre cadre avec une vue active.

Un objet document gère une liste de ptrs sur les vues qui lui sont associées Un objet vue contient un ptr désignant son document Chaque fenêtre cadre possède un ptr sur la vue active La coordination entre une fen. cadre, un doc. et une vue est assurée par la

classe MFC modèles de document (document template) Il existe un modèle de document pour chq doc du programme Plus précisément, un modèle de document sert à créer les documents et les

fenêtres cadre, qui servent elles-mêmes à créer les vues Le modèle de document est créé par l’application, dans la fonction

InitInstance de la classe application

SDI : CSingleDocTemplate est la classe qui définit le modèle de doc. MDI : CMultiDocTemplate est la classe qui définit le modèle de doc.

L3 informatique Interface Homme Machine 6

Création des modèles de document

Application SDICSingleDocTemplate* pDocTemplate;pDocTemplate = new CSingleDocTemplate(

IDR_MAINFRAME,RUNTIME_CLASS(CTestSourisDoc),RUNTIME_CLASS(CMainFrame),

RUNTIME_CLASS(CTestSourisView));AddDocTemplate(pDocTemplate);

Application MDICMultiDocTemplate* pDocTemplate;pDocTemplate = new CMultiDocTemplate(

IDR_SKETCHTYPE,RUNTIME_CLASS(CSketcherDoc),RUNTIME_CLASS(CChildFrame),

RUNTIME_CLASS(CSketcherView));AddDocTemplate(pDocTemplate);

Page 2: I- Applications MDI - Freedcanl.free.fr/Etudes/COURS_L3/COURS_ANNEE_DERNIERE/... · 2007-09-24 · Deux vues Ddu document Sketch1 euxv s do cmn tSk h2 L3 informatique Interface Homme

2

L3 informatique Interface Homme Machine 7

Création des modèles de document (2)

Le constructeur de la classe CMultiDocTemplate (resp.CSingedocInterface) reçoit 4 arguments :

l’ID du menu et de la barre d’outils à utiliser avec le document le type du document le type de la fenêtre cadre le type de la fenêtre vue

La Macro RUNTIME_CLASS permet de déterminer le typed’un objet en cours d’exécution

L’appel à la fonction AddDocTemplate sert à ajouter lemodèle de document qu’on vient de créer, à la liste desmodèles maintenus par l’application

L3 informatique Interface Homme Machine 8

Particularités des applications MDI

La classe de fenêtre principale est dérivée de CMDIFrameWnd au lieu deCFrameWnd

Les app. MDI utilise la classe CMDIChildWnd pour représenter les fenêtresvues associées à un document

Les app. MDI possèdent aux moins deux ressources de menus. Une pourafficher lorsqu’aucun doc. n’est ouvert, l’autre si au moins un doc. est ouvert.

Ce sont évidement les différences apparentes entre les App. SDI et MDI maisà l’intérieur de l’infrastructure MFC, des centaines de lignes de codes sontajoutées et adaptées pour gérer toutes ces particularités.

Une modification d’une vue particulière d’un document, n’entraîne pas unemise à jour automatique des autres vues. La synchronisation entre lesdifférentes vues d’un doc.est à la charge du programmeur.

Cette synchronisation se fait en utilisant les deux fonctionsCDocument::UpdateAllViews et CView::OnUpdate

L3 informatique Interface Homme Machine 9

Synchronisation des vues multiples d’un document

Lorsque les données d’un document changent, la fonction UpdateAllViewsdoit être appelée pour mettre à jour les différentes vues associées audocument.

UpdateAllView parcourt la liste des vues et appelle OnUpdate pour chaquevue.

CView fournit une implémentation très simpliste de la fonction OnUpdate :Elle invalide la vue et force un appel à onDraw qui redessine la vue. Cecidessine évidemment toute la fenêtre y compris les parties qui n ’ont pas ététouchées par la modification.

Si ce comportement vous va tant mieux, sinon il faut redéfinir OnUpdate pourn’afficher que ce qui est nécessaire. Une manière de le faire est, par exemple,de passer le rectangle délimiteur de la zone à redessiner à la fonctionUpdateAllViews qui le passera à OnUpdate.

L3 informatique Interface Homme Machine 10

Exemple

L3 informatique Interface Homme Machine 11

Exemple (2)

Le programme expose une grille de 16 cellules, lorsqu’une cellule est cliquée,elle est colorée par la couleur courante choisie dans le menu color.

La fonction OnLButtonDown détermine la cellule cliquée et appelle unefonction SetSquare qui change la couleur de la cellule.

L’application est MDI, la fonction SetSquare modifie la couleur et fait appel àUpdateAllViews pour mettre à jour toutes les vues du document

L’application est responsable sur la création de sa fenêtre principale. Elleassure ce travail dans la fonction InitInstance :

// create main MDI Frame window

CMainFrame* pMainFrame = new CMainFrame;

if (!pMainFrame->LoadFrame(IDR_MAINFRAME))

return FALSE;

m_pMainWnd = pMainFrame;

L3 informatique Interface Homme Machine 12

exemple (3)

On note également que c’est la classe CChildFrame etnon CMainFrame qui est identifiée comme classe defenêtre principale dans la fonction InitInstance, lorsque lemodèle de document est créé :

CMultiDocTemplate* pDocTemplate;

pDocTemplate = new CMultiDocTemplate(

IDR_MDISQUTYPE,

RUNTIME_CLASS(CSquaresDoc),

RUNTIME_CLASS(CChildFrame), RUNTIME_CLASS(CSquaresView));

AddDocTemplate(pDocTemplate);

Si vous regardez les ressource de cette application, avecResourceView, vous constatez qu’elle possède deuxicônes, deux menus, et deux chaînes de caractèresassociés aux documents

Page 3: I- Applications MDI - Freedcanl.free.fr/Etudes/COURS_L3/COURS_ANNEE_DERNIERE/... · 2007-09-24 · Deux vues Ddu document Sketch1 euxv s do cmn tSk h2 L3 informatique Interface Homme

3

L3 informatique Interface Homme Machine 13

II- Vues fractionnables

Définitions et principes Ajout d’une fenêtre fractionnables dynamique dans une

application La fonction CMainFrame::OnCreateClient Exemple

L3 informatique Interface Homme Machine 14

Fenêtres fractionnables

Les fenêtres fractionnables (Splitter Window) sert à afficher simultanémentdeux ou plusieurs parties d’un même document

Une Splitter Window peut être divisée en différents volets (panes) àl’horizontal comme à la verticale

Les fenêtres fractionnables sont dérivées de la classe MFC CSplitterWnd MFC fournit deux sortes de fenêtres fractionnables :

Les fenêtres dynamiques : l’user peut contrôler le nombre de colonnes et derangées utilisées dans les volets pendant l’exécution du programme

Les fenêtres statiques : la fenêtre doit être paramétrée au départ Utilisez le fractionnement dyn. pour afficher plusieurs volets fondés sur la

même classe vue. Cela permet à l’utilisateur d’afficher différentes parties dumême document dans différents volets

Utilisez le fractionnement stat. pour afficher différentes classes vue dans lesvolets

L3 informatique Interface Homme Machine 15

Fenêtres fractionnables (2)

Les fenêtres fractionnables dyn. sont limitées à deux colonnes et deuxrangées, mais l’user peut dynamiquement ajouter ou enlever des volets avecles barres de fractionnement

Un Fract. stat. permet d’aller jusqu’à 16 colonnes et 16 rangées. On peut envisager de combiner fract. dyn. et fract. stat.

Pour pouvoir fractionner une fenêtre vue d’une application, celle-ci doit inclureles instructions nécessaires. En général, ceci se fait par :

L’ajout d’une donnée membre de type CSplitterWnd dans la classe de fenêtreprincipale (MainFrame).

La redéfinition de la fonction membre CMainFrame::OnCreate, qui permetd’incorporer les barres d’outils, la barre d’état et les fenêtres fractionnablesdans la fenêtre cadre.

La manifestation visible de l’incorporation d’une fenêtre fractionnable setraduit par la présence de cases de fractionnement dans les barres dedéfilement

L3 informatique Interface Homme Machine 16

Ajout d’une fenêtre fractionnable dyn. dans une app.

Ajouter une donnée membre CSplitterWnd dans CMainFrame :protected: // control bar embedded members

CStatusBar m_wndStatusBar;

CToolBar m_wndToolBarStd;

CToolBar m_wndToolBarDraw;

CSplitterWnd m_wndSplitter;

Supplanter la fonction virtuelle OnCreateClient :BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs,

CCreateContext* pContext) {

// TODO: Add your specialized code here and/or …

return m_wndSplitter.Create(this,2,2,CSize(1,1),pContext);

}

Ajouter dans le gestionnaire de la souris OnLButtonUp, les instructionsnécessaires à la mise à jour des vues supplémentaires

// Update extra views with the new shape.

CMyDrawDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

pDoc->UpdateAllViews(NULL);

L3 informatique Interface Homme Machine 17

La fonction CMainFrame::OnCreateClient

Elle est appelée par les MFC lorsque la fenêtre cadre estcréée, ce qui permet d’incorporer les barres d’outils et lesfenêtres fractionnables.

Le code montré fait appel à CSplitterWnd::Create pourcréer et initialiser la fenêtre fractionnable

CSplitterWnd:: Create prend 5 paramètres :1. identifie la fenêtre parent de la fenêtre fractionnable (this)2. définit le nombre max de rangées (2)3. définit le nombre max de colonnes (2)4. fixe la valeur minimale d’un volet (à 1 pixel généralement)5. passe le ptr CCreatecontext reçu comme paramètre de

OnCreateClient. Cet objet contient les informations utilisées parMFC pour créer les objets vues à afficher dans les volets

L3 informatique Interface Homme Machine 18

Exemple

Page 4: I- Applications MDI - Freedcanl.free.fr/Etudes/COURS_L3/COURS_ANNEE_DERNIERE/... · 2007-09-24 · Deux vues Ddu document Sketch1 euxv s do cmn tSk h2 L3 informatique Interface Homme

4

L3 informatique Interface Homme Machine 19

III- Applications non Doc/View

L3 informatique Interface Homme Machine 20

Applications non Doc/View

On construit une application à l’aide de AppWizard, Simple Document Interface, sans utiliser l’architecture Document/Vue, appelée DlgExemple

Le menu principal comporte par défaut : Fichier -> Quitter Edition -> Annuler, Couper, Copier, Coller Affichage -> Barre d’outils, Barre d’état ? -> A propos de ...

Le squelette généré comporte 4 classes :

CMainFrame // objet fenêtre cadre CDlgExempleApp // objet application CChildView // objet vue CAboutDlg // boîte de dialogue gérée par

// ? A propos de …

L3 informatique Interface Homme Machine 21

Applications non Doc/View

L'application comporte en plus du squelette généré, unsous-menu : Fichier -> Options

Le choix du sous-menu Options fait apparaître lafenêtre de dialogue

Le programme affiche simplement un rectangle dans lecoin haut droit de la fenêtre en respect desspécifications données dans le menu Options.

Par défaut, la largeur et la longueur sont de 2 pouces.

L3 informatique Interface Homme Machine 22

Applications non Doc/View

La boîte de dialogue Options permet de paramétrer la taille du rectangle et d'appliquer ces modifications directement sans fermer

la boîte de dialogue par le choix Appliquer. Les options

Fermer ferme la boîte de dialogue et Défaut réinitialise les paramètres à leurs valeurs initiales.

La boîte de dialogue ouverte est non modale i.e. on peut effectuer d'autres opérations en conservant la

boîte de dialogue ouverte.

L3 informatique Interface Homme Machine 23

Applications non Doc/View

Etape 1 : Création du projet à l'aide AppWizard

Les classes créées sont : CAboutDlg, CChildView, CMainFrame et

CDlgExempleApp.

La classe CChildView comporte une surchargede la méthode OnPaint

void CChildView::OnPaint(){ CPaintDC dc(this); // device context for painting

// TODO: Add your message handler code here

}

L3 informatique Interface Homme Machine 24

Applications non Doc/View

Etape 2 : Ajout de nouveaux attributs dans la classeCChildView.

Trois options de dessin sont gérées dans le programme : la largeur et la longueur du rectangle et l'unité de mesure.

On ajoute donc les trois variables : m_Largeur, m_Longueur et m_Unite

Ces attributs sont initialisés dans le constructeur de laclasse CChildView.

CChildView::CChildView(){

m_Largeur = 2;m_Longueur =2;m_Unite =0; // l’unité est le pouce

}

Page 5: I- Applications MDI - Freedcanl.free.fr/Etudes/COURS_L3/COURS_ANNEE_DERNIERE/... · 2007-09-24 · Deux vues Ddu document Sketch1 euxv s do cmn tSk h2 L3 informatique Interface Homme

5

L3 informatique Interface Homme Machine 25

Applications non Doc/View

Etape 3 : Surcharge de la méthode OnPaint de la classe CChildView.

La méthode OnPaint affiche le rectangle dans la vue en fonction de l'unité choisie.void CChildView::OnPaint()

{CPaintDC dc(this);CBrush brush (RGB (255, 0, 255));dc.SelectObject (&brush);switch (m_Unite){

case 0: // Poucesdc.SetMapMode (MM_LOENGLISH);dc.Rectangle (0, 0, m_Largeur * 100, -m_Longueur * 100); break;

case 1: // Centimètresdc.SetMapMode (MM_LOMETRIC);dc.Rectangle (0, 0, m_Largeur * 100, -m_Longueur * 100); break;

case 2: // Pixelsdc.SetMapMode (MM_TEXT);dc.Rectangle (0, 0, m_Largeur, m_Longueur); break;

}}

L3 informatique Interface Homme Machine 26

Applications non Doc/View

Etape 4 : Ecrire un gestionnaire de message (OnCreate) pour lemessage WM_CREATE.

Dans cette architecture, la création de la fenêtre vue peut être faitepar le gestionnaire OnCreate dans la classe CMainFrame.

La création est faite en utilisant la méthode Create de la classeCWnd.

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct){

if (CFrameWnd::OnCreate(lpCreateStruct) == -1)return -1;

if (!m_wndView.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL))return -1;return 0;

}(cf Documentation CWnd :: Create)

L3 informatique Interface Homme Machine 27

Applications non Doc/View

Etape 5 : Création de la ressource boîte de dialogue

La boîte de dialogue est créée à l'aide de l'éditeur de ressources deAppWizard

La boîte de dialogue comporte : 2 contrôles STATIC pour les messages Largeur, Longueur. 2 contrôles EDIT pour la saisie de ces valeurs. 3 contrôles BUTTON pour Appliquer, Fermer et Défaut. 3 boutons radio groupés : Pouces, Centimètres et Pixels dans un

contrôle STATIC (Unités).

L3 informatique Interface Homme Machine 28

Applications non Doc/View

La description de cette fenêtre est la suivante dans le fichier desressources (DlgExemple.rc).

IDD_OPTIONS DIALOG DISCARDABLE 0, 0, 192, 121STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENUCAPTION "Options"FONT 8, "MS Sans Serif"

Ces premières lignes permettent de définir

des informations pour l'éditeur de liens (DISCARDABLE …)et le style de la boîte :WS_POPUP doit toujours être inclus dans le style d'une boîte de dialogue,WS_CAPTION permet de donner un titre (CAPTION "Options),WS_SYSMENU ajoute un bouton de fermeture sur la barre de titre,WS_MODALFRAME : par convention utilisé pour les boîtes de dialogues

modales (peut aussi être utilisé dans les autres cas). N'a pas d'effet surl'apparence de la boîte uniquement sur son comportement.

L3 informatique Interface Homme Machine 29

Applications non Doc/View

Puis les différents contrôles de la boîte sont décrits.

BEGIN LTEXT "&Largeur",IDC_STATIC,16,16,28,8 EDITTEXT IDC_LARGEUR,58,12,50,12,ES_AUTOHSCROLL LTEXT "&Longueur",IDC_STATIC,16,36,40,8 EDITTEXT IDC_LONGUEUR,58,32,50,12,ES_AUTOHSCROLL GROUPBOX "Unités",IDC_STATIC,16,56,92,52 CONTROL "&Pouces",IDC_POUCES,"Button"

,BS_AUTORADIOBUTTON | WS_GROUP,28,68,52,8 CONTROL "&Centimètres",IDC_CENTIMETRES,"Button", BS_AUTORADIOBUTTON,28,80,52,8 CONTROL "&Pixels",IDC_PIXELS,"Button",

BS_AUTORADIOBUTTON,28,92 52,8 DEFPUSHBUTTON "&Appliquer",IDOK,128,12,50,14,WS_GROUP PUSHBUTTON "&Fermer",IDCANCEL,128,32,50,14,WS_GROUP PUSHBUTTON "&Défaut",IDC_DEFAUT,128,52,50,14,WS_GROUPEND

L3 informatique Interface Homme Machine 30

Applications non Doc/View

L'option WS_GROUPpermet de groupercertains contrôles. Les contrôles groupés

sont ceux compris entredeux WS_GROUP. Ici,les trois boutons radio.Ceci permet d'avoirautomatiquement unseul choix possible parmiles boutons groupés.

Le bouton OK est celuidéfini par défaut lorsquel'utilisateur utilise latouche entrée.

On peut aussi définirl'ordre de parcours decontrôles avec la touchetab en utilisant le menuLayout -> TabOrder.

Page 6: I- Applications MDI - Freedcanl.free.fr/Etudes/COURS_L3/COURS_ANNEE_DERNIERE/... · 2007-09-24 · Deux vues Ddu document Sketch1 euxv s do cmn tSk h2 L3 informatique Interface Homme

6

L3 informatique Interface Homme Machine 31

Applications non Doc/View

On peut vérifier que des contrôles sontgroupés en utilisant le menu Layout -> Test Cliquer sur le premier contrôle et à l'aide des

flèches haut, bas on peut se déplacer en bouclesur les contrôles groupés.

L3 informatique Interface Homme Machine 32

Applications non Doc/View

Etape 6 : Création de la classe COptionsDialog

On définit dans la classe COptionsDialog 3 attributs pour gérer les options :

m_Largeur, m_Longueur et m_Unite.

Lors de la création de la classe COptionsDialogpar ClassWizard sur la boîte dialogueIDD_OPTIONS,

Le constructeur et la méthode DoDataExchange sontautomatiquement générés.

On ajoute ensuite les variables.

L3 informatique Interface Homme Machine 33

Applications non Doc/View

Ces attributs/variablessont associés aux 3contrôles de la boîte dedialogue:

Pour la longueur(IDC_LONGUEUR)

Pour la largueur(IDC_LARGEUR)

Pour les 3 boutonsradio groupés (1erbouton)(IDC_POUCES)

L3 informatique Interface Homme Machine 34

Applications non Doc/View

Etape 7 : Mise à jour du menu principal et création dugestionnaire pour le menu Fichier -> OptionsIDR_MAINFRAME MENU PRELOAD DISCARDABLEBEGIN POPUP "&Fichier" BEGIN MENUITEM "&Options",ID_FICHIER_OPTIONS MENUITEM "&Quitter",ID_APP_EXIT END ….END

L3 informatique Interface Homme Machine 35

Applications non Doc/View

La boîte de dialogue est gérée en mode nonmodal.

Le gestionnaire OnFichierOptions va donc prendreen charge : l'allocation d’un pointeur sur un objet de type

COptionsDialog, pour gérer la boîte de dialogue l'initialisation des champs, la création de la boîte (lien avec la ressource

IDD_OPTIONS) et l'affichage de cette boîte.

Un pointeur sur cette boîte est défini dans la classeCChildView.

L3 informatique Interface Homme Machine 36

Applications non Doc/View

void CChildView::OnFichierOptions() { // Si la boîte existe, on l'affiche.

if (m_pDlg != NULL)m_pDlg->SetFocus ();

// Si la boîte n'existe pas, on la crée.else {m_pDlg = new COptionsDialog;m_pDlg->m_Largeur = m_Largeur;m_pDlg->m_Longueur = m_Longueur;m_pDlg->m_Unite = m_Unite;m_pDlg->Create (IDD_OPTIONS);m_pDlg->ShowWindow (SW_SHOW);

}}

Page 7: I- Applications MDI - Freedcanl.free.fr/Etudes/COURS_L3/COURS_ANNEE_DERNIERE/... · 2007-09-24 · Deux vues Ddu document Sketch1 euxv s do cmn tSk h2 L3 informatique Interface Homme

7

L3 informatique Interface Homme Machine 37

Applications non Doc/View

Etape 8 : Création des gestionnaires pour les contrôles :Appliquer et Fermer.

Une différence fondamentale entre la gestion des boîtesmodales et non modales est la manière dont lesgestionnaires OnOk et OnCancel sont définis.

Pour les boîtes modales, La méthode OnCancel est rarement redéfinie car son

implémentation dans la classe CDialog appelle EndDilaog pourfermer la boîte et retourne IDCANCEL.

De même, la méthode OnOK de CDialog appelle OnUpdateDatapour mettre à jour les attributs de la boîte de dialogue avant defermer la boîte.

Si les contrôles de la boîte et les attributs sont liés par lesmécanismes DDX et DDV, l'action par défaut CDialog::OnOk est engénéral suffisante.

L3 informatique Interface Homme Machine 38

Applications non Doc/View

Pour les boîtes non modales,

Les méthodes OnOK et OnCancel doivent presquetoujours être surchargées.

Il faut donc éviter que les méthodes : CDialog::OnOK et CDialog::OnCancel soient appelées.

Les boîtes de dialogue non modales doivent être ferméespar DestroyWindow.

Dans l'exemple, les deux boutons Appliquer (IDOK) et Fermer (IDCANCEL) génèrent des

appels à OnOK et OnCancel, il faut donc surcharger ces méthodes.

L3 informatique Interface Homme Machine 39

Applications non Doc/View Principe de gestion des messages pour les boutons Appliquer et Fermer

Les méthodes OnOK et OnCancel sont surchargées dans la classeCOptionsDialog.

Ces méthodes émettent un message vers la fenêtre principale qui le traite et le retransmet vers lavue qui termine le traitement.

COptionsDialog

OnOK,OnCancel

CMainFrame

OnAppliquer,OnDialogDestroyed

WM_USER_APPLY

WM_USER_DIALOG_DESTROYED

CChildView

OnAppliquer,OnDialogDestroyed

WM_USER_APPLY

WM_USER_DIALOG_DESTROYED

L3 informatique Interface Homme Machine 40

Applications non Doc/View

Définitions des gestionnaires dans la classe COptionsDialog.

void COptionsDialog::OnOK (){

UpdateData (TRUE);RECTPROP rp;rp.Largeur = m_Largeur;rp.Longueur = m_Longueur;rp.Unite = m_Unite;

AfxGetMainWnd ()->SendMessage (WM_USER_APPLY_, 0, (LPARAM)&rp);

} UpdateData(TRUE) permet la mise à jour des données de la boîte de

dialogue. Ces valeurs sont stockées dans une structure RECTPROP pour être

transmises en paramètres vers la fenêtre principale à l'aide d'unmessage utilisateur WM_USER_APPLY (correspondant au choix del'option Appliquer).

L3 informatique Interface Homme Machine 41

Applications non Doc/View

La définition de la structure RECTPROP est définie de la façon suivante:typedef struct tagRECTPROP { int Largeur;

int Longueur;int Unite;

} RECTPROP;

WM_USER_ sont des messages utilisateur définis sous la formesuivante dans stdafx.h.#define WM_USER_APPLY WM_USER+0x100#define WM_USER_DIALOG_DESTROYED WM_USER+0x101WM_USER qui est défini à l'adresse 0x400 dans le fichier Winuser.h

spécifie la borne inférieure des adresses utilisables pour desmessages utilisateurs sans provoquer de conflits avec les messagesstandard de Windows.

WM_USER_APPLY est arbitrairement défini à cette adresse + 0x100.

L3 informatique Interface Homme Machine 42

Applications non Doc/View

Le gestionnaire OnCancel détruit la fenêtre enutilisant la méthode DestroyWindow de CDialog.

void COptionsDialog::OnCancel (){

DestroyWindow ();}

La méthode OnOK émet un messageWM_USER_APPLY vers la fenêtre principale. Cemessage doit donc être géré par cette classe.

Page 8: I- Applications MDI - Freedcanl.free.fr/Etudes/COURS_L3/COURS_ANNEE_DERNIERE/... · 2007-09-24 · Deux vues Ddu document Sketch1 euxv s do cmn tSk h2 L3 informatique Interface Homme

8

L3 informatique Interface Homme Machine 43

Applications non Doc/View

Gestion des messages dans la classe CMainFrame

Déclaration du gestionnaire dans la table desmessages de CMainFrame :

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)//{{AFX_MSG_MAP(CMainFrame)ON_WM_SETFOCUS()ON_WM_CREATE()ON_MESSAGE(WM_USER_APPLY,OnAppliquer)//}}AFX_MSG_MAP

END_MESSAGE_MAP()

L3 informatique Interface Homme Machine 44

Applications non Doc/View

Définition du gestionnaire :

LRESULT CMainFrame::OnAppliquer (WPARAM wParam, LPARAM lParam)

{ // m_wndView désigne la vue de type CChildViewm_wndView.SendMessage (WM_USER_APPLY, wParam, lParam);

return 0;}

La méthode OnAppliquer de la fenêtre principaleenvoie un message vers la vue. On doit donc définir un gestionnaire pour ce message

(WM_USER_APPLY) dans la classe CChildView.

L3 informatique Interface Homme Machine 45

Applications non Doc/View

Gestionnaires de la classe CChildView

Déclaration du gestionnaire dans la tabledes messages de CChildView :

BEGIN_MESSAGE_MAP(CChildView,CWnd )//{{AFX_MSG_MAP(CChildView)ON_WM_PAINT()ON_COMMAND(ID_FICHIER_OPTIONS, OnFichierOptions)ON_MESSAGE(WM_USER_APPLY, OnAppliquer);//}}AFX_MSG_MAP

END_MESSAGE_MAP()

L3 informatique Interface Homme Machine 46

Applications non Doc/View

Définition du gestionnaire :

LRESULT CChildView::OnAppliquer (WPARAM wParam, LPARAM lParam){ RECTPROP* prp = (RECTPROP*) lParam; m_Largeur = prp->Largeur; m_Longueur = prp->Longueur; m_Unite = prp->Unite; Invalidate (); return 0;}

Le gestionnaire récupère en paramètre les valeurs desattributs à appliquer et les affecte aux attributs de la vue,qui est invalidée pour être repeinte par OnPaint.

L3 informatique Interface Homme Machine 47

Applications non Doc/View

Gestionnaire OnCancel dans la classe COptionsDialog, OnCancel appelle la méthode DestroyWindow.

Cette fonction appelle pour terminer la méthodeCOptionsDialog::PostNcDestroy qui doit donc être définie.

void COptionsDialog::PostNcDestroy (){ CDialog::PostNcDestroy ();AfxGetMainWnd()->SendMessage(WM_USER_DIALOG_DESTROYED, 0, 0); delete this;}

Cette méthode envoie un message à la fenêtre principale poursignaler la terminaison de la boîte de dialogue.

Ce message doit donc être récupéré par la fenêtre principale quipourra ainsi transmettre ce message à la vue et la vue réinitialiseral'attribut m_pDlg à NULL.

L3 informatique Interface Homme Machine 48

Applications non Doc/View

Dans la classe CMainFrame :

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)//{{AFX_MSG_MAP(CMainFrame)ON_WM_SETFOCUS()ON_WM_CREATE()ON_MESSAGE(WM_USER_APPLY,OnAppliquer)

ON_MESSAGE(WM_USER_DIALOG_DESTROYED,OnDialogDestroyed)//}}AFX_MSG_MAP

END_MESSAGE_MAP()

Définition du gestionnaire :

LRESULT CMainFrame::OnDialogDestroyed (WPARAM wParam, LPARAM lParam){m_wndView.SendMessage (WM_USER_DIALOG_DESTROYED,wParam, lParam);return 0;}

Page 9: I- Applications MDI - Freedcanl.free.fr/Etudes/COURS_L3/COURS_ANNEE_DERNIERE/... · 2007-09-24 · Deux vues Ddu document Sketch1 euxv s do cmn tSk h2 L3 informatique Interface Homme

9

L3 informatique Interface Homme Machine 49

Applications non Doc/View

Dans la classe CChildView :BEGIN_MESSAGE_MAP(CChildView,CWnd )

//{{AFX_MSG_MAP(CChildView)ON_WM_PAINT()ON_COMMAND(ID_FICHIER_OPTIONS, OnFichierOptions)ON_MESSAGE(WM_USER_APPLY, OnAppliquer);ON_MESSAGE(WM_USER_DIALOG_DESTROYED, OnDialogDestroyed)//}}AFX_MSG_MAP

END_MESSAGE_MAP()

Définition du gestionnaire :

LRESULT CChildView::OnDialogDestroyed (WPARAM wParam, LPARAMlParam)

{m_pDlg = NULL;return 0;

}

L3 informatique Interface Homme Machine 50

Applications non Doc/View

Etape 9 : Définition du gestionnaire pour le bouton Défaut

Le bouton Défaut provoque la réinitialisation des valeursde largeur, longueur et unité aux valeurs initiales.

Le gestionnaire est défini dans la classe COptionsDialog. Il affecte les valeurs aux attributs et demande une mise à jour

des informations.BEGIN_MESSAGE_MAP(COptionsDialog, CDialog)

//{{AFX_MSG_MAP(COptionsDialog)ON_BN_CLICKED(IDC_DEFAUT, OnDefaut)//}}AFX_MSG_MAP

END_MESSAGE_MAP() Le message géré est de type ON_BN_CLICKED , message lié à un

clic sur un bouton.

L3 informatique Interface Homme Machine 51

Applications non Doc/View

void COptionsDialog::OnDefaut(){

m_Largeur = 4;m_Longueur = 2;m_Unite = 0;UpdateData (FALSE);

}

La méthode UpdateData(FALSE) demande letransfert des variables de la classe (m_Largeur,…) vers les contrôles de la boîte de dialogue.

L3 informatique Interface Homme Machine 52

Applications non Doc/View

L3 informatique Interface Homme Machine 53

IV- Les contrôles ActiveX

Boîtes de dialogue et contrôles Généralités sur les contrôles ActiveX Comment inclure un contrôle ActiveX dans un projet Comment insérer un contrôle ActiveX dans une boîte de

dialogue

Exemple :Construire une boîte dialogue composée de

Un contrôle ActiveX, qui jouera le rôle d’une feuille de calcul Un bouton Calculer pour lancer les calculs des totaux des

colonnes de la feuille Une zone d’édition pour afficher et mettre à jour le contenu

d’une cellule particulière de la feuille de calcul En plus des boutons standard : Ok et Annuler

L3 informatique Interface Homme Machine 54

Boîtes de dialogue et contrôles

Boîtes de dialogue : Modales Non modales Boites de dialogue Windows communes Boites de dialogue complexes, composées de plusieurs

onglets

Les contrôles : Cases à cocher, cases d’options et boutons de

commandes Barres de défilement, zones de liste, zones de liste

modifiables, zones d’édition Compteurs

Page 10: I- Applications MDI - Freedcanl.free.fr/Etudes/COURS_L3/COURS_ANNEE_DERNIERE/... · 2007-09-24 · Deux vues Ddu document Sketch1 euxv s do cmn tSk h2 L3 informatique Interface Homme

10

L3 informatique Interface Homme Machine 55

Généralités

Un contrôle ActiveX est un contrôle réutilisable conçu pour être utilisédans vos applications.

Developper studio inclut une galerie de composants : components andControls Gallery, qui permet d’intégrer facilement des contrôlesActiveX dans vos programmes MFC

Pour afficher tous les contrôles ActiveX contenus dans la componentsand Controls Gallery, choisissez Project, Add to Project, Componentsand Controls dans le menu principal

Les contrôles ActiveX utilisent une interface standard, non spécifiqueà aucun langage de prog. Ces contrôles peuvent donc être utilisésavec toutes sortes d’outils de développement (VB, FoxPro, VCpp, …)

Un contrôle ActiveX est toujours inclu dans un conteneur qui secharge de mettre en place un environnement permettant au contrôlede dialoguer avec le monde extérieur

L3 informatique Interface Homme Machine 56

Généralités (2)

L3 informatique Interface Homme Machine 57

Généralités (3)

Toutes les classes dérivées de CWnd peuvent être utilisées commeconteneur d’un contrôle ActiveX

Un événement ActiveX est un message envoyé du contrôle, àl’application le contenant.

Lorsqu’un conteneur ActiveX doit communiquer avec un contrôleActiveX, il interagit avec un ensemble de propriétés et de méthodesexposées par le contrôle

Une méthode ActiveX est une fonction exposée par le contrôle etappelée par le conteneur du contrôle, ce sera par exemple unefonction de tri des éléments d’une liste

Exemple : Le contrôle Microsoft Hiérarchical Flex Grid permet decréer une petite feuille de calcul à l’intérieur d’une boite de dialogue

L3 informatique Interface Homme Machine 58

Contrôles ActiveX et boîtes de dialogues

Avant de pouvoir ajouter un contrôle ActiveX à une boîtede dialogue, vous devez l’insérer dans la palette descontrôles de l’éditeur des boîtes de dialogue :

Sélectionner l’un des contrôles ActiveX de la galerie Cliquer sur le bouton insert Une boîte de dialogue apparaît et vous demande si vous

souhaitez insérer le contrôle. Cliquez Ok; Une zone de liste affichant les classes qui s’ajoutent à votre

projet s’affiche dans une nouvelle boîte de dialogue, cliquezsur Ok pour ajouter ces classes à votre projet

Cliquez Ok pour fermer la boîte de dialogue Components andControls Gallery

Le nouveau contrôle ActiveX peut être inséré dans uneboîte de dialogue comme n’importe quel autre contrôle.

Pour chaque contrôle inséré, utilisez ClassWizard pourcréer les variables et les fonctions associées

L3 informatique Interface Homme Machine 59

Exemple

Utiliser un contrôle ActiveX Grid pour insérer une feuille de calculdans un projet de type Dialog Based

Les contrôles Grid offrent les fonctionnalités suivantes : extraction des données concernant des rangées, des colonnes ou des

cellules déterminées définitions des attributs de la cellule courante (police, taille,

contenu,…) ; extraction des attributs de la cellule courante

Ajouter dans la boîte de dialogue nomméeIDD_CUSTOMCTRL_DIALOG :

Un contrôle ActiveX Microsoft Hierarchical Flex Grid : IDC_GRID Un bouton Calculer : IDC_CALC Une zone de texte : IDC_EDIT

Changer les propriétés du contrôle Grid pour n’avoir que 5 lignes et 5colonnes, sans barres de défilement.

L3 informatique Interface Homme Machine 60

Exemple (2)

Page 11: I- Applications MDI - Freedcanl.free.fr/Etudes/COURS_L3/COURS_ANNEE_DERNIERE/... · 2007-09-24 · Deux vues Ddu document Sketch1 euxv s do cmn tSk h2 L3 informatique Interface Homme

11

L3 informatique Interface Homme Machine 61

Exemple (3)

Pour interagir avec le contrôle ActiveX, on définit dans la classeCCustomCtrlDlg les données membres suivantes :

CEdit m_edit CMSHFlexGrid m_grid int m_nRow, nCol,

stockent la ligne et la colonne courante lorsqu’une cellule est modifiée BOOL m_bEditing.

TRUE si une case est modifiée, FALSE sinon

On définit par la suite les fonctions de gestion : Du clic sur le bouton Calculer : OnCal Du clic sur une cellule de la grille : OnClickGrid

Le but est qu’en cliquant sur une cellule, on fait apparaître la zone de texte quipermet de compléter ou de modifier son contenu. En cliquant de nouveau surla cellule, la valeur de la zone de texte est placée dans la cellule et la zone detexte est masquée.

Lorsqu’on clique sur le bouton Calculer, la zone de texte est masquée et letableau affiche la somme de toutes les colonnes.

L3 informatique Interface Homme Machine 62

Exemple (4)void CActivexDlg::OnClickGrid()

{

CString szText = m_grid.GetText();

if( m_bEditing == FALSE )

{

// Stocke la position de la cellule et

// donne la valeur TRUE au flag d'édition.

m_nRow = m_grid.GetRow();

m_nCol = m_grid.GetCol();

m_bEditing = TRUE;

// Récupération du texte de la cellule et

// affichage dans la zone de texte.

szText = m_grid.GetText();

m_edit.SetWindowText( szText );

m_edit.ShowWindow( SW_SHOW );

m_edit.SetFocus();

m_edit.SetSel( 0, -1 );

}

else {

L3 informatique Interface Homme Machine 63

Exemple (5) // Stockage de la position de la cellule où // l'utilisateur vient de cliquer, mise à

// jour de la cellule initiale, puis retour

// à la nouvelle position.

int nCurrentRow = m_grid.GetRow();

int nCurrentCol = m_grid.GetCol();

m_grid.SetRow( m_nRow );

m_grid.SetCol( m_nCol );

m_grid.SetFocus();

CString szEntry;

m_edit.GetWindowText( szText );

szEntry.Format("%01.2f", atof(szText) );

m_edit.ShowWindow( SW_HIDE );

m_grid.SetText( szEntry );

m_bEditing = FALSE;

m_grid.SetRow( nCurrentRow );

m_grid.SetCol( nCurrentCol );

}

}

L3 informatique Interface Homme Machine 64

Exemple (6)

void CActivexDlg::OnCalc()

{

// Si une cellule est en cours d'édition, // mettre fin à l'édition.

if( m_bEditing != FALSE )

{ CString szEntry, szText;

m_edit.GetWindowText( szText );

szEntry.Format("%01,2f", atof(szText) ); m_edit.ShowWindow( SW_HIDE );

m_grid.SetText( szEntry );

m_bEditing = FALSE; }

for( int nCol = 1; nCol < 5; nCol++ )

{ double dTotal = 0.0;

L3 informatique Interface Homme Machine 65

Exemple (7)

m_grid.SetCol( nCol );

for( int nRow = 1; nRow < 4; nRow++ )

{

m_grid.SetRow( nRow );

CString szCell = m_grid.GetText();

dTotal += atof( szCell );

}

CString szTotal;

szTotal.Format( "%01.2f", dTotal );

m_grid.SetRow( 4 );

m_grid.SetText( szTotal );

}

}

L3 informatique Interface Homme Machine 66

V- Les Images Bitmaps

Généralités DDB et la classe CBitmap Comment afficher une bitmap Exemple La structure BITMAP Les ressources Bitmap Exemple Les bitmaps DIB Structure d’un fichier DIB

Page 12: I- Applications MDI - Freedcanl.free.fr/Etudes/COURS_L3/COURS_ANNEE_DERNIERE/... · 2007-09-24 · Deux vues Ddu document Sketch1 euxv s do cmn tSk h2 L3 informatique Interface Homme

12

L3 informatique Interface Homme Machine 67

Généralités Les bitmaps sont des objets GDI comme les pinceaux, les

polices de caractères, … Sous Windows 32bits, deux types de bitmap sont

supportés : Les DDB : Les bitmaps dépendant des périphériques

device-dependent bitmaps Les DIB : Les bitmaps Indépendant des périphériques

device-independent bitmaps Windows et les MFC couvrent plus les DDB que les DIB,

mais l’utilisation des DIB reste largement possible Deux possibilités pour travailler avec les bitmaps :

Insérer la bitmap comme une ressource de l’application La créer dynamiquement, comme tout objet GDI

Si vous voulez lire des bitmaps à partir du disque, il fautécrire le programme.

L3 informatique Interface Homme Machine 68

DDB et la classe CBitmap

Comment créer une bitmap ? 3 fonctions : CBitmap:: CreateCompatibleBitmap CBitmap::CreateBitmap CBitmap::CreateBitmapIndirect

ExempleCBitmap b itmap;

b itmap.CreateCompatib leBitmap (&dc, nW idth, nHeig ht) ;

En argument un contexte de périphérique, la larg eur et lalongueur de la b itmap

Init ialisation d’une b itm ap

Créer un DC ( nommé DC de mémoire) compatib leavec le DC qui a été utilisé dans la création de lab itm ap : DC: :CreateCompatib leDC

Sélectionner la b itm ap dans le DC de mémoire. Lab itm ap devient la surface de dessin de ce DC.

L3 informatique Interface Homme Machine 69

Exemple

// Le contexte de périphérique

CClientDC dcScreen ( t his) ;

// Créer une b itm ap de 1 0 0 *1 0 0 p ixels

CBitm ap b itm ap;

b itm ap.CreateCompatib leBitm ap (&dcScreen, 1 0 0 , 1 0 0 ) ;

// Créer un contexte de périphérique de mémoire, sélectionner la b itm ap

CDC dcMem ;

dcMem .CreateCompatib leDC (&dcScreen) ;

CBitm ap* pOldBitm ap = dcMem .SelectObject ( &b itm ap) ;

// Remplir la b itm ap avec la couleur b leu

CBrush b rush (RGB ( 0 , 0 , 2 5 5 ) ) ;

dcMem .FillRect (CRect ( 0 , 0 , 1 0 0 , 1 0 0 ) , &brush) ;

dcMem .SelectObject (pOldBitm ap) ;

L3 informatique Interface Homme Machine 70

Affichage des bitmaps (le Blitting)

Pour transférer une bitmap d’un DC de mémoire vers un DC d’écran, utiliserl’une des fonctions : CDC::BitBlt : transfère un bloque de pixels d’un DC vers un autres,

préserve les dimensions du bloque Ex: dcScreen.BitBlt ( 0 ,0 ,1 0 0 ,1 0 0 ,&d cMem ,0 ,0 ,SRCCOPY) ;

CDC::StretchBlt : transfère un bloque de pixels d’un DC vers un autre, lebloque sera élargi ou rétréci pour respecter les dimensions indiquées enargument.

Ex: dcScreen.StretchBlt ( 0 , 0 , 5 0 , 2 0 0 , & d cMem , 0 , 0 , 1 0 0 , 1 0 0 ,SRCCOPY) ;

Par défaut, la partie de l’image qui ne tient pas dans le bloque de destinationest coupée. Utilisez la fonction CDC::SetStretchBltMode pour changer cecomportement avant d’appeler CDC::StretchBlt.

La fonction CBitmap::GetBitmap peut être utilisée pour avoir les informationsd’une bitmap (largeur, longueur, ….). Elle reçoit en argument un pointeur detype BITMAP (c’est structure définie dans MFC).

L3 informatique Interface Homme Machine 71

La structure BITMAP

typedef struct tagBITMAP {

LONG bmType;

LONG bmW idth;

LONG bmHeig ht;

LONG bmW idthBytes;

W ORD bmPlanes;

W ORD bmBitsPixel;

LPVOID bmBits;

} BITMAP;

bmType : contient toujours 0

bmW idthBytes : ind ique la taille de chaque lig ne de b itm ap en nombrede b its

bmPlanes : nombre de p lans de couleurs

bmBitsPixel : nombre de p ixel par b it par couleur

Ex : BITMAP bm ;

b itm ap.GetBitm ap (&bm ) ;

init ialise bm avec les informations de l’ob jet b itm ap.

L3 informatique Interface Homme Machine 72

Une fonction pour afficher des bitmapsvoid CMyBitmap::DrawBitmap (CDC* pDC, int x, int y) {

// Determiner la taille de la bitmap, la convertir en coord.logiques

BITMAP bm; GetBitmap (&bm);

CPoint size (bm.bmWidth, bm.bmHeight);

pDC->DPtoLP (&size);

CPoint org (0, 0); pDC->DPtoLP (&org);

// Créer un DC de mémoire, et sélectionne la bitmap

CDC dcMem;

dcMem.CreateCompatibleDC (pDC);

CBitmap* pOldBitmap = dcMem.SelectObject (this);

dcMem.SetMapMode (pDC->GetMapMode ());

// Affichage de la bitmap en utilisant la fonction BtBlt

pDC->BitBlt (x, y, size.x, size.y, &dcMem, org.x, org.y,SRCCOPY);

dcMem.SelectObject (pOldBitmap);

}

Page 13: I- Applications MDI - Freedcanl.free.fr/Etudes/COURS_L3/COURS_ANNEE_DERNIERE/... · 2007-09-24 · Deux vues Ddu document Sketch1 euxv s do cmn tSk h2 L3 informatique Interface Homme

13

L3 informatique Interface Homme Machine 73

Les ressources Bitmap

Une fois la bitmap créée (par l’éditeur de bitmap de Visual Studio ou parn’import quelle éditeur d’images) vous pouvez l’insérer comme une ressourcedans l’application. Son utilisation sera dans ce cas plus facile que si elle eststockée sur le disque.

Dans le fichier des ressources, ajouter :IDB_ MYLOGO BITMAP Logo.bmp

Pour la charger :CBitmap b itm ap;

b itm ap.LoadBitm ap ( IDB_ MYLOGO) ;

Après l’avoir charg é, la b itm ap peut être aff ichée comme ind iquéprécédemment.

La classe CBitm ap possède une autre fonction LoadMappedBitm ap

qui permet de charg er une b itm ap et transforme une ou p lusieurscouleur de la b itm ap en la couleur ind iquée en arg ument

L3 informatique Interface Homme Machine 74

Exemple

void DrawBitmap(const CBitmap *bitmap, const CDC *pDC, const CPoint &point){

// determine bitmap size BITMAP bm; ((CBitmap*)bitmap)->GetBitmap(&bm); int w = bm.bmWidth; int h = bm.bmHeight;

// create memory device context CDC memDC; VERIFY(memDC.CreateCompatibleDC((CDC*)pDC)); CBitmap *pBmp = memDC.SelectObject((CBitmap*)bitmap); memDC.SetMapMode(pDC->GetMapMode());

// blit bitmap to specified device context ((CDC*)pDC)->BitBlt(point.x, point.y, w, h, &memDC, 0, 0, SRCCOPY);

// clean up memDC.SelectObject(pBmp);}

L3 informatique Interface Homme Machine 75

void DrawBitmap(const CBitmap *bitmap, const CDC *pDC, const CRect&r, bool stretch /* = false */) {

BITMAP bm; ((CBitmap*)bitmap)->GetBitmap(&bm); int w = bm.bmWidth, h = bm.bmHeight; // determine bitmap size

if (stretch) { CPoint org(0, 0); CSize orgSize(w, h); // create memory device context CDC memDC; VERIFY(memDC.CreateCompatibleDC((CDC*)pDC)); CBitmap *pBmp = memDC.SelectObject((CBitmap*)bitmap); memDC.SetMapMode(pDC->GetMapMode()); // blit bitmap to specified device context with stretching ((CDC*)pDC)->SetStretchBltMode(HALFTONE); ((CDC*)pDC)->StretchBlt(r.left, r.top, r.Width(),r.Height(), &memDC, 0, 0, w, h, SRCCOPY); memDC.SelectObject(pBmp); // clean up } else { // !stretch CPoint point; point.x = rect.left + ((rect.right - rect.left) / 2) - (w / 2); point.y = rect.top + ((rect.bottom - rect.top) / 2) - (h / 2); DrawBitmap(bitmap, pDC, point); }}

L3 informatique Interface Homme Machine 76

Les DIB

Dans les DDB on peut manipuler les bits de l’image en utilisantCBitmap::GetBitmapBits et CBitmap::GetBitmapBits. Comme lesdonnées de couleurs sont stockées dans le format du périphériquecourant, il est difficile de savoir traiter l’information renvoyée parCBitmap::GetBitmapBits.

Pour Créer une DDB, on utilise CBitmap::CreateBitmap ou::CreateBitmap, qui retourne un HBITMAP

Pour créer une image DIB, on fait appel à la fonction::CreateDIBitmap, qui retourne un HBITMAP

La différence ?? Voir l’intérieur du HBITMAP renvoyé dans chaquecas.

Le format DIB code les couleurs de façon à ce que différents driverspeut les interpréter correctement.

::SetDIBits et ::GetDIBits permettent d’écrire et de lire les donnéesformatées en format DIB

L3 informatique Interface Homme Machine 77

Structure d’un fichier DIB

Une DIB Bitmap doit être sauvegardée dans des fichiersd’extension .bmp et doit être composé de 4 partiessuivantes :

L’entête du fichier : structure BITMAPFILEHEADER L’entête de la bitmap : peut être BITMAPINFOHEADER,

BITMAPV4HEADER ou BITMAPV5HEADER Un tableau de structures RGBQUAD (aussi appelée table de

couleur) Un tableau d’index dans la table des couleurs (les données de

la bitmap)

Entête de la bitmap : Dans Windows 95 et Windows NT 4.0: c’est la structure

BITMAPV4HEADER qui est utilisée. Dans Windows 98 et Windows 2000: c’est la structure

BITMAPV5HEADER qui est utilisée

L3 informatique Interface Homme Machine 78

Discussion : Ce que nous avons appris dans le module IHM

Travailler avec les outils AppWizard, ClassWizard et RessourceEditor Travailler avec les ressources Windows Exploiter l’architecture document/vue Travailler avec la souris Utiliser des couleurs, des fonts et des pinceaux Dériver nos propres classes des classes MFC Traiter les messages Windows, gérer les défilements Supplanter les fonctions virtuelles Écrire et lire des fichiers Ajouter des menus, barres d’outils et des boîtes de dialogue à nos

applications Nous avons appris à raisonner comme des programmeurs MFC :

On sait choisir la bonne classe pour traiter un message Trouver les points de raccordement MFC pour ajouter notre propre code dans

les applications générées par AppWizard Dans trois domaines différents et complémentaires : C++, Windows et MFC.

Vous avez acquis un niveau tout à fait honorable Vous êtes en mesure d’appliquer la programmation orientée objets pour des

projets pratiques

Page 14: I- Applications MDI - Freedcanl.free.fr/Etudes/COURS_L3/COURS_ANNEE_DERNIERE/... · 2007-09-24 · Deux vues Ddu document Sketch1 euxv s do cmn tSk h2 L3 informatique Interface Homme

14

L3 informatique Interface Homme Machine 79

Discussion : Les thèmes non traités

Programmer avec les outils avancés ou de nouveauxoutils, comme l’héritage multiple

Utiliser les modèles COM, OLE et ATL

Écrire des programmes de base de données tel que MTS,DAO et ODBC

Ecrire des projets qui ne sont pas des exécutables maisdes DLL, des pilotes de périphériques, des contrôlesActiveX, des serveurs et clients pour Internet

Je vous souhaite bonne chance dans votre investigationde cette planète immense.