Image Bitmap not showing

So, I was experimenting with Windows Applications, but when I try to diaplay an image the program compiles but the image does't show up.
The file "logo.bmp" is in the same folder as the .cpp and the .exe

Feel free to ignore the comments, they're written in Italian and they're just my annotations, but nothing important.

Sorry for misspells and grammar errors, but I'm italian and English isn't my main language

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
//header, l'inizio della fine

#include <windows.h>    
#include <tchar.h>

//definizioni di costanti per le funzioni

#define FILE_MENU_NEW 1  
#define FILE_MENU_OPEN 2 
#define FILE_MENU_EXIT 3 
#define CHANGE_TITLE 4


//handler  unsigned int, parametri
//window procedure riferimento, per usarlo dopo
LRESULT CALLBACK WinProc(HWND, UINT, WPARAM, LPARAM); 

//funzione per aggiungere i menu, riferimento
void AddMenus(HWND);

//funzione per aggiungere i controlli, riferimento
void AddControls(HWND);

//funzione per aggiungere le immagini, riferimento
void LoadImages();

//variabile globale, handler per i menu
HMENU hmenu;

//variabili globali, bitmap per le immagini
HBITMAP hLogoImage;

//variabile globale, handler per i controlli
HWND hedit;

//variabile globale, handler per le immagini
HWND hLogo;



//come un int main, ma per l'header windows.h
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR args, int ncmdshow) { 
	WNDCLASSW wc = {0};    						//window class w (tipo di window class)
	
	wc.hbrBackground = (HBRUSH)COLOR_WINDOW;    //sfondo della finestra
	wc.hCursor = LoadCursor(NULL, IDC_ARROW);   //cursore del mouse, IDC_qualcosa è la forma del cursore
	wc.hInstance = hInst;			            //istanza per la finestra
	wc.lpszClassName = L"WinClass";             //la classe registrata per la finestra
	wc.lpfnWndProc = WinProc;                   //si occupa degli eventi della finestra
	
	if(!RegisterClassW(&wc)) {  				//registra la finestra (Class W, come prima) 
		return -1;			    				//controlla se la finestra si è registrata, altrimenti ritorna -1 e chiude il programma
	}
	
//crea window W	da che classe, nome fin, stile soprapposto e visibile, top left,  larg, lung, handler, menu, instance, parametri 
	CreateWindowW(L"WinClass", L"Iea boi", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 500, 500, NULL, NULL, NULL, NULL);

//struttura per i messaggi
	MSG msg = {0};

// loop per tenere aperta la finestra
// GetMessage, usa struttura, handler, filterMIN, filterMAX 	
	while( GetMessage(&msg, NULL, NULL, NULL))
	/*lo stesso messaggio "la finestra è aperta", viene mandato avanti e indietro,
	 tradotto e dispatchato, finchè GetMessage = false*/
	{ 
		TranslateMessage(&msg);
		DispatchMessage(&msg);		
	}

	
	return 0;
	
}

//window procedure definizione; handler, messaggio, parametri; definisce tutti gli eventi
LRESULT CALLBACK WinProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) {	
	switch(msg)	{
		
	case WM_COMMAND:	                                  //tipo di Windows message, quando un item viene cliccato
		
		switch(wp){	                                  	  //controlla quale item viene cliccato
		case FILE_MENU_EXIT:               				  // se l'id è FILE_MENU_EXIT
			DestroyWindow(hwnd);						  //Distrugge la finestra con hwnd come handler
			break;
		case FILE_MENU_NEW:							      //se l'id è FILE_MENU_NEW
			MessageBox(hwnd, "HIII", "New", MB_OK); //crea un box e lo attacca alla finestra quando viene cliccato
		    MessageBeep(MB_ICONQUESTION);                 //produce un suono	
			break;
		case CHANGE_TITLE:								  //se l'id è CHANGE_TITLE
			wchar_t text[100];							  //variabile per prendere i wchar
			GetWindowTextW(hedit, text, 100);			  //prende i wchar
			SetWindowTextW(hwnd, text);					  //setta i wchar presi come nome della finestra
			break;
		}
		break;
			
	case WM_CREATE:    									  // tipo di Windows message, quando si crea la finestra
		LoadImages();									  //aggiunge le immagini
		AddMenus(hwnd); 								  // aggiunge i menu
		AddControls(hwnd); 								  // aggiunge i controlli
		break;		
		
	case WM_DESTROY:	    							  // tipo di window message, quando si clicca sulla X
		PostQuitMessage(0); 							  //GetMessage = false
		break;
		
	default: 	                                  		  //tutti i messaggi non dei tipi sopracitati
		return DefWindowProcW(hwnd, msg, wp, lp);		  // ritornano un valore al window procedure 
	}	
}

//aggiungere i menu, definizione, usa un handler per sapere dove attaccarsi
void AddMenus(HWND hwnd) {
	hmenu = CreateMenu();           					  //crea un menu e lo assegna alla vaariabile globale
	HMENU hFileMenu = CreateMenu(); 					  //nuovo menu
	HMENU hSubMenu = CreateMenu();  					  //nuovo menu
	
	//aggiunge un item al menu
	//menu, tipo di menu, id, nome
	
	AppendMenu(hSubMenu, MF_STRING, NULL, "SubMenu Item");       //appende Change Title Item a hSubMenu
	
	AppendMenu(hFileMenu, MF_STRING, FILE_MENU_NEW, "New");  			 //appende Nuovo a hFileMenu
	AppendMenu(hFileMenu, MF_POPUP, (UINT_PTR)hSubMenu, "Open SubMenu"); //appende Open SubMenu a hFileMenu
	AppendMenu(hFileMenu, MF_SEPARATOR, NULL, NULL);                     //separatore
	AppendMenu(hFileMenu, MF_STRING, FILE_MENU_EXIT, "Exit");            //appende Exit a hFileMenu
	
	AppendMenu(hmenu, MF_POPUP, (UINT_PTR)hFileMenu, "File");            //appende hFileMenu a hmenu
	AppendMenu(hmenu, MF_STRING, NULL, "Help");                          //appende Toto a hmenu

	SetMenu(hwnd, hmenu);                                                //hmenu è aggiunto a hwnd
}

void AddControls(HWND hwnd){
	//definisce un controllo statico, di rango inferiore alla finestra iniziale, con un bordo, e allineato a sinistra
	CreateWindowW(L"Static", L"Inserisci testo: ", WS_VISIBLE | WS_CHILD | WS_BORDER | SS_LEFT, 200, 100, 100, 25, hwnd, NULL, NULL, NULL);

	//definisce un controllo dinamico di rango inferiore alla finestra iniziale, con un bordo e allineato a sinistra, che può essere scritto in più righe
	hedit = CreateWindowW(L"Edit", L"", WS_VISIBLE | WS_CHILD | WS_BORDER | ES_MULTILINE | ES_AUTOVSCROLL , 200, 130, 100, 50, hwnd, NULL, NULL, NULL);

	//definisce un bottone, nella finestra iniziale, con la funzione CHANGE_TITLE
	CreateWindowW(L"Button", L"Change Title", WS_VISIBLE | WS_CHILD, 200, 185, 100, 25, hwnd, (HMENU)CHANGE_TITLE, NULL, NULL);

	//controllo statico, ma con uno stile in più SS_BITMAP, pronto per ricevere un immagine
	hLogo = CreateWindowW(L"Static", NULL, WS_VISIBLE | WS_CHILD | SS_BITMAP, 350, 60, 100, 100, hwnd, NULL, NULL, NULL);

	//manda un messaggi a hLogo, per settare l'immagine, wp contiene il tipo, lp contiene l'handler
	SendMessageW(hLogo, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hLogoImage);
}

void LoadImages(){
	// LoadImage ritorna un handler, che noi forziamo essere un HBITMAP
	// il primo argomento è hInstance, che nel caso stiamo prendende immagini da file, sarà NULL
	// il secondo argomento è il percorso, o il nome nel caso il file i trovi nella directory
	// tipo di immagine, scala delle coordinate (0 è default)
	// come si carica l'immagine
	hLogoImage = (HBITMAP)LoadImageW(NULL, L"C:/Users/Vitiello/Desktop/PEPPE/PROGRAMMAZIONE/C++/WINAPI/logo.bmp", IMAGE_BITMAP, 100, 100, LR_LOADFROMFILE);
	
}
You should check that hLogoImage isn't NULL after the LoadImageW call. That's probably not the problem, but you should check.



See this:

https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-loadimagew

You should really use GetLastError() to get more information.
in reply to coder77

i looked into the link you sent, but i really don't see where's the error with my code. I mean, i specified all the parameters, and it should work.

I think the problem is in the path to the file
I think the problem is in the path to the file
What makes you think so? You schould be able to copy/paste the path into the explorer and it should show the image. Does it?

But I think nonetheless that it is not wrong to evaluate the error.
Topic archived. No new replies allowed.