OVH Cloud OVH Cloud

MainFrame.OnSize

13 réponses
Avatar
JM
Bonjour

J'ai un problème curieux.
J'ai une variable TabCtrl qui dérive de CTabCtrl dans le mainframe.
elle s'affiche très bien.
Si j'utilise la première version de OnSize, je ne peux pas
redimensionner la fenêtre d'application.
Si j'utilise la deuxième version, cela marche.
Pourtant, en utilisant le debugger, RectUtile et rr contiennent
exactement les mêmes valeurs!

Merci d'avance

void CMainFrame::OnSize(UINT nType, int cx, int cy)
{ CMDIFrameWnd::OnSize(nType, cx, cy);
CRect RectUtile,rt;

GetClientRect(&RectUtile);

TabCtrl.SetWindowPos(&wndTop,RectUtile.left,RectUtile.top,RectUtile.Width(),RectUtile.Height(),SWP_SHOWWINDOW
);
}

void CMainFrame::OnSize(UINT nType, int cx, int cy)
{ CMDIFrameWnd::OnSize(nType, cx, cy);
CRect RectUtile,rt;

GetClientRect(&RectUtile);

CRect rr(0,26,952,568);
RectUtile=rr; //LA SEULE DIFFERENCE!!

TabCtrl.SetWindowPos(&wndTop,RectUtile.left,RectUtile.top,RectUtile.Width(),RectUtile.Height(),SWP_SHOWWINDOW

}

10 réponses

1 2
Avatar
Arnold McDonald \(AMcD\)
GetClientRect() attend comme apramètre un LPRECT, pas un CRect.

Quand tu fais un CRect x(a,b,c,d); le constructeur initialise les membres de
x, pas quand tu fais CRect x; tout court. Dans ton second cas RectUtile
possède des membre initialisés. Dans ton premier cas non.

Plus l'erreur de type.

--
Arnold McDonald (AMcD) - Help #35/2006

http://arnold.mcdonald.free.fr/
Avatar
JM
Ah?
Je pensais que les mfc se démmerdaient avec tout ça, et vu que j'ai
repris en partie un exemple vu sur un autre forum.
Je vais tester pour voir.

Ceci dit, j'ai trouvé un bug supplémentaire qui empêchait de changer la
taille, un ReleaseCapture qui n'aime pas être appelé plusieurs fois de
suite me semble-t-il.

C'est fou, plus je progresse en programmation windows, plus je comprends
la difficulté de faire un code propre, stable et qui ne bug pas trop!
Il y a sans cesse des milliards de détails qui peuvent, au choix, aider
ou poser problème.
Sans parler de trucs difficiles à connaître car peu documenté.
Par exemple, je viens de découvrir OnSizeParent (WM_SIZEPARENT) qui peut
s'avérer très pratique pour ce que j'ai à faire.

Merci pour ta réponse.

Arnold McDonald (AMcD) a écrit :
GetClientRect() attend comme apramètre un LPRECT, pas un CRect.

Quand tu fais un CRect x(a,b,c,d); le constructeur initialise les membres de
x, pas quand tu fais CRect x; tout court. Dans ton second cas RectUtile
possède des membre initialisés. Dans ton premier cas non.

Plus l'erreur de type.



Avatar
Arnold McDonald \(AMcD\)
JM wrote:

C'est fou, plus je progresse en programmation windows, plus je
comprends la difficulté de faire un code propre, stable et qui ne bug
pas trop!



!!! Heu, tes problèmes n'ont rien à voir avec la "programmation Windows".
Plutôt avec des lacunes en programmation tout court. Ne pas employer les
bons types, les bons paramètres, ne pas avoir visiblement bien assimilé les
constructeurs, etc., c'est de la programmation, tout simplement. Si tu
programmes mal, Windows n'y est pour rien :-).

--
Arnold McDonald (AMcD)

http://arnold.mcdonald.free.fr/
Avatar
JM
Arnold McDonald (AMcD) a écrit :

!!! Heu, tes problèmes n'ont rien à voir avec la "programmation Windows".
Plutôt avec des lacunes en programmation tout court. Ne pas employer les
bons types, les bons paramètres, ne pas avoir visiblement bien assimilé les
constructeurs, etc., c'est de la programmation, tout simplement. Si tu
programmes mal, Windows n'y est pour rien :-).




Euuuhh quand je lis dans la msdn à propos de GetClientRect :

Parameters
lpRect
Points to a RECT structure *or* a CRect object to receive the client
coordinates. The left and top members will be 0. The right and bottom
members will contain the width and height of the window.

J'y peux rien moi!

Et puis savoir que faire deux releasecapture de suite ça fout son
bazard, bah ce n'est pas écrit dans la msdn et c'est un peu con!

Non mais! :o)
Avatar
Dominique Vaufreydaz
Bonjour,

Parameters
lpRect
Points to a RECT structure *or* a CRect object to receive the client
coordinates. The left and top members will be 0. The right and bottom
members will contain the width and height of the window.
J'y peux rien moi!



C'est pas faux. Mais il ne faut pas tenir compte du type de OnSise ?

Et puis savoir que faire deux releasecapture de suite ça fout son
bazard, bah ce n'est pas écrit dans la msdn et c'est un peu con!



Ouai, mais ca y'en a plein mon amis. Faire 2 "releases" de semaphore,
ca fout aussi le bronx, et c'est pas non plus ecrit dans la doc.

En general, ce genre de choses la vont pas pair. Si on acquiere
qqchose, on le relache...

Doms.
Avatar
JM
Dominique Vaufreydaz a écrit :

En general, ce genre de choses la vont pas pair. Si on acquiere
qqchose, on le relache...



Oui, mais je pensais que pour ce genre de truc, ils avaient pensé mettre
un test pour savoir si la fenêtre avait bien la capture avant de faire
un release.
Ca prend une ligne de code.

Mais bon, maintenant je le sais, ça pourra toujours me donner des
indications pour la suite.
Avatar
Arnold McDonald \(AMcD\)
JM wrote:

Euuuhh quand je lis dans la msdn à propos de GetClientRect :

Parameters
lpRect
Points to a RECT structure *or* a CRect object to receive the client
coordinates. The left and top members will be 0. The right and bottom
members will contain the width and height of the window.

J'y peux rien moi!



Je ne suis absolument pas spécialiste des MFCs, je t'accorde qu'il est
possible qu'il y ait des erreurs de-ci, de-là dans la doc, je n'en sais
rien. J'ai regardé la doc et, comme moi je lis rarement le texte explicatif
(je m'arrête à l'en-tête de la fonction dans la majorité des cas), j'ai
répondu qu'un problème de type devait être la cause.

Allez, jour à marquer d'une pierre blanche, je me lance (temporairement,
pour t'aider) dans les MFCs ! Qu'est-ce que j'aurai pas fait sur ce forum
quand même...

Voici un code MFC minimal qui utilise tes fonctions :

#define _AFXDLL
#include <afxwin.h>

class CMyApp : public CWinApp
{
public:
virtual BOOL InitInstance();
};

class CMainWindow : public CFrameWnd
{
public:
CMainWindow();
protected:
afx_msg void OnSize(UINT nType, int cx, int cy);
DECLARE_MESSAGE_MAP()
};

CMyApp myApp;

BOOL CMyApp::InitInstance()
{
m_pMainWnd = new CMainWindow;
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
return TRUE;
}

BEGIN_MESSAGE_MAP(CMainWindow,CFrameWnd)
ON_WM_SIZE()
END_MESSAGE_MAP()

CMainWindow::CMainWindow()
{
Create(NULL,TEXT("Yo!"));
}

void CMainWindow::OnSize(UINT nType, int cx, int cy)
{
CRect rect;
CPaintDC dc(this);
CString sz;
GetClientRect(&rect);
sz.Format(TEXT("%d - %d *** %d :
%d"),rect.Width(),rect.Height(),rect.right,rect.bottom);
dc.TextOut(0,0,sz);
}

Effectivement, on peut surcharger le GetClientRect avec du CRect. Du LPRECT
marche aussi. Donc, ce n'est sans doute pas l'origine de ton problème.

Comme tu peux le voir si tu essayes le code ci-dessus, les données
retournées par le GetClientRect() sont correctes et s'affichent bien dans la
fenêtre (pour les voir changer, redimensionne la fenêtre).

Il te faudrait donc te poser les questions suivantes :

- Fais-tu le GetClientRect() au bon endroit ? Dans la bonne classe ?
- Quelles coordonnées te sont retournées ? Sont-elles valides ?

Paske, note-bien que, dans ton code, dès lors que tu forces des coordonnées
valides, tu dis que ça fonctionne...

Ouf, fin de mon incursion MFC...

--
Arnold McDonald (AMcD) - Help #36/2006

http://arnold.mcdonald.free.fr/
Avatar
Dominique Vaufreydaz
Tu vas du coté Obscur de la force :
MFC is the Path of the Dark Side.

MFC leads to Anger (Pas la ville, hein ???).

Anger leads to Hate,

Hate leads to Suffering.



CQFD. Doms.
Avatar
Arnold McDonald \(AMcD\)
MDR.

Tu noteras que, même en MFC, je reste AMcD ! Un seul fichier, pas
d'assistants, pas 50 dossiers, aucun include, etc. Compare avec un projet
MFC généré par Visual Studio...

Merci à Prosize et Kruglinski au passage :-).

PS : pour ceux qui veulent exécuter le code du post ci-dessus, creér un
projet Win32 (vivi !) et ne pas oublier dans ses options pour le linker de
spécifier /ENTRY:"wWinMainCRTStartup" dans la ligne de commande...

--
Arnold McDonald (AMcD)

http://arnold.mcdonald.free.fr/
Avatar
Dominique Vaufreydaz
Bonjour,

Tu noteras que, même en MFC, je reste AMcD ! Un seul fichier, pas
d'assistants, pas 50 dossiers, aucun include, etc. Compare avec un
projet MFC généré par Visual Studio...



On commence comme ca... Après on se dit que l'assistant, finalement,
il pourrait bien le faire ;-P

Merci à Prosize et Kruglinski au passage :-).



Ouai ! ;-P

Doms.
1 2