Non visualizzo le bitmap OBM

di il
2 risposte

Non visualizzo le bitmap OBM

Salve, ho realizzato un programma in C che utilizza le funzioni API e che dovrebbe mostrare un dialogo dove digitando su 4 possibili pushbotton con stile bitmap OBM_UPARROW, OBM_DNARROW, OBM_RGARROW, OBM_LFARROW, viene spostata una icona IDI_HAND verso l' alto, il basso, destra, sinistra. L' icona viene spostata, ma nel dialogo non mi compaiono le bitmap OBM. Sto utilizzando il compilatore Dev-C++, ma non so se questo compilatore contiene queste bitmap, forse è questo l' errore?

Il file.cpp del programma è il seguente:
#define STRICT
#define WIN32_LEAN_AND_MEAN
#define OEMRESOURSE
#include <windows.h>
#include "risorse1.h"

BOOL CALLBACK spostamento_static_desiderato(HWND hwnd_static, int dx, int dy)
{
  WINDOWPLACEMENT wp;    
  ZeroMemory(&wp, sizeof(wp));
  wp.length= sizeof(wp);
  GetWindowPlacement(hwnd_static, &wp);
  wp.rcNormalPosition.left= wp.rcNormalPosition.left +dx;
  wp.rcNormalPosition.right= wp.rcNormalPosition.right +dx;  
  wp.rcNormalPosition.top= wp.rcNormalPosition.top +dy;
  wp.rcNormalPosition.bottom= wp.rcNormalPosition.bottom +dy;
  return SetWindowPlacement(hwnd_static, &wp);
 }


BOOL CALLBACK sposta_static(HWND hwnddlg, UINT umsg, WPARAM wparam, LPARAM lparam)
{
  HWND hwnd_static= GetDlgItem(hwnddlg, IDC_STATIC);
  HICON hwnd_icona= LoadIcon(0, IDI_HAND);
  // IDI_HAND indica l'identificatore della icona di errore, viene utilizzata questo tipo di icona  perchè è ben visibile
  // La funzione LoadIcon fornisce l'handle dell' icona desiderata, dato l'identificatore di tale icona 
  SendMessage(hwnd_static, STM_SETICON, (WPARAM)hwnd_icona, 0);
  
  HWND hwnd_button1= GetDlgItem(hwnddlg, IDC_BUTTON1);
  HANDLE hwnd_bitmap1= LoadBitmap(0, "OBM_LFARROW");
  // OBM_LFARROW indica l'identificatore del bitmap freccia a sinistra
  // La funzione LoadBitmap fornisce l'handle del bitmap desiderato, dato l'identificatore di tale bitmap 
  SendMessage(hwnd_button1, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hwnd_bitmap1);
  
  HWND hwnd_button2= GetDlgItem(hwnddlg, IDC_BUTTON2);
  HBITMAP hwnd_bitmap2= LoadBitmap(0, "OBM_RGARROW");
  // OBM_RGARROW indica l'identificatore del bitmap freccia a destra
  SendMessage(hwnd_button2, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hwnd_bitmap2);
  
  HWND hwnd_button3= GetDlgItem(hwnddlg, IDC_BUTTON3);
  HBITMAP hwnd_bitmap3= LoadBitmap(0, "OBM_UPARROW");
  // OBM_UPARROW indica l'identificatore del bitmap freccia in alto
  SendMessage(hwnd_button3, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hwnd_bitmap3);
  
  HWND hwnd_button4= GetDlgItem(hwnddlg, IDC_BUTTON4);
  HBITMAP hwnd_bitmap4= LoadBitmap(0, "OBM_DNARROW");
  // OBM_DNARROW indica l'identificatore del bitmap freccia in basso
  SendMessage(hwnd_button4, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hwnd_bitmap4);
  
  if(umsg==WM_CLOSE)
   {
     EndDialog(hwnddlg,0);                     
     return TRUE;
    }  
     if(umsg==WM_COMMAND)
      {
        int spostamento=5;
        int id_button=LOWORD(wparam);    
        HWND hwnd_static= GetDlgItem(hwnddlg, IDC_STATIC);          
        if(id_button==IDC_BUTTON1)
         return spostamento_static_desiderato(hwnd_static, -spostamento, 0);
        if(id_button==IDC_BUTTON2)
         return spostamento_static_desiderato(hwnd_static, +spostamento, 0);
        if(id_button==IDC_BUTTON3)
         return spostamento_static_desiderato(hwnd_static, 0, -spostamento);
        if(id_button==IDC_BUTTON4)
         return spostamento_static_desiderato(hwnd_static, 0, +spostamento); 
        }
      return FALSE; 
    }
  

int WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow)
{
  DialogBoxParam(0,"IDD_DIALOG8",0,sposta_static,0);  
  return 0;
}
L' header file risorse1.h del programma è il seguente:
#define IDC_STATIC 101
#define IDC_BUTTON1 102
#define IDC_BUTTON2 103 
#define IDC_BUTTON3 104
#define IDC_BUTTON4 105 
Il resourse file IDD_DIALOG8.rc è il seguente:
#define OEMRESOURSE
#include <windows.h>
#include "risorse1.h"

IDD_DIALOG8 DIALOG DISCARDABLE 0,0,200,134
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Dialogo (finestra) per spostare una icona con bitmap"
FONT 8, "MS Sans Serif"
BEGIN
CONTROL "", IDC_STATIC, "STATIC", SS_ICON, 40,58,60,15
CONTROL "", IDC_BUTTON1, "BUTTON", BS_PUSHBUTTON | BS_BITMAP | BS_NOTIFY, 100,30,40,15
CONTROL "", IDC_BUTTON2, "BUTTON", BS_PUSHBUTTON | BS_BITMAP | BS_NOTIFY, 150,30,40,15
CONTROL "", IDC_BUTTON3, "BUTTON", BS_PUSHBUTTON | BS_BITMAP | BS_NOTIFY, 125,10,40,15
CONTROL "", IDC_BUTTON4, "BUTTON", BS_PUSHBUTTON | BS_BITMAP | BS_NOTIFY, 125,50,40,15
END
Ringrazio per l' aiuto.
Matteo

2 Risposte

  • Re: Non visualizzo le bitmap OBM

    
    HANDLE hwnd_bitmap1= LoadBitmap(0, "OBM_LFARROW");
    
    controlla lo stato di hwnd_bitmap1 dopo la chiamata della funzione. E poi secondo me devi togliere gli apici. Sono risorse definite nel sistema e non sono delle stringhe. al massimo puoi utilizzare la macro MAKEINTRESOURCE che ti converte la risorsa in stringa utilizzabile per il LoadBitmap.
    
    HANDLE hwnd_bitmap1= LoadBitmap(0, MAKEINTRESOURCE(OBM_LFARROW));
    
  • Re: Non visualizzo le bitmap OBM

    Pensavo che utilizzare gli apici o MAKEINTRESOURCE fosse la stessa cosa anche per i bitmap OBM ed invece mi sbagliavo, infatti inserito MAKEINTRESOURCE al posto degli apici adesso mi compaiono i bitmap freccia sul dialogo. Anche se però adesso mi si pianta il programma cliccando su queste frecce e devo capire perchè si verifica ciò.
    Grazie skynet per l' aiuto.
Devi accedere o registrarti per scrivere nel forum
2 risposte