PDA

View Full Version : (winApi) Controllo BITMAP


Gino+89+
15-11-2006, 17:25
Se io in un file risorsa (.rc) scrivo:

IDI_BITMAP1_LOGIN BITMAP "img1_login.bmp"

E' esetta la sintassi di come scrivo questo controllo??...no perchè mi continua a dare errore di sintassi e sono fermo da due giorni ...

Edit:
Premetto che sono arrivato a scrivere così da questo controllo:
IDC_MYICON ICON "ciao.ico"
e la posto di ICON ho messo BITMAP

Gino+89+
15-11-2006, 17:36
Corretto...avevo scritto l'istruzione dentro ad un dialogo...

Gino+89+
16-11-2006, 14:48
Altra domanda...

Ho creato un controllo static vuoto per inserirci un bitmap:

CONTROL "",IDC_STATIC1_LOGIN,"STATIC",SS_BITMAP | SS_CENTERIMAGE | WS_VISIBLE,40,50,80,98

E poi la bitmap:

IDI_BITMAP1_LOGIN BITMAP "img1_login.bmp"


Ma come faccio ad inserircela :wtf: ...volevo inviare il mess. STM_SETIMAGE con SendMessage() allo static...ho provato in diversi modi ma non ci sono riuscito...sapete aiutarmi??...ho fatto errori?

andbin
16-11-2006, 15:14
Ho creato un controllo static vuoto per inserirci un bitmap:

CONTROL "",IDC_STATIC1_LOGIN,"STATIC",SS_BITMAP | SS_CENTERIMAGE | WS_VISIBLE,40,50,80,98

E poi la bitmap:

IDI_BITMAP1_LOGIN BITMAP "img1_login.bmp"
Ma come faccio ad inserircela :wtf: ...volevo inviare il mess. STM_SETIMAGE con SendMessage() allo static...ho provato in diversi modi ma non ci sono riuscito...sapete aiutarmi??...ho fatto errori?Il messaggio STM_SETIMAGE va sicuramente bene ma devi specificare in wParam IMAGE_BITMAP e in lParam devi avere un handle di bitmap (HBITMAP) cioè una immagine già caricata.

Ma se vuoi si può fare già a livello di risorsa. Il primo parametro di CONTROL (che adesso è ""), deve contenere l'ID della risorsa bitmap. Esempio:

CONTROL 103,IDC_STATIC_1,"Static",SS_BITMAP .....

Se stai usando VC++, si può fare facilmente dall'editor delle risorse.

Gino+89+
16-11-2006, 15:54
Allora, ho fatto in questo modo ma mi piazza come immagine un quadrato completamente nero che non è la bitmap che dico io:

Ti posto il codice "completo":

Pezzo di risorsa:

IDD_LOGIN DIALOG 150, 150, 115, 190
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "LN Chat - Login"
FONT 10, "MS Sans Serif"
BEGIN
LTEXT "Nickname",IDC_TEXT1_LOGIN,18,50,40,10
EDITTEXT IDC_EDIT1_LOGIN,18,60,80,11
LTEXT "Password",IDC_TEXT2_LOGIN,18,73,40,10
EDITTEXT IDC_EDIT2_LOGIN,18,83,80,11,ES_PASSWORD
PUSHBUTTON "Enter",IDC_BUTTON1_LOGIN,31,97,20,9,BN_CLICKED
PUSHBUTTON "Exit",IDC_BUTTON2_LOGIN,63,97,20,9,BN_CLICKED
PUSHBUTTON "Register",IDC_BUTTON3_LOGIN,43,115,30,9,BN_CLICKED
CONTROL 110,IDC_STATIC1_LOGIN,"STATIC",SS_BITMAP | SS_CENTERIMAGE | WS_VISIBLE,10,50,80,100

END

IDI_BITMAP1_LOGIN BITMAP "img2_login.bmp"


Pezzo di file in cui definisco gli ID interessati:

#define IDC_STATIC1_LOGIN 109
#define IDI_BITMAP1_LOGIN 110


Pezzo di dialogo:


BOOL CALLBACK dlgProcLogin(HWND hwndDlg,UINT dlgMsg,WPARAM wParam,LPARAM lParam)
{

switch(dlgMsg)
{
case WM_INITDIALOG:
{
HWND hwndControl=GetDlgItem(hwndDlg,IDC_STATIC1_LOGIN);
SendMessage(hwndControl,STM_SETIMAGE,IMAGE_BITMAP,110);
}
break;

case WM_CLOSE:
EndDialog(hwndDlg,0);
break;

andbin
16-11-2006, 16:01
Pezzo di risorsa:

CONTROL 110,IDC_STATIC1_LOGIN,"STATIC",SS_BITMAP | SS_CENTERIMAGE | WS_VISIBLE,10,50,80,100

IDI_BITMAP1_LOGIN BITMAP "img2_login.bmp"
Mi sembra ok.

Pezzo di file in cui definisco gli ID interessati:

#define IDC_STATIC1_LOGIN 109
#define IDI_BITMAP1_LOGIN 110
Ok anche qui.

SendMessage(hwndControl,STM_SETIMAGE,IMAGE_BITMAP,110);No, questo no. Come ho detto prima con STM_SETIMAGE devi passare in lParam un handle cioè un HBITMAP caricato con una funzione tipo LoadBitmap(), per esempio.

Comunque se già lo imposti dalla risorsa, perché impostarlo programmaticamente???

Gino+89+
16-11-2006, 16:06
No, questo no. Come ho detto prima con STM_SETIMAGE devi passare in lParam un handle cioè un HBITMAP caricato con una funzione tipo LoadBitmap(), per esempio.


Purtroppo (date le mie scarse conoscenze) non ho capito che intendi...al posto di 110 che ci va?..il ritorno di una funzione quale LoadBitmap()?...poi hai detto:

Comunque se già lo imposti dalla risorsa, perché impostarlo programmaticamente???

Invece quì non ho capito del tutto :muro:

Nel mio esempio che cosa devo passargli per ultimo parametro?

andbin
16-11-2006, 16:11
Purtroppo (date le mie scarse conoscenze) non ho capito che intendi...al posto di 110 che ci va?..il ritorno di una funzione quale LoadBitmap()?...poi hai detto:

Invece quì non ho capito del tutto :muro:

Nel mio esempio che cosa devo passargli per ultimo parametro?Se tu metti quel 110 come primo parametro di CONTROL nella risorsa, quando la dialog viene caricata dal sistema, carica ed imposta in automatico la bitmap nel controllo. Tu non dovresti fare nulla, se non vuoi poi successivamente cambiarla da programma!

Gino+89+
16-11-2006, 16:20
Se tu metti quel 110 come primo parametro di CONTROL nella risorsa, quando la dialog viene caricata dal sistema, carica ed imposta in automatico la bitmap nel controllo. Tu non dovresti fare nulla, se non vuoi poi successivamente cambiarla da programma!

Ma infatti io ho messo 110 come primo parametro di CONTROL
L'unica cosa che non ho capito e come correggere il SendMessage()...

andbin
16-11-2006, 16:36
L'unica cosa che non ho capito e come correggere il SendMessage()...Non serve!!! Fa già tutto il sistema. Mettendo quel 110 nel CONTROL, è il sistema che sa quale bitmap caricare subito!! Senza che tu debba fare qualcosa nel sorgente.

Gino+89+
16-11-2006, 16:42
Non serve!!! Fa già tutto il sistema. Mettendo quel 110 nel CONTROL, è il sistema che sa quale bitmap caricare subito!! Senza che tu debba fare qualcosa nel sorgente.

E perchè allora mi visualizzza questo??:
http://www.hostingfiles.net/files/20061116054112_Immagine.jpg

Come vedi viene fuori una cosa "molto oscena", e non mi carica la bitmap "img2_login.bmp" che dico io

andbin
16-11-2006, 16:52
E perchè allora mi visualizzza questo??:Quella SendMessage in cui invii STM_SETIMAGE con 110 devi toglierla!!!

Continui ad inviare un 110 che non è un handle. Quindi chissà cosa fa il controllo .... probabilmente vede che non è un handle e si "resetta" o qualcosa del genere!

Gino+89+
16-11-2006, 16:59
Questo è il risultato se la tolgo:

http://www.hostingfiles.net/files/20061116055750_Immagine.jpg

Come se non ci fosse nulla, basta mi arrendo :sob:

andbin
16-11-2006, 17:05
Come se non ci fosse nulla, basta mi arrendo :sob:Da quello che vedo, usi Dev-C++. Quello che non so è se il Resource Compiler del Dev-C++ accetta la specifica della bitmap in quel modo (VC++ non ha problemi).

Verifica se hai degli errori o warning nella compilazione delle risorse.
Inoltre, il file di include che contiene le define degli ID è correttamente incluso dal file .rc??

Gino+89+
16-11-2006, 17:12
Da quello che vedo, usi Dev-C++. Quello che non so è se il Resource Compiler del Dev-C++ accetta la specifica della bitmap in quel modo (VC++ non ha problemi).

Verifica se hai degli errori o warning nella compilazione delle risorse.
Inoltre, il file di include che contiene le define degli ID è correttamente incluso dal file .rc??

Si per questo tutto corretto (ne errori ne warning), ma mi è venuto un dilemma...se io dovessi avere più bitmap nel file risorsa lui come fa a scegliere quale mettere?

Difatti se osservi il codice dei post iniziali, ho messo il 110 sia come primo parametro del CONTROL che come ID della bitmap (IDI_BITMAP1_LOGIN)...appunto perchè non riesco a capire come possa scegliere...

Gino+89+
17-11-2006, 18:20
Risolto caricando la bitmap:


case WM_INITDIALOG:
{
HWND hwndControl=GetDlgItem(hwndDlg,IDC_STATIC1_LOGIN);
HBITMAP hwndBitMap=LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDI_BITMAP1_LOGIN));


SendMessage(hwndControl,STM_SETIMAGE,IMAGE_BITMAP,hwndBitMap);

andbin
17-11-2006, 19:53
Risolto caricando la bitmap:Ok, però alla fine dovresti fare una free della bitmap usando DeleteObject()!!

Gino+89+
17-11-2006, 20:08
Ok, però alla fine dovresti fare una free della bitmap usando DeleteObject()!!

Quale sono gli effetti se non uso quest'ultima funzione? (e quindi cosa serve usarla?)...no perchè anche senza nelle finestre successive del programma non sembra fare nulla di anomalo...