:?: :?: :?: Que vois-je??!? Tu déclare une classe DANS une autre: la classe CItem dans CTplLayout!!! Comment le compilo interprète ça??
Version imprimable
:?: :?: :?: Que vois-je??!? Tu déclare une classe DANS une autre: la classe CItem dans CTplLayout!!! Comment le compilo interprète ça??
la notion de template a ete utilisée pour eviter les notions d'heritage multiples et de multi utilisation (trois classes supportées CDialog etc ..) .Citation:
Envoyé par r0d
si ta classe se nomme TestLayoutDlg modifi la declaration et code comme suit :
il suffit juste de rajouter CTplLayout<...> sur la classe de base ....Code:
1
2
3
4
5
6
7
8
9
10
11 // . h class TestLayoutDlg : public CTplLayout<CDialog> { //...... // code TestLayoutDlg::TestLayoutDlg() : CTplLayout<CDialog>(TestLayoutDlg::IDD) { //{{AFX_DATA_INIT(TestLayoutDlg) //}}AFX_DATA_INIT }
apres voir mon post et le sample fournit .
il n'y a pas deux sources .h et cpp parce que sinon dans le cas d'un template ça ne compile pas du moins avec VC6.0.
J’ai tout a fais le droit de déclarer une classe a l'intérieur d'une autre classe, ça limite sa portée d'utilisation à la classe container et sa visibilité c'est tout .
:D
:yaisse: J'ai récupéré ton exemple. C'est un projet SDI, isn't it? alors j'ai rajouté des boutons un peu partout sur la Dialog (ID:IDD_TESTMDILAYOUT_FORM), et ça plante sur la fonction AddControl(), 4eme ligne: ScreentoClient(item.m_rcControl). item contient des valeurs erronées.
Faut-il déclarer une variable membre pour chaque bouton? Qu'ai-je oublié?
non c'est un projet MDI ...
montre ton initialisation dans OnInitialUpdate .
il n' y a pas besoin d'avoir une variable attachée au controle .
si ça plante c'est que la ressource n'est pas dispo , bizar .
:D
je n'ai rien touché :oops:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 void CTestMdILayoutView::OnInitialUpdate() { CFormView::OnInitialUpdate(); CChildFrame *pChild=static_cast<CChildFrame *>(GetParentFrame()); if(pChild->GetInitialRectFrame().IsRectNull()) { ResizeParentToFit(); } AddControl(IDC_STATICLIB,eSizeType::sizeResize,eSizeType::sizeRepos); AddControl(IDOK,eSizeType::sizeRepos,eSizeType::sizeNone); AddControl(IDCANCEL,eSizeType::sizeRepos,eSizeType::sizeNone); InitDialog(pChild->GetInitialRectFrame(),FALSE); // initialisation de la DialogBar pChild->m_DlgBar.InitDialog(); }
il plante sur GetWindowRect() en fait. Je n'arrive pas à aller dans le code de cette fonction pour voir ce qu'il s'y passe :(Code:
1
2
3
4
5
6
7
8 void CTplLayout<GENERIC_LAYOUT>::AddControl(const UINT resID,const eSizeType xsize,const eSizeType ysize,const bool bFlickerFree) { CItem item; // create the new item CWnd *pWnd=GetDlgItem(resID); pWnd->GetWindowRect(item.m_rcControl); ...
voic le code d'erreur:
Exception non gérée à 0x7c28e64a (mfc71d.dll) dans TestMdILayout.exe:0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0x00000020.
beu c'est quoi le pb ? ,j'ai rajouté des boutons dans la view ça fonctionne j'ai pas de pb .
tu as fais quoi exactement ?
:D
j'ai rajouté des boutons sur le formview :oops: J'ai copié 6 fois le bouton "ok" et je les ai mis un peu partout dans la fenêtre. Rien de plus.
l'erreur dont je te parle viens du fait que pWnd = 0x000000000
:trouve: c'est quand j'enlève le static "A faire: placez les controles de formulaires sur cette boite de dialogue" que ça plante!!!
si ça plante ça veut dire que l'identifiant n'existe plus dans la ressource ..
c'est quel identifiant IDOK ?
verifis que les identifiants passés a addcontrol existent bien dans la ressource ...
:D
ok, ça marche, et je commence à comprendre!
bon, je vais essayer de comprendre ce que tu as fais. Il va donc me falloir comprendre les templates, connaitre un minimum sur les projet MDI, et me plonger dans ton code... une bonne soirée et une bonne nuit de dev en perspective :P
en tout cas, encore :merci: et :bravo:
j'ai rajouté des explications dans le post it.
:D