IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

wxWidgets Discussion :

[wxWidgets 2.8.7] wxTooltip dans une DLL


Sujet :

wxWidgets

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 10
    Par défaut [wxWidgets 2.8.7] wxTooltip dans une DLL
    Bonjour à tous,

    Je suis en train de développer une petite api win 32, avec appel de DLL.
    J'utilise wxWidgets pour faire mon interface.
    J'ai donc un exe (avec juste un wxInitialize();) qui charge une DLL, cette dernière s'occupant de créer une fenêtre avec un bouton.
    J'ai également rajouté un wxTooltip sur ce bouton.
    Mais quand je teste, l'affichage du tootip ne se fait pas...

    J'ai cherché sur le net, et la seule réponse qui me convienne est que je dois faire un RelayEvent dans ma boucle principale pour envoyer l'information au tooltip. Mais je dois me louper quelque part, car ça ne marche toujours pas (d'ailleurs le programme plante au moment du RelayEvent()...)

    Quelqu'un peut-il m'aider ? Merci d'avance.

    Voici mon source (y'a pas grand chose d'exceptionnel)

    Code de la DLL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    IMPLEMENT_APP_NO_MAIN(wxDLLApp)
     
    BOOL APIENTRY DllMain(HANDLE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved) 
    {
    	switch (ul_reason_for_call)
    	{ 
    	case DLL_PROCESS_ATTACH:
    		wxApp::SetInstance(new wxDLLApp());
    		wxInitialize();
    		break;
    	case DLL_PROCESS_DETACH:
    		wxEntryCleanup();
    		break; 
    	}
    	return TRUE;
    }
     
    extern "C" __declspec(dllexport) wxToolTip* DLLFunction(HWND handle)
    {
    	wxFrame * dlg = new wxFrame(NULL, 123, "Hello World From DLL", wxDefaultPosition, wxSize(1024,768));
    	dlg->Show();
     
    	wxButton * pButton1 = new wxButton(dlg, 125, "button 1");
    	pButton1->SetToolTip("Tooltip du button 1");
     
    	return pButton1->GetToolTip();
    }
     
    bool wxDLLApp::OnInit()
    {
    	return true;
    }

    Code de l'appli Win 32 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    typedef wxToolTip * (*DLLFunctionPtr) (HWND);
     
    int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow);
    LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM); 
     
    HMODULE hModule;
    DLLFunctionPtr pProc;
    wxToolTip* tool;
     
    // Entry point
    int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)
    {
    	WNDCLASSEX wcx; 
    	wcx.cbSize = sizeof(wcx);
    	wcx.style = CS_HREDRAW | CS_VREDRAW;
    	wcx.lpfnWndProc = MainWndProc;
    	wcx.cbClsExtra = 0;
    	wcx.cbWndExtra = 0;
    	wcx.hInstance = hInstance;
    	wcx.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    	wcx.hCursor = LoadCursor(NULL, IDC_ARROW);
    	wcx.hbrBackground = (HBRUSH)( COLOR_WINDOW+1 );
    	wcx.lpszMenuName =  "MainMenu";
    	wcx.lpszClassName = "MainWClass";
    	wcx.hIconSm = NULL;
     
    	ATOM a = RegisterClassEx(&wcx); 
    	assert(a);
     
    	HWND hwnd = CreateWindow("MainWClass","Test DLL",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,(HWND) NULL,(HMENU) NULL,hInstance,(LPVOID) NULL);
    	assert(hwnd);
     
    	// Load up the DLL and call DLLFunction
    	hModule = LoadLibrary("FromDLL.DLL");
    	assert(hModule);
    	pProc = (DLLFunctionPtr)GetProcAddress(hModule, "DLLFunction");
    	assert(pProc);
     
    	ShowWindow(hwnd, nCmdShow); 
    	UpdateWindow(hwnd); 
     
    	wxInitialize();
     
    	// Lancement de la DLL
    	tool = (pProc)(hwnd);
     
    	long bRet;
    	MSG msg;
    	while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0 ) 
    	{
    		if (bRet != -1)
    		{
    			TranslateMessage( &msg );
    			DispatchMessage( &msg );
    		}
    	}
     
    	return 0;
    }
     
    // Windows Callback Procedure
    LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
    	PAINTSTRUCT ps;
    	HDC hDC;
     
    	switch( msg ) {
    	  case WM_DESTROY:
    		  FreeLibrary(hModule);
    		  PostQuitMessage( 0 );
    		  break;
     
    	  case WM_MOUSEMOVE:
    		  tool->RelayEvent((WXMSG *)msg); // là, ça plante : il fait un GetToolTipCtrl()
    		  break;
     
    	  default:
    		  return( DefWindowProc( hWnd, msg, wParam, lParam ));
    	}
     
    	return 0;
    }
    Je vous ai enlevé les #include

  2. #2
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    J'ai moi aussi une partie du GUI dans des dlls externes.

    Par contre je fonctionne pas du tout comme cela.
    Si il faut tout rediriger les évènements, tu ne vas jamais t'en sortir !

    Le mieux c'est de faire une application "classique" "wxApp" et ensuite tu créer tes composants dans les différentes DLL que tu accroches tout bêtement à ton "wxApp" comme si tout était situé dans l'exécutable principale.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 10
    Par défaut
    en fait, je devrais à priori rediriger que les événements pour les tooltips (et peut-être aussi pour le wxAuiManager qui galère aussi)

    le pb de ta solution est que l'appli de réf avec laquelle je dois faire tourner mes DLL n'est pas une wxApp... Et que les wxWidgets restent des plugins à cette appli... du coup, je peux pas simplifier le pb (j'aurais bien voulu pourtant)

    je me vois donc dans l'obligation de faire cette redirection à la mano...

  4. #4
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    Ce que je comprend pas, c'est que tu dois quand même modifier le programme principale !

    C'est plus simple de faire wxWidgets -> win32 que win32 -> wxWidgets.

    Tu peux placer un wxApp dans le programme principale, tout peut être codé en MFC classique, car wxWdigets n'est qu'une surcouche de la MFC. Et cela facilite les plugins en wxWidgets.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 10
    Par défaut
    La structure première de l'appli sur laquelle je me branche est comme ça, je peux pas y faire grand chose...

    Mais je suis passé sous C# depuis (adieu wxWidgets)

    En tout cas, merci pour les réponses
    Je met le pb en résolu

  6. #6
    Membre émérite
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations forums :
    Inscription : Février 2006
    Messages : 564
    Par défaut
    Citation Envoyé par Ti-R Voir le message
    ... tout peut être codé en MFC classique, car wxWdigets n'est qu'une surcouche de la MFC ...
    Je m'avance peu être un peu trop mais je suis certain que wxWidget n'est pas une "surcouche" de la MFC. MFC et wxWidget sont toutes les deux des librairies C++ qui utilisent les API de Windows.

  7. #7
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    Oui pour être précis sur les thermes, c'est un mix des deux.
    Certaines parties utilisent la MFC d'autres parties utilisent l'API win32 directement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MDI][DLL] Enfant MDI dans une dll
    Par Pascal Jankowski dans le forum Composants VCL
    Réponses: 5
    Dernier message: 02/04/2004, 07h41
  2. [VStudio 6] pb avec fonctions dans une DLL
    Par MogDeChNord dans le forum MFC
    Réponses: 8
    Dernier message: 08/01/2004, 08h57
  3. [BP7] Problème chargement de ressource dans une DLL
    Par Alcatîz dans le forum Turbo Pascal
    Réponses: 11
    Dernier message: 26/07/2003, 21h36
  4. PB avec "self" dans une dll
    Par DiJiRiDouS dans le forum Langage
    Réponses: 2
    Dernier message: 21/02/2003, 09h32
  5. [VB6]Passage d'un tableau dans une DLL écrite en delphi
    Par flash dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 20/09/2002, 10h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo