Tu m'as l'air un peu emmélé dans tout ces termes, alors je vais prendre 10 minute pour t'expliquer tout ca!
Avant tous faut savoir leur definitions et ce qu'il représente.
Quand tu crée une boite de dialog, un identifiant UNIQUE lui est donné afin quel puisse interagir avec tous les composants quel comporte, et autres.
Cet identifiant s'appelle le handle est pour une boite de dialog il correspond a HWND.
HWND est un type comme char, int, double,...
Maintenant quand tu crées un dialog, tu te sert d'une fonction de CallBack qui va te permettre d'intercepter tout les messages envoyés et recus par le programme et ces composants.
Cette fonction de CallBack est générallement appellé "DlgProc", qui signifie "Dialog Processus".
Ensuite ce qu'il ne faut pas oublié, que toute les varaibles déclaré dans une fonction, ont une porté local. Cela signifie qu'elle sont valable uniquement dans la fonctions qui les a créer!
Ainsi quand on parle de variable GLOBALE, cela indique que ces variables sont déclarées en tete de page et que toute les fonctions du programme peuvent s'en servir.
Tu comprends donc qu'il existe 2 genres de variables : les GLOBALES et les LOCALES.
Pour en revenir a ton probleme, dans ta fonction de CallBack DialogProc, tu récois la valeurs de ton HWND en parametres.
Ainsi pour que toutes tes fonctions puissent utiliser ce HWND, tu es obligé de passer sa valeur à une variable de meme type qui sera GLOBALE! Car le HWND que tu recois a une porté locale du fait que sa declaration se trouve dans la fonction.
Pour ce qui est de WPARAM et de LPARAM, ce sont des parametres qui te permettent d'identifier les messages recues dans ta fonction de CallBack DlgProc.
Pour plus de renseignement sur ces variables, voir la MSDN. Mais ce n'est pas des plus necessaires.
POur faire simple dis toi que LPARAM et WPARAM sont de simple parametres de la fonctions DlgProc.
Sinon si tu es sous VC++, mets ta souris sur le mot DWORD par exemple et fait un clique droit puis va sur "Go to the definition of ..."
Ca te dira a quoi correspond exactement ce type.
WPARAM, LPARAM et DWORD sont simplement es macros, c'est a dire des type de variables qui résulte de l'association de plusieurs type. Tu peux toi meme en créer.
Je pense avoir tout expliqué sans faire d'erreur. Pour finir voici le code que tu as posté après avec quelques correction pour qu'il puisse marcher.
#include <windows.h> #include <stdio.h> #include "resource.h"
HWND hDlg; //Ca c'est le HANDLE declarés en GLOBAL HANDLE hConnect; DWORD threadId; DWORD WINAPI Mon_Theard (LPVOID param); // '''''''' BOOL CALLBACK AppDlgProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { switch(Msg) { case WM_INITDIALOG: // hDlg = hWnd; // Ici on transfere la valeur de hWnd dans hDlg pour que les autres fonctions puisse y avoir accès hConnect=CreateThread(NULL,0,Mon_Theard ,NULL,0,&threadId); return TRUE; break;
case WM_COMMAND: { switch(LOWORD(wParam)) { case IDCANCEL: { EndDialog(hWnd, 0); return TRUE; break; } } } default: break; } return FALSE; } // '''''''' int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, int) { DialogBox(hInstance, MAKEINTRESOURCE(IDD_APP), NULL, AppDlgProc); return 0; } // '''''''' DWORD WINAPI Mon_Theard (LPVOID param) { SetDlgItemText(hDlg,IDC_STATIC1,"Hello"); return 0; } // ''''''''
|
Voila si certains voyent des erreurs qu'ils me le disent.
J'espere t'avoir un peu plus eclairci sur le sujet tout en esperant que tu y retiennes au mieux que possible.
A++ et bonne continuation...
Shell
P.S : il ne faut jamais changer les parametres des fonctions deja défini dans le langage C/C++ sinon ca ne fonctionne pas et le compilateur te generes des erreurs. Je dis ca pour la creation du thread ou tu a essayé de mettre le HWND en parametre.