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 Bezeichnermentalo.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 #endifmentalo.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.