Newsgroup: it.comp.programmare.win32
Titolo: Icona con le WinApi32

 
Su internet ho trovato una piccola guida su come  creare  una piccola 
finestre con le WinApi32 (riporto il codice alla fine del messaggio...).
 
Per cambiare icona sulla barra della finestra ho trovato questo codice:
wc.hIconSm = LoadImage(NULL, "menu_two.ico", IMAGE_ICON, 16, 16, 
LR_LOADFROMFILE);
 
Il problema è che funziona solo se il file dell'icona è presente nella 
stessa cartella dell'eseguibile.
 
C'è un rimedio per includere l'icona all'interno dell'eseguibile?
 
nero23
 
ciao
 
 
 
//  Codice in C
 
#include <windows.h>
 
const char g_szClassName[] = "myWindowClass";
 
// Step 4: the Window Procedure
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
     switch(msg)
         {
         case WM_CLOSE:
             DestroyWindow(hwnd);
             break;
         case WM_DESTROY:
             PostQuitMessage(0);
             break;
         default:
             return DefWindowProc(hwnd, msg, wParam, lParam);
         }
     return 0;
}
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR 
lpCmdLine, int nCmdShow)
{
     WNDCLASSEX wc;
     HWND hwnd;
     MSG Msg;
 
     //Step 1: Registering the Window Class
     wc.cbSize		 = sizeof(WNDCLASSEX);
     wc.style		 = 0;
     wc.lpfnWndProc	 = WndProc;
     wc.cbClsExtra	 = 0;
     wc.cbWndExtra	 = 0;
     wc.hInstance	 = hInstance;
     wc.hIcon		 = LoadIcon(NULL, IDI_APPLICATION);
     wc.hCursor		 = LoadCursor(NULL, IDC_ARROW);
     wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
     wc.lpszMenuName  = NULL;
     wc.lpszClassName = g_szClassName;
     wc.hIconSm		 = LoadIcon(NULL, IDI_APPLICATION);
 
     if(!RegisterClassEx(&wc))
         {
             MessageBox(NULL, "Window Registration Failed!", "Error!", 
MB_ICONEXCLAMATION | MB_OK);
             return 0;
         }
 
     // Step 2: Creating the Window
     hwnd = CreateWindowEx(
                WS_EX_CLIENTEDGE,
                g_szClassName,
                "The title of my window",
                WS_OVERLAPPEDWINDOW,
                CW_USEDEFAULT, CW_USEDEFAULT, 240, 120,
                NULL, NULL, hInstance, NULL);
 
     if(hwnd == NULL)
         {
             MessageBox(NULL, "Window Creation Failed!", "Error!", 
MB_ICONEXCLAMATION | MB_OK);
             return 0;
         }
 
     ShowWindow(hwnd, nCmdShow);
     UpdateWindow(hwnd);
 
     // Step 3: The Message Loop
     while(GetMessage(&Msg, NULL, 0, 0) > 0)
         {
             TranslateMessage(&Msg);
             DispatchMessage(&Msg);
         }
     return Msg.wParam;
}

 C'è un rimedio per includere l'icona all'interno dell'eseguibile?
 
La puoi dichiarare nel file risorse (.rc) e poi riferirti ad essa 
tramite l'ID, es:
 
IDI_ICON01   ICON  DISCARDABLE  "icona01.ico"
 
Vedi qua:
http://msdn.microsoft.com/en-us/library/vstudio/5h5f871a.aspx
 

 IDI_ICON01 ICON DISCARDABLE "icona01.ico"
 
 
Fatto e funziona.
 
Grazie

 IDI_ICON01 ICON DISCARDABLE "icona01.ico"
 
 
Sempre su internet ho trovato un esempio che riporta quanto da te scritto.
In aggiunta al file .rc, nell'esempio c'ï¿œ anche il file .h con il 
seguente testo:
 
// risorse.h
#define IDI_MYICON 102
 
 
 
e sul file .rc
// file.rc
#include "risorse.h"
IDI_MYICON  ICON   DISCARDABLE    "icona.ico"
 
 
 
perchï¿œ si assegna il valore 102 alla variabile IDI_MYICON?
 
 
ciao

 perchï¿œ si assegna il valore 102 alla variabile IDI_MYICON?
 
Ad ogni risorsa (icona, menu, dialog box, ecc) deve essere assegnato un 
identificativo univoco (102 e' un valore scelto a caso), l'importante e' 
che sia diverso per ciascuna risorsa.
Questi identificativi sono riportati nel file .h, in modo da poter 
essere facilmente messi a disposizione a tutti sorgenti che ne fanno uso.
 
Se utilizzi Visual C++, tutto questo lavoro verra' effettuato 
automaticamente dal resource editor, cioe' ad esempio quando crei una 
nuova risorsa (ad es. una dialog), le verra' assegnato un ID, il 
prossimo disponibile, e verranno aggiornati i file .rc e .h.
 
In sostanza tutto quello che metti nel file .rc diventa parte 
dell'eseguibile. Lo puoi considerare come parte del segmento dati, dove 
l'ID e' semplicemente un puntatore al dato.

 
Questa cosa dell icona, e del file.rc,  funziona solo con compilatori
MS? o funziona anche con Mingw, Djgpp? altri compilatori!
 
 
Ciao
 
 
 
 

 MS? o funziona anche con Mingw, Djgpp? altri compilatori!
 
http://www.mingw.org/wiki/MS_resource_compiler
 

 ha scritto nel messaggio 
news:526d7242$0$1365$4faf...@reader1.news.tin.it...

Capito poco. Com Mingw/Gnu tools, il file.rc e uguale a quello che si 
utilizza con MS?
 
Ciao 
 
 

 utilizza con MS?
 
Non saprei, non mai ho mai utilizzato mingw, anche se non credo ci siano 
grosse differenze. Comunque se da un lato e' vero che a volte capita di 
scrivere il file .rc a mano (o di trovarne uno gia' fatto), e' anche 
vero che l'uso di questi file ha senso insieme ad un editor di risorse, 
che ti permette di "disegnare" e modificare questi componenti in modo 
visuale, poi la generazione del file .rc avviene in automatico.

 ha scritto nel messaggio 
news:526ecc08$0$1374$4faf...@reader1.news.tin.it...

Ok, gr�zie.
 
Ciao