Dev-C++ | Bitmap als Background im Fenster
-
Hi Leute,
wie ihr schon im Titel des Threads lesen könnt hab ich ein Problem.
Und zwar, möchte ich eine einfache Bitmap in miene Fenster darstellen. Dazu hab ich alles initialisiert und soweiter. Normalerweise würde man ja noch in der WM_CREATE-Anweisung den Button erstellen und mit SendMessage die Bitmap-Datei auf den Button platzieren. Entscheidend ist ja, das BS_BITMAP in der Stil angebe. Ich hab mir jetzt gedacht das ich einfach alles initialisiere und dann per SendMessage in der WM_CREATE das Bitmap einfach an die hWnd senden, damit das Programm weiss, das ich das eigentliche Fenster selber meine. Dies klappt aber nicht so richtig, deswegen hab ich versucht das Fenster nochmal abzufragen und bei der Abfrage das BS_BITMAP mit einzubinden und die SendMessage vorher zu definieren. Aber dies klappt auch nicht.
Kann mir einer einen Tipp geben wie ich das besser honbekomme ?
Hoffe meine Frage ist nicht zu kompliziert gestellt. Hier noch ein Teil des
Codes (ist noch etwas unsauber und unübersichtlich, kommt aber noch) :hwnd = CreateWindowEx ( 0, /* Extended possibilites for variation */ szClassName, /* Classname */ "www.gta-cu.de by pivke", /* Title Text */ WS_EX_WINDOWEDGE | WS_EX_APPWINDOW | WS_VISIBLE | BS_BITMAP , /* default window */ CW_USEDEFAULT, /* Windows decides the position */ CW_USEDEFAULT, /* where the window ends up on the screen */ 700, /* The programs width */ 500, /* and height in pixels */ HWND_DESKTOP, /* The window is a child-window to desktop */ NULL, /* No menu */ hThisInstance, /* Program Instance handler */ NULL /* No Window Creation data */ ); /* Make the window visible on the screen */ ShowWindow (hwnd, nFunsterStil); /* Run the message loop. It will run until GetMessage() returns 0 */ while (GetMessage (&messages, NULL, 0, 0)) { /* Translate virtual-key messages into character messages */ TranslateMessage(&messages); /* Send message to WindowProcedure */ DispatchMessage(&messages); } /* The program return-value is 0 - The value that PostQuitMessage() gave */ return messages.wParam; } /* This function is called by the Windows function DispatchMessage() */ LRESULT CALLBACK WindowProcedure (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { static HWND Button1; static HWND Button2; static HWND Button3; static HWND Button4; static HWND Button5; static HWND hButton; bool buffer=FALSE; HDC hdc, hdcMem; static HANDLE hBitMap; static BITMAP bitmap ; PAINTSTRUCT ps ; switch (message) { case WM_CREATE: { //Bild laden// hBitMap=(HBITMAP)LoadImage(0,"gta-background.bmp",IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE); GetObject (hBitMap, sizeof (BITMAP), &bitmap) ; //Fertig// SendMessage (hWnd, BM_SETIMAGE, (WPARAM) IMAGE_BITMAP,(LPARAM)(HANDLE) hBitMap); char *buffer; buffer="*Konnte Edit-Control nicht initialisieren..."; buffer=FALSE; Button1 = CreateWindow( "button", "Beenden", WS_CHILD | WS_VISIBLE, 0, 0, 150, 25, hWnd, NULL, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); Button2 = CreateWindowEx(WS_EX_CLIENTEDGE, "edit", buffer, // <- das ist der Inhalt der Editfelds WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL, 380, 30, 300, 300, hWnd, NULL, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); Button3=CreateWindow("button", "Handling.cfg öffnen", WS_CHILD | WS_VISIBLE, 0,60,150,25, hWnd, NULL, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); Button4=CreateWindow("button", "GTA San Andreas starten", WS_CHILD | WS_VISIBLE, 505,420,170,25, hWnd, NULL, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); if(!(Button2=CreateWindowEx(WS_EX_CLIENTEDGE,"edit",buffer, WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL,380, 30, 300, 300, hWnd, NULL,((LPCREATESTRUCT) lParam) -> hInstance, NULL))) { MessageBox(NULL,"Es ist ein Fehler aufgetreten, bitte schauen sie in der Konsole nach...","Error",MB_OK); buffer="*Konnte Edit-Control nicht initialisieren..."; } else { buffer="*Edit-Control erfolgreich initialisiert..."; } return 0; }Danke im Voraus !
-
BitBlt (), StretchBlt () und vor allem WM_PAINT
-
pivke schrieb:
Entscheidend ist ja, das BS_BITMAP in der Stil angebe.
Leider nicht. BS_BITMAP bewirkt nur etwas bei einem BUTTON, aber nichts z.B. bei einem Hauptfenster.
Sollte allerdings BS_BITMAP etwas bei einem STATIC, LISTBOX, EDIT oder COMBOBOX bewirken, dann ist es nur ein "Zufall" :
// aus der winuser.h #define BS_BITMAP 0x00000080L #define SS_NOPREFIX 0x00000080L // Don't do "&" character translation #define ES_AUTOHSCROLL 0x0080L #define LBS_USETABSTOPS 0x0080L #define CBS_OEMCONVERT 0x0080L
-
BitBlt (), StretchBlt () und vor allem WM_PAINT
Hab ich doch gemacht, dachte der Code währe uninteressant :
case WM_CREATE: { //Bild laden// hBitMap=(HBITMAP)LoadImage(0,"gta-background.bmp",IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE|LR_CREATEDIBSECTION); GetObject (hBitMap, sizeof (BITMAP), &bitmap) ; //Fertig// SendMessage (hWnd, BM_SETIMAGE, (WPARAM) IMAGE_BITMAP,(LPARAM)(HANDLE) hBitMap); char *buffer; buffer="*Konnte Edit-Control nicht initialisieren..."; buffer=FALSE; Button1 = CreateWindow( "button", "Beenden", WS_CHILD | WS_VISIBLE, 0, 0, 150, 25, hWnd, NULL, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); Button2 = CreateWindowEx(WS_EX_CLIENTEDGE, "edit", buffer, // <- das ist der Inhalt der Editfelds WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL, 380, 30, 300, 300, hWnd, NULL, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); Button3=CreateWindow("button", "Handling.cfg öffnen", WS_CHILD | WS_VISIBLE, 0,60,150,25, hWnd, NULL, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); Button4=CreateWindow("button", "GTA San Andreas starten", WS_CHILD | WS_VISIBLE, 505,420,170,25, hWnd, NULL, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); if(!(Button2=CreateWindowEx(WS_EX_CLIENTEDGE,"edit",buffer, WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL,380, 30, 300, 300, hWnd, NULL,((LPCREATESTRUCT) lParam) -> hInstance, NULL))) { MessageBox(NULL,"Es ist ein Fehler aufgetreten, bitte schauen sie in der Konsole nach...","Error",MB_OK); buffer="*Konnte Edit-Control nicht initialisieren..."; } else { buffer="*Edit-Control erfolgreich initialisiert..."; } return 0; } case WM_COMMAND: { if (lParam == (LPARAM)Button1) { if (HIWORD(wParam) == BN_CLICKED) SendMessage(hWnd, WM_CLOSE, 0, 0); } if(lParam==(LPARAM)Button4) { if(MessageBox(NULL,"Möchten sie jetzt GTA San Andreas starten ?","GTA San Andreas Start ?",MB_YESNO | MB_ICONQUESTION)==IDYES) { MessageBox(NULL,"GTA San Andreas wird jetzt gestartet","GTA San Andreas Start...",MB_OK); system("gta_sa.exe"); } else { MessageBox(NULL,"GTA San Andreas wird nicht gestartet...","GTA San Andreas Abbruch...",MB_OK); } if(system("gta_sa.exe") != 0) { MessageBox(NULL,"Stellen sie sicher, das sich dieses Programm im GTA Verzeichnis befindet","Error",MB_OK); } } return 0; } case WM_PAINT: { PAINTSTRUCT ps; HDC hDC; hdcMem = CreateCompatibleDC (hdc); SelectObject(hdcMem,hBitMap); BitBlt (hdc, 0, 0, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, SRCCOPY) ; const char Konsole[]="Konsolen- und Ausgabefenster:"; hDC=BeginPaint(hWnd,&ps); DeleteDC(hdcMem); { TextOut(hDC, 380, 10, Konsole, sizeof(Konsole) - 1); } EndPaint(hWnd, &ps); return 0; }
-
Hallo , ich habe gesehn das du mit DEV C++ arbeites , und ich das gleiche problem mal hatte - ich habe dann mal irgentwo folgendes gefunden!!!
OHNE RECSOURCE !!!

#include <windows.h> char* pcBmp = "xyz.bmp"; HINSTANCE hInst; LRESULT CALLBACK WindProcedure(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASSEX WndCls; static char szAppName[] = "Proggingmanias Simple Bitmap Window"; MSG Msg; hInst = hInstance; WndCls.cbSize = sizeof(WndCls); WndCls.style = CS_OWNDC | CS_VREDRAW | CS_HREDRAW; WndCls.lpfnWndProc = WindProcedure; WndCls.cbClsExtra = 0; WndCls.cbWndExtra = 0; WndCls.hInstance = hInst; WndCls.hIcon = LoadIcon(NULL, IDI_APPLICATION); WndCls.hCursor = LoadCursor(NULL, IDC_ARROW); WndCls.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); WndCls.lpszMenuName = NULL; WndCls.lpszClassName = szAppName; WndCls.hIconSm = LoadIcon(hInstance, IDI_APPLICATION); RegisterClassEx(&WndCls); CreateWindowEx(WS_EX_OVERLAPPEDWINDOW, szAppName, "Proggingmanias Simple Bitmap Window", WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); while( GetMessage(&Msg, NULL, 0, 0) ) { TranslateMessage(&Msg); DispatchMessage( &Msg); } return (Msg.wParam); } LRESULT CALLBACK WindProcedure(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { HDC hDC, MemDC; PAINTSTRUCT Ps; HBITMAP hbmp; char buf[256]; RECT r; GetWindowRect( hWnd, &r ); switch(Msg) { case WM_DESTROY: PostQuitMessage(WM_QUIT); break; case WM_PAINT: hDC = BeginPaint(hWnd, &Ps); hbmp = (HBITMAP)LoadImage(NULL, pcBmp, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE); if ( !hbmp ) { MessageBox( hWnd, buf, "Picture not found", MB_OK ); ExitProcess(1); } // Create a memory device compatible with the above DC variable MemDC = CreateCompatibleDC(hDC); // Select the new bitmap SelectObject(MemDC, hbmp); // Copy the bits from the memory DC into the current dc BitBlt(hDC, 0, 0, r.right, r.bottom, MemDC, 0, 0, SRCCOPY); // Restore the old bitmap DeleteDC(MemDC); DeleteObject(hbmp); EndPaint(hWnd, &Ps); break; default: return DefWindowProc(hWnd, Msg, wParam, lParam); } return 0; }einfach complieren und fun haben

-
Hab ich doch gemacht, dachte der Code währe uninteressant :
hmm tut mir leid ich hatte meine glaskugel gerade nicht neben mir als ich das gepostet habe

also, entweder du machst das so, wie es pofix gepostet hat oder wenn du deine variante im ansatz behalten möchtest, dann sollte das ungefähr so gehen. Jedenfalls ähneln sich beide Varianten sehr stark. Der einzige Unterschied besteht eben in welcher Message welcher Code ausgeführt wird.
LRESULT CALLBACK WndProc (HWND hMain, UINT message, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; HDC hDC; static HDC dcSkin; static HANDLE hSkinBmp; switch (message) { case WM_CREATE: hSkinBmp = (HBITMAP) LoadImage (0, "gta-background.bmp", IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE | LR_CREATEDIBSECTION); dcSkin = CreateCompatibleDC (0); SelectObject (dcSkin, hSkinBmp); return 0; case WM_PAINT: hDC = BeginPaint (hMain, &ps); SetBkMode (hDC, TRANSPARENT); SetTextColor (hDC, RGB (0, 0, 0)); BitBlt (hDC, 0, 0, 500, 400, dcSkin, 0, 0, SRCCOPY); EndPaint (hMain, &ps); return 0; case WM_DESTROY: DeleteObject (hSkinBmp); PostQuitMessage (0); return 0; } return DefWindowProc (hMain, message, wParam, lParam); }vllt fällt dir dann auch dein Fehler auf

PS: dein code ist IMO schlecht zu lesen, wegen den Einrückungen etc. Vllt. liegts aber auch mehr oder weniger an den Code-Tags.