[OpenGl][Delphi] Icone de fenetre

Résolu
philc94 Messages postés 13 Date d'inscription vendredi 28 novembre 2008 Statut Membre Dernière intervention 29 mars 2009 - 22 mars 2009 à 15:26
philc94 Messages postés 13 Date d'inscription vendredi 28 novembre 2008 Statut Membre Dernière intervention 29 mars 2009 - 29 mars 2009 à 15:46
Bonjour,
Je suis actuellement en train de creer une application.
J'aimerais savoir comment il est possible d'associer une icone a une fenetre generee avec Opengl. L'icone serait afficher en haut a gauche de le fenetre, a cote du nom de l'application (ex: le renard pour FiroFox ou le E pour InternetExplorer).
J'ai fait des recherche sur google mais je n'ai rien trouve du tout.

Merci d'avance.

Philippe

(j'utilise GLFW pour generer les fenetres)

9 réponses

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
25 mars 2009 à 09:14
Disons que ça permet de t'assurer que la fenêtre correspond bien à l'instance de ton application.

Par exemple, si ton application est lancée deux fois, FindWindow ne te renverra que le handle d'une des deux.

Tu affecterais donc deux fois l'icône de la fenêtre de ta première instance, et pas celui de la fenêtre de ta deuxième instance.

Ca permet aussi de pas avoir de problème dans le cas ou quelqu'un d'autre ferait une application avec la même classe/caption de fenêtre.

procedure TForm1.Button1Click(Sender: TObject);
var
  hWnd: THandle;
  nProcessId: Cardinal;
begin
  hWnd:= 0;
  repeat
    hWnd:= FindWindowEx(0, hWnd, 'TForm1', 'Form1');
    GetWindowThreadProcessId(hWnd, nProcessId);
  until nProcessId = GetCurrentProcessId;
  SendMessage(hWnd, WM_SETICON, ICON_SMALL, lpIcon.Handle);
end;
3
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
23 mars 2009 à 19:53
Salut,

Il faut que tu récupères un handle sur ta fenêtre OpenGL, je suppose que GLFW te le permet facilement. Tu pourras ensuite faire un truc dans ce genre là (lpIcon, champ de classe TIcon privé à la Form) :

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FreeAndNil(lpIcon);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  lpIcon:= TIcon.Create;
  lpIcon.LoadFromFile('c:\test.ico');
  SendMessage(Handle, WM_SETICON, ICON_SMALL, lpIcon.Handle);
end;

Si GLFW ne te fourni pas le Handle, tu pourra le récupérer avec FindWindow, avec une vérification que c'est bien la bonne fenêtre à l'aide de GetWindowThreadProcessId (S'il y a plusieurs instances de ton appli par exemple).
0
philc94 Messages postés 13 Date d'inscription vendredi 28 novembre 2008 Statut Membre Dernière intervention 29 mars 2009
24 mars 2009 à 07:25
Salut,
Je vais tester ca, merci de ta reponse.
0
philc94 Messages postés 13 Date d'inscription vendredi 28 novembre 2008 Statut Membre Dernière intervention 29 mars 2009
24 mars 2009 à 08:31
Je viens de tester mais ca ne fonctionne pas .

Voici mon code :
        if glfwopenwindow(window.x,window.y,0, 0, 0, 0, 0, 0,display_screen) <> 1 then  //ouvre une fenetre aec glfw
          begin
            glfwTerminate;
            Exit;
          end;


        lpIcon:= TIcon.Create;
        lpIcon.LoadFromFile('WarForDummies.ico');
        SendMessage(glfwGetThreadID, WM_SETICON, ICON_SMALL, lpIcon.Handle);
         //glfwGetThreadID fournit le Handle

Meme en mettant lien absolu pour l'icone rien ne se passe, j'ai toujours l'icone toute moche en haut a gauche de mon appli.
J'ai pas precise mais je suis en application console et pas en fiche VCL.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
24 mars 2009 à 11:23
Tu a décidé de passer glfwGetThreadID à SendMessage, je me demande bien pourquoi.

Il faut lui passer le handle de ta fenêtre crée par glfwopenwindow.

Visiblement tu n'a pas accès à cet handle. Il faut donc que tu fasse une recherche avec FindWindow et une vérification avec GetWindowThreadProcessId, comme je te l'ai expliqué.
0
philc94 Messages postés 13 Date d'inscription vendredi 28 novembre 2008 Statut Membre Dernière intervention 29 mars 2009
24 mars 2009 à 20:41
Pour l'instant j'ai ca :
Handle:=FindWindow(nil,'WarForDummies');

lpIcon:= TIcon.Create;
lpIcon.LoadFromFile('WarForDummies.ICO');
SendMessage(Handle, WM_SETICON, ICON_SMALL, lpIcon.Handle);

handle ne vaut pas 0, j'ai verifie. Par contre je ne comprend pas quand tu me dis de verifier avec GetWindowThreadProcessId. Tu pourrais me montrer en corrigeant mon code stp?
0
philc94 Messages postés 13 Date d'inscription vendredi 28 novembre 2008 Statut Membre Dernière intervention 29 mars 2009
24 mars 2009 à 20:43
desole pour les sauts de ligne qui manquent...

Pour l'instant j'ai ca :

Handle:=FindWindow(nil,'WarForDummies');
lpIcon:= TIcon.Create;
lpIcon.LoadFromFile('WarForDummies.ICO'); SendMessage(Handle, WM_SETICON, ICON_SMALL, lpIcon.Handle);

handle ne vaut pas 0, j'ai verifie. Par contre je ne comprend pas quand tu me dis de verifier avec GetWindowThreadProcessId.

Tu pourrais me montrer en corrigeant mon code stp?
0
philc94 Messages postés 13 Date d'inscription vendredi 28 novembre 2008 Statut Membre Dernière intervention 29 mars 2009
29 mars 2009 à 15:45
Bonjours,

J'ai modifie moon code en fonction de ce que tu m'as dit et j'ai :

lpIcon:= TIcon.Create;
lpIcon.LoadFromFile('WarForDummies.ico');


hWnd:= 0;
repeat
hWnd:= FindWindowEx(0, hWnd,
nil, 'WarForDummies');
GetWindowThreadProcessId(hWnd, nProcessId);
until nProcessId = GetCurrentProcessId;
SendMessage(hWnd, WM_SETICON, ICON_SMALL, lpIcon.Handle);

Et c fonctionne tres bien.
Merci
0
philc94 Messages postés 13 Date d'inscription vendredi 28 novembre 2008 Statut Membre Dernière intervention 29 mars 2009
29 mars 2009 à 15:46
Desole pour les sauts de ligne, ils veulent pas se faire :s
0
Rejoignez-nous