Visual Studio 2010, resources können nicht geladen werden



  • Hallo,

    Ich habe ein kleines Programm geschrieben was fürs erste lediglich ein Bild zeichnen soll. Das funktioniert auch solange ich Den Pfad des Bildes eintrage.
    Aber Ich möchte, dass das Bild als resource in die exe eingebunden wird, das funktioniert leider überhaupt nicht.

    Der Compiler bricht ab mit dem Fehler:

    1>j:\eigene progs\mentalo\mentalo\mentalo\mentalo.cpp(30): error C2664: 'SelectObject': Konvertierung des Parameters 2 von 'int' in 'HGDIOBJ' nicht möglich
    1>          Die Konvertierung eines ganzzahligen Typs in einen Zeigertyp erfordert ein reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
    1>j:\eigene progs\mentalo\mentalo\mentalo\mentalo.cpp(32): error C2065: 'IDB_BITMAP': nichtdeklarierter Bezeichner
    

    mentalo.cpp:

    #include <windows.h>
    #include "resource.h"
    
    LPCWSTR g_szClassName = L"Mentalo";
    HBITMAP g_mentalo_aus = NULL;
    HBITMAP g_mentalo_an  = NULL;
    
    LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
        switch(msg)
        {
    		case WM_CREATE:
    		{
    			//g_mentalo_aus = (HBITMAP)LoadImage(NULL, "j:\\res\\mentalo_aus.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
    		}
            break;
    		case WM_PAINT:
    		{
    
            PAINTSTRUCT     ps;
            HDC                     hdc;
            BITMAP                  bitmap;
            HDC                     hdcMem;
            HGDIOBJ                 oldBitmap;
    
            hdc = BeginPaint(hwnd, &ps);
    
            hdcMem = CreateCompatibleDC(hdc);
            oldBitmap = SelectObject(hdcMem, IDB_BITMAP1);
    
            GetObject(IDB_BITMAP, sizeof(bitmap), &bitmap);
            BitBlt(hdc, 0, 0, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, SRCCOPY);
    
            SelectObject(hdcMem, oldBitmap);
            DeleteDC(hdcMem);
    
            EndPaint(hwnd, &ps);
    
            }
            break;
    		case WM_CLOSE:
                DestroyWindow(hwnd);
            break;
            case WM_DESTROY:
    			DeleteObject(g_mentalo_aus);
                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;
    
        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, L"Window Registration Failed!", L"Error!",
                MB_ICONEXCLAMATION | MB_OK);
            return 0;
        }
    
        hwnd = CreateWindowEx(
            WS_EX_STATICEDGE,
            g_szClassName,
            L"Mentalo",
            (WS_OVERLAPPEDWINDOW | WS_SYSMENU) - WS_SIZEBOX,
            CW_USEDEFAULT, CW_USEDEFAULT, 300, 450,
            NULL, NULL, hInstance, NULL);
    
        if(hwnd == NULL)
        {
            MessageBox(NULL, L"Window Creation Failed!", L"Error!",
                MB_ICONEXCLAMATION | MB_OK);
            return 0;
        }
    
        ShowWindow(hwnd, nCmdShow);
        UpdateWindow(hwnd);
    
        while(GetMessage(&Msg, NULL, 0, 0) > 0)
        {
            TranslateMessage(&Msg);
            DispatchMessage(&Msg);
        }
        return Msg.wParam;
    }
    

    resource.h (automatisch von VS2010 erzeugt)

    //{{NO_DEPENDENCIES}}
    // Microsoft Visual C++ generated include file.
    // Used by mentalo.rc
    //
    #define IDB_BITMAP1                     101
    #define IDB_BITMAP2                     102
    
    // Next default values for new objects
    // 
    #ifdef APSTUDIO_INVOKED
    #ifndef APSTUDIO_READONLY_SYMBOLS
    #define _APS_NEXT_RESOURCE_VALUE        103
    #define _APS_NEXT_COMMAND_VALUE         40001
    #define _APS_NEXT_CONTROL_VALUE         1001
    #define _APS_NEXT_SYMED_VALUE           101
    #endif
    #endif
    

    mentalo.rc (auch von VS2010 erzeugt)

    // Microsoft Visual C++ generated resource script.
    //
    #include "resource.h"
    
    #define APSTUDIO_READONLY_SYMBOLS
    /////////////////////////////////////////////////////////////////////////////
    //
    // Generated from the TEXTINCLUDE 2 resource.
    //
    #include "afxres.h"
    
    /////////////////////////////////////////////////////////////////////////////
    #undef APSTUDIO_READONLY_SYMBOLS
    
    /////////////////////////////////////////////////////////////////////////////
    // Deutsch (Deutschland) resources
    
    #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU)
    LANGUAGE LANG_GERMAN, SUBLANG_GERMAN
    
    #ifdef APSTUDIO_INVOKED
    /////////////////////////////////////////////////////////////////////////////
    //
    // TEXTINCLUDE
    //
    
    1 TEXTINCLUDE 
    BEGIN
        "resource.h\0"
    END
    
    2 TEXTINCLUDE 
    BEGIN
        "#include ""afxres.h""\r\n"
        "\0"
    END
    
    3 TEXTINCLUDE 
    BEGIN
        "\r\n"
        "\0"
    END
    
    #endif    // APSTUDIO_INVOKED
    
    /////////////////////////////////////////////////////////////////////////////
    //
    // Bitmap
    //
    
    IDB_BITMAP1             BITMAP                  "J:\\res\\mentalo_aus.bmp"
    IDB_BITMAP2             BITMAP                  "J:\\res\\mentalo_an.bmp"
    #endif    // Deutsch (Deutschland) resources
    /////////////////////////////////////////////////////////////////////////////
    
    #ifndef APSTUDIO_INVOKED
    /////////////////////////////////////////////////////////////////////////////
    //
    // Generated from the TEXTINCLUDE 3 resource.
    //
    
    /////////////////////////////////////////////////////////////////////////////
    #endif    // not APSTUDIO_INVOKED
    


  • Ich habs nur kurz überflogen, spricht etwas gegen

    case WM_CREATE:
      g_mentalo_aus = LoadBitmap((reinterpret_cast<LPCREATESTRUCT>(lParam))->hInstance, MAKEINTRESOURCE(IDB_BITMAP1));
      // ..
    

    ?



  • Edit:

    Anschließend kannst du natürlich g_mentalo_aus verwenden, die numerische Konstante IDB_BITMAPX macht nur beim Laden Sinn.

    Also anschließend

    oldBitmap = SelectObject(hdcMem, g_mentalo_aus);
    

    u.s.w..



  • Ich habe das Programm etwas umstrukturiert und erweitert. Es funktioniert jetzt, allerdings stören mich 2 Dinge für die ich noch keine Lösung gefunden habe:
    - Auf Rechnern wo kein Visual Studio installiert ist kommt die Fehlermeldung: "msvcr100.dll nicht gefunden". Ich würde gerne die Datei auch da "rein" linken.
    - Das abspielen der Sounds funktioniert, allerdings "friert" das Programm während der Wiedergabe ein und kann erst wieder bedient werden wenn aus der funktion sound() zurückgesprungen wird.

    mentalo.cpp :

    #include <windows.h>
    #include <time.h>
    #include "resource.h"
    #pragma comment(lib,"winmm.lib")
    
    void sound();
    void zeichnen(HWND* hwnd, HBITMAP bild);
    bool an=false;
    LPCWSTR g_szClassName = L"Mentalo";
    //bitmaps:
    
    HBITMAP g_mentalo_aus = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BITMAP1));
    HBITMAP g_mentalo_an  = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BITMAP2));
    
    LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
    	srand ((unsigned int)time(NULL)); 
    	HWND* handle=&hwnd;
        switch(msg)
        {
    
    	    case WM_RBUTTONDOWN:
    		{
    			if (!an)
    			{
    				an=true;
    			}else
    			{
    				an=false;
    			}
    			InvalidateRect(hwnd,NULL,TRUE);
    		}
    		break;
    		case WM_LBUTTONDOWN:
    		{
    			an=true;
    			InvalidateRect(hwnd,NULL,TRUE);
    			sound();
    			an=false;
    
    		}
    	        break;
                    //case WM_CREATE:
    		//{}
                    //break;
    		case WM_PAINT:
    		{
    			if(an)
    			{				
    				zeichnen(handle, g_mentalo_an);
    			}
    			else
    			{				
    				zeichnen(handle, g_mentalo_aus);
    			}
    
            }
    		break;
    		case WM_CLOSE:
                DestroyWindow(hwnd);
            break;
            case WM_DESTROY:
    			DeleteObject(g_mentalo_aus);
    			DeleteObject(g_mentalo_an);
                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;
    
        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, L"Window Registration Failed!", L"Error!",
                MB_ICONEXCLAMATION | MB_OK);
            return 0;
        }
    
        hwnd = CreateWindowEx(
            WS_EX_STATICEDGE,
            g_szClassName,
            L"Mentalo",
            (WS_OVERLAPPEDWINDOW | WS_SYSMENU) - WS_SIZEBOX -WS_MAXIMIZEBOX,
            CW_USEDEFAULT, CW_USEDEFAULT, 306, 428,
            NULL, NULL, hInstance, NULL);
    
        if(hwnd == NULL)
        {
            MessageBox(NULL, L"Window Creation Failed!", L"Error!",
                MB_ICONEXCLAMATION | MB_OK);
            return 0;
        }
    
        ShowWindow(hwnd, nCmdShow);
        UpdateWindow(hwnd);
    
        while(GetMessage(&Msg, NULL, 0, 0) > 0)
        {
            TranslateMessage(&Msg);
            DispatchMessage(&Msg);
        }
        return Msg.wParam;
    }
    
    void sound()
    {
    	int a=0, b=0, c=0;
    	a=rand()%3;
    
    	if (a==0)
    	{
    		PlaySound(MAKEINTRESOURCE(IDR_WAVE1), GetModuleHandle(NULL), SND_RESOURCE);
    	}else if (a==1)
    	{
    		PlaySound(MAKEINTRESOURCE(IDR_WAVE2), GetModuleHandle(NULL), SND_RESOURCE);
    	}else if (a==2)
    	{
    		PlaySound(MAKEINTRESOURCE(IDR_WAVE3), GetModuleHandle(NULL), SND_RESOURCE);
    	}
    
    	b=rand()%4;
    
    	if (b==0)
    	{
    		PlaySound(MAKEINTRESOURCE(IDR_WAVE6), GetModuleHandle(NULL), SND_RESOURCE);
    	}
    	else if (b==1)
    	{
    		PlaySound(MAKEINTRESOURCE(IDR_WAVE4), GetModuleHandle(NULL), SND_RESOURCE);
    	}
    	else if (b==2)
    	{
    		PlaySound(MAKEINTRESOURCE(IDR_WAVE5), GetModuleHandle(NULL), SND_RESOURCE);
    	}
    	else if (b==3)
    	{
    		PlaySound(MAKEINTRESOURCE(IDR_WAVE6), GetModuleHandle(NULL), SND_RESOURCE);
    	}
    
    	return;
    }
    
    void zeichnen(HWND* hwnd, HBITMAP bild)
    {
            PAINTSTRUCT     ps;
            HDC                     hdc;
            BITMAP                  bitmap;
            HDC                     hdcMem;
            HGDIOBJ                 oldBitmap;
    
            hdc = BeginPaint(*hwnd, &ps);
    
            hdcMem = CreateCompatibleDC(hdc);
            oldBitmap = SelectObject(hdcMem, bild);
    
            GetObject(bild, sizeof(bitmap), &bitmap);
            BitBlt(hdc, 0, 0, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, SRCCOPY);
    
            SelectObject(hdcMem, oldBitmap);
            DeleteDC(hdcMem);
    
            EndPaint(*hwnd, &ps);
    		return;
    }
    


  • Für ein Bitmap aus einer Resource musst du unter WM_CREATE erst einmal das Bitmap mit hBitmap = LoadBitmap(hInstance,"bitmap.bmp") aus der Resource sauber laden. Erst dann kann es unter WM_PAINT angezeigt werden. Mehr dazu findet sich im schon klassischen Buch von Charles Petzold zur Windows-Programmierung. Der gezeigte Code scheint mir etwas unübersichtlich, aber ich arbeite auch nicht mit Visual Studio und dessen Code-Generatoren.



  • OK, danke für den Hinweis.

    Welche Entwicklungsumgebung bevorzugst Du denn?



  • shroomboy schrieb:

    OK, danke für den Hinweis. Welche Entwicklungsumgebung bevorzugst Du denn?

    Ich bin mit Borland CBuilder1 (BCB1) zufrieden. Stammt schon aus dem Jahr 1996 und war einmal kostenlos zu haben. Es fehlen allerdings einige heute verfügbare Dinge, die mich jedoch nicht stören.


Anmelden zum Antworten