[OpenGl][Delphi] Icone de fenetre [Résolu]

philc94 14 Messages postés vendredi 28 novembre 2008Date d'inscription 29 mars 2009 Dernière intervention - 22 mars 2009 à 15:26 - Dernière réponse : philc94 14 Messages postés vendredi 28 novembre 2008Date d'inscription 29 mars 2009 Dernière intervention
- 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)
Afficher la suite 

Votre réponse

9 réponses

Meilleure réponse
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 25 mars 2009 à 09:14
3
Merci
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;

Merci cs_rt15 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 92 internautes ce mois-ci

Commenter la réponse de cs_rt15
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 23 mars 2009 à 19:53
0
Merci
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).
Commenter la réponse de cs_rt15
philc94 14 Messages postés vendredi 28 novembre 2008Date d'inscription 29 mars 2009 Dernière intervention - 24 mars 2009 à 07:25
0
Merci
Salut,
Je vais tester ca, merci de ta reponse.
Commenter la réponse de philc94
philc94 14 Messages postés vendredi 28 novembre 2008Date d'inscription 29 mars 2009 Dernière intervention - 24 mars 2009 à 08:31
0
Merci
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.
Commenter la réponse de philc94
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 24 mars 2009 à 11:23
0
Merci
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é.
Commenter la réponse de cs_rt15
philc94 14 Messages postés vendredi 28 novembre 2008Date d'inscription 29 mars 2009 Dernière intervention - 24 mars 2009 à 20:41
0
Merci
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?
Commenter la réponse de philc94
philc94 14 Messages postés vendredi 28 novembre 2008Date d'inscription 29 mars 2009 Dernière intervention - 24 mars 2009 à 20:43
0
Merci
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?
Commenter la réponse de philc94
philc94 14 Messages postés vendredi 28 novembre 2008Date d'inscription 29 mars 2009 Dernière intervention - 29 mars 2009 à 15:45
0
Merci
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
Commenter la réponse de philc94
philc94 14 Messages postés vendredi 28 novembre 2008Date d'inscription 29 mars 2009 Dernière intervention - 29 mars 2009 à 15:46
0
Merci
Desole pour les sauts de ligne, ils veulent pas se faire :s
Commenter la réponse de philc94

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.