cs_Jbs106
Messages postés32Date d'inscriptionmardi 9 septembre 2003StatutMembreDernière intervention27 avril 2010
-
27 avril 2010 à 22:26
cs_Jbs106
Messages postés32Date d'inscriptionmardi 9 septembre 2003StatutMembreDernière intervention27 avril 2010
-
27 avril 2010 à 22:27
Bonjour
Bonjour,
comme je l'ai précisé dans le titre, je souhaite réaliser une application de dessin, un SKETCHER avec les MFCs, je l'ai réalisé grace à un bouquain, le mien, je le nomme Drawer.
J'ai trouvé sur le net, une (autre) application structuré comme les mfc, sans les mfc(ce que je souhaitai!) mais qui ne possede pas d'objet Application..
Dans mon application, j'ai un objet Programme contenant le hinstance, un objet TMainFrame contenant l'objets Drawer (qui est sensé être l'objet doc et view mais pour le moment je simplifie) dans lequel je souhaite dessiner et normalement les objet de barre d'outil...
Mes soucis:
- les messages n'arrivent pas jusqu'à la fenetre de dessin comme dans le logiciel paint.
- si je force l'envoie de message de TMainFrame, mon application bug un peu...
Je pense avoir besoin d'une brillante explication, d'une lumière, d'un petit cour
pour détailler, j'ai un fichier Window.h de la GNU qui m'offre quelque fonctionnalité de base pour mes controles..
// création fenêtre principale
this->_hSelf = CreateWindowEx(0, szWndClass, this->_pApp->GetAppTitle(), WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
NULL, NULL, this->_pApp->GetHInst(), this);
return (_hSelf != NULL);
}
LRESULT CALLBACK TMainFrame::WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
// affecter l'objet TMainFrame lors de la création de la fenêtre, contenu dans la
// structure CREATESTRUCT pointée par lParam
if(msg == WM_CREATE)
{
LPCREATESTRUCT lpcs = (LPCREATESTRUCT) lParam;
SetWindowLong(hWnd, GWL_USERDATA, (LONG)lpcs->lpCreateParams);
}
// récupération objet TMainFrame associé à la fenêtre
TMainFrame* pWnd = (TMainFrame*) GetWindowLong(hWnd, GWL_USERDATA);
if(!pWnd)
return DefWindowProc(hWnd, msg, wParam, lParam);
switch(msg)
{
case WM_SETFOCUS : return pWnd->MsgSetFocus (wParam, lParam);
case WM_CREATE : return pWnd->MsgCreate (hWnd, wParam, lParam);
case WM_CLOSE : return pWnd->MsgClose (wParam, lParam);
case WM_DESTROY : return pWnd->MsgDestroy (wParam, lParam);
case WM_COMMAND : return pWnd->MsgCommand (wParam, lParam);
default : return DefWindowProc(hWnd, msg, wParam, lParam);
}
LRESULT TMainFrame::MsgCommand(WPARAM wParam, LPARAM lParam)
{
// on laisse la vue de la zone cliente commencer par traiter la commande
if(SendMessage(this->_pDrawer->getHSelf(), WM_COMMAND, wParam, lParam))
return TRUE;
int nIDCtl = LOWORD(wParam); // en fonction de la commande
switch(nIDCtl)
{
case IDM_EXIT : CmdFileQuit (); break;
default : return FALSE;
}
return TRUE;// la commande a été traitée
}
void TMainFrame::CmdFileQuit(){ SendMessage(_hSelf, WM_CLOSE, 0, 0);}
et enfin ma class drawer me servant pour le moment de document et de vue:
Code :
#ifndef DRAWER_H
#define DRAWER_H
class CElement;
class Drawer:public Window
{
protected :
TMainFrame* _pTMainFrame;
LRESULT CALLBACK Drawer::WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
// affecter l'objet Drawer lors de la création de la vue, contenu dans la
// structure CREATESTRUCT pointée par lParam
if(msg == WM_CREATE)
{
LPCREATESTRUCT lpcs = (LPCREATESTRUCT) lParam;
SetWindowLong(hWnd, GWL_USERDATA, (LONG)lpcs->lpCreateParams);
}
// récupération objet Drawer associé à la fenêtre
Drawer* pWnd = (Drawer*) GetWindowLong(hWnd, GWL_USERDATA);
if(!pWnd)
return DefWindowProc(hWnd, msg, wParam, lParam);
// en fonction du message
switch(msg)
{
case WM_MOUSEMOVE : return pWnd->MsgMouseMove (wParam, lParam);
default : return FALSE;
}
}
}
J'ai simplifié au maximum, les messages ne transite pas par mon drawer alors que je sais que c'est possible... mais c'est certain qu'il me manque quelque chose...
Je souhaite avoir un MainFrame comme dans les MFC et un modèle Vue/Document (que je regroupe) dans mon Drawer, Window sert à stocker le HANDLE de ma fenetre et quelques fonctions utilent pour le developpement de mon application.
Je n'arrive pas à faire transiter mes messages "naturellement" vers les evenement utilisateur de Drawer comme l'application paint.