SetDlgItemText dans un Theard

Signaler
Messages postés
334
Date d'inscription
samedi 12 janvier 2002
Statut
Membre
Dernière intervention
3 juillet 2010
-
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
-
J'ai réalisé un Theard :

HANDLE hConnect;
DWORD threadId;
DWORD WINAPI Mon_Theard (LPVOID param);
...

hConnect=CreateThread(NULL,0,Mon_Theard,NULL,0,&threadId);
...

DWORD WINAPI Mon_Theard (LPVOID param)
{
SetDlgItemText(hdlg,IDC_STATIC1,"Hello");
return 0;
}

Je ne comprend pas pourquoi, le Hello ne s'affiche pas.
Pourtant le Theard est bien exécuté.
Mon problème doit venir du hdlg qui ne ce trouve pas dans DWORD WINAPI Mon_Theard (LPVOID param). En rajoutant HWND hdlg, ça ne compile pas.

Que faire ?
Merci
A voir également:

8 réponses

Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
hDlg représente le HANDLE de ta fenetre parent et doit etre déclaré en global.
Tu n'as pas a modifier le prototype de la fonction. Normal que ca compile pas.

Dans ton DlgProc, dans WM_CREATE ou WM_INITDIALOG, fait hDlg = hWnd.

Ensuite ca devrais marcher.

Shell
Messages postés
334
Date d'inscription
samedi 12 janvier 2002
Statut
Membre
Dernière intervention
3 juillet 2010

Je ne comprends pas vraiment ce que tu veux dire, voici tout le code :

#include <windows.h>
#include <stdio.h>
#include "resource.h"

HWND hdlg;
HANDLE hConnect;
DWORD threadId;
DWORD WINAPI Mon_Theard (LPVOID param);
// ''''''''
BOOL CALLBACK AppDlgProc(HWND hdlg, UINT mssg, WPARAM wParam, LPARAM lParam)
{
switch(mssg)
{
case WM_INITDIALOG:
//	hDlg = hWnd; <-- err.
hConnect=CreateThread(NULL,0,Mon_Theard ,NULL,0,&threadId);
return TRUE;
break;

case WM_COMMAND:
{      
switch(LOWORD(wParam))
{
case IDCANCEL:
{
EndDialog(hdlg, 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;
}
// ''''''''
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
ben ou a ete initialise hdlg de:
SetDlgItemText(hdlg,IDC_STATIC1,"Hello");

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
334
Date d'inscription
samedi 12 janvier 2002
Statut
Membre
Dernière intervention
3 juillet 2010

Justement, je n'arrive pas à l'initialiser le hdlg

DWORD WINAPI Mon_Theard (LPVOID param)
{
HWND hdlg;
SetDlgItemText(hdlg,IDC_STATIC1,"Hello");
return 0;
}

Il y a une erreur de compilation

DWORD WINAPI Mon_Theard (HWND hdlg,LPVOID param)
{
SetDlgItemText(hdlg,IDC_STATIC1,"Hello");
return
}

Il y a une erreur de compilation aussi

J'ai essayé plain de chose, je ne comprends pas DeAtHCrAsH avec :
hDlg représente le HANDLE de ta fenêtre parent et doit être déclaré en global

Que dois je faire pour que ça fonctionne merci
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
Mais regarde bien ce que tu fais.
hdlg est variable globale de meme nom que le HWND de ta dlgproc alors tu ne peux pas ecrire hdlg = hdlg;

change nom de la globale en hmain:
case WM_INITDIALOG:
hmain = hdlg;
.......

DWORD WINAPI Mon_Theard (HWND hdlg,LPVOID param)
{
SetDlgItemText(hmain,IDC_STATIC1,"Hello");
return 0;
}

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
ahhh merde, et je fais un copier coller d'une connerie en +:

DWORD WINAPI Mon_Theard (LPVOID param)
{
SetDlgItemText(hmain,IDC_STATIC1,"Hello");
return 0;
}

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
334
Date d'inscription
samedi 12 janvier 2002
Statut
Membre
Dernière intervention
3 juillet 2010

Je comprend pas tôt c'est fonction : HWND, HANDLE, DWORD, WPARAM, LPARAM

Il faudrait que je me documente un peut plus, ça peut être utile.
Merci BruNews, ça fonctionne
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
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.