Einfaches Bild darstellen



  • Hi@aLL.

    ich möchte ein einfaches bild in der Mitte des Bildschirms darstellen.
    Allerdings soll das Bild ohne Fenster und wenn möglich mit transparentem Hintergrund erscheinen.

    Danke.



  • juhhu, darf ich noch mal ran...
    du erstellst ein fenster mit dem style WS_POPUP, machst einen auf SetLayeredWindowAttributes (..) (siehe msdn) und blittest wunderschön dein bild (das du vorher mit LoadImage () geladen hast) auf das Fenster...

    Mfg Ominion



  • jo.
    aber gibte da nich ne einfachere variante in c++?
    also ich mein, ich hab jetzt ne winmain.

    ...
    Winmain...
    {
    ...
    }
    ...

    könntest du mir n beispiel geben.
    und wie kann ich das bild ein - aus blenden.

    thx.



  • Script-Styler schrieb:

    aber gibte da nich ne einfachere variante in c++?
    also ich mein, ich hab jetzt ne winmain.

    Tzzzzzz...immer das Gleiche: 'einfacher'... da bist Du in der WinAPI bzw. in C/C++ irgendwie falsch 👎 .

    Such mal in der MSDN (nach den Funktionen die Dir Ominion genannt hat) bzw. via google. Da gibts sicherlich etwas ;).



  • Script-Styler schrieb:

    aber gibte da nich ne einfachere variante in c++?

    Wieviel einfacher solls denn noch werden?

    void ShowTransparentWindowAndBlitSkullGraphicsCenteredOnScreenFeaturingANiceFadeEffect()
    

    So vielleicht?



  • Oder so ?

    void MachAllesAlleine(int KeinWert);
    

    😃 😃

    Sry musste sein 😃

    Gruß Chris



  • Das war aber pöhse!!!!



  • naja ich ben eben etwas faul...
    aber das wär doch nützlich. die WinAPI hat doch sonst so viele Funktionen...
    wenn es was einfacheres gibt - warum das umstendlichere nehmen?

    thx.



  • Wie alt bist du?

    Achso: Probiers mal mit dem Programm hier:

    #include <windows.h>
    #include <winstyles.h>
    
    int win_style = IMG_ONLY; //Nur Bild
    #define background_name test.bmp //Test.bmp als HG laden
    
    //...
    //(In WINMAIN)
    
    openwindow(winstyle, load(background_name));
    


  • naja leudde.
    ich habe jetzt ein supi transparentes window erstellt.
    aber wie krich ich den ramen weg und die titelbar?
    thx.

    // At first define for including the windows headers
    #define _WIN32_WINNT 0x0500
    #include <windows.h>
    
    // The Window Procedure
    LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
    	switch (msg)
    	{
    	case WM_CREATE:
    		// Set WS_EX_LAYERED on this window 
    		SetWindowLong(hwnd, GWL_EXSTYLE,
    			GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED);
    		// Make this window 70% alpha
    		SetLayeredWindowAttributes(hwnd, 0, 255*0.5, LWA_ALPHA);
    		break;
    	case WM_CLOSE:
    		DestroyWindow(hwnd);
    		break;
    	case WM_DESTROY:
    		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;
    	static char appName[] = "Your Application";
    
    	// Registering the Window Class
    	wc.cbSize		 = sizeof(WNDCLASSEX);
    	wc.style		 = CS_HREDRAW | CS_VREDRAW;
    	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 = appName;
    	wc.hIconSm		 = LoadIcon(NULL, IDI_APPLICATION);
    
    	if (!RegisterClassEx(&wc))
    	{
    		MessageBox(NULL, "Window Registration Failed!", "Error!",
    			MB_ICONERROR | MB_OK);
    		return 0;
    	}
    
    	// Creating the Window
    	hwnd = CreateWindowEx(
    		WS_EX_CLIENTEDGE,
    		appName,
    		"Your Window Title",
    		WS_OVERLAPPEDWINDOW,
    		CW_USEDEFAULT, CW_USEDEFAULT, 400, 400,
    		NULL, NULL, hInstance, NULL);
    
    	if (hwnd == NULL)
    	{
    		MessageBox(NULL, "Window Creation Failed!", "Error",
    			MB_ICONERROR | MB_OK);
    		return 0;
    	}
    
    	ShowWindow(hwnd, nCmdShow);
    	UpdateWindow(hwnd);
    
    	// The Message Loop
    	while (GetMessage(&Msg, NULL, 0, 0) > 0)
    	{
    		TranslateMessage(&Msg);
    		DispatchMessage(&Msg);
    	}
    	return int(Msg.wParam);
    }
    


  • Du hast bei CreateWindowEx WS_OVERLAPPEDWINDOW angegeben, und das tut was?
    richtig! Es sagt, dass das fenster einen rahmen etc. haben soll.
    (kann man nicht wirklich ausm namen schließen)



  • @Dennis123:
    Thx.
    Aber jetzt habe ich ein komplett transparentes window. (WS_EX_LAYERED).

    so, wie bekomme ich jetzt das in der resource liegende Bild (skull) in das Fenster, und zwar transparent (schwarz = transparent) ich habe schon überall gesearched aber nix gefunden.). muss ich den code bei WM_PAINT einbinden oder wo genau? und wie?
    danke schon mal.



  • steht nich in der FAQ wie man bilder läd oder irre ich da? 🙄



  • 404 - NOT FOUND.
    ich hab geguckt. da finde ich nix.
    kann mir jemand helfen.
    *bettel*
    thx.





  • thx thx dafür.
    aberr das erscheint mir komig.
    wollte ich nicht einfach ein Bild TRANSPARENT in das LayeredWindow BLITTEN?

    ach kommt leute! helft mir
    thx.



  • WS_POPUP?

    WS_OVER... -> WS_EX_TOPMOST|WS_POPUP (im Aufruf von CreateWindowEx())



  • Ich denke eine andere Möglichkeit wäre besser:
    man braucht kein fenster/wm_paint ect...
    man braucht nur GetHDC(0)/GetDesktopWindow().
    Dann kann man in der WInmain:

    while (1)
    {
    
    }
    

    aber wie lautet de Code, um ein Bild anzuzeigen.
    Und wie kann ich das Bild in eine Resource der ExE stecken? (VC++2005E)

    thx thx!!



  • Ob das ohne Fenster allerdings 'besser' ist, ist wie immer Geschmackssache, ich sehe das nicht so.

    Script-Styler schrieb:

    aber wie lautet de Code, um ein Bild anzuzeigen.
    Und wie kann ich das Bild in eine Resource der ExE stecken? (VC++2005E)

    Wie der Code lautet? Ist ja wohl n Scherz, dachte Du wolltest das Programm schreiben...: Du musst das Bild ins Programm laden (LoadImage/LoadBitmap) es in einen Speicherkontext einsetzen (SelectObject) und anschließend auf den Gerätekontext blitten (BitBlt). Vergiss das Aufräumen nicht :p .

    Da die VC++ 2005 Express Edition keinen Resourcen Editor hat, brauchst Du einen Externen, siehe dazu im 1. Thread dieses Forums.



  • thx thx!!!!

    aber was ist daran falsch:
    ich hab nur die windows.h includiert.

    {
    	HDC dc = GetDC(0);
    	HDC dcMem = CreateCompatibleDC(dc);
    
    	RECT rect;
    	GetClientRect(GetDesktopWindow(),&rect);
    
    	HBITMAP hBitmap = (HBITMAP)LoadImage(NULL,
    										"crate.bmp",
    										IMAGE_BITMAP,
    										0, 0,
    										LR_LOADFROMFILE);
    
    	HBITMAP hBitmapOld = (HBITMAP)SelectObject(dcMem,hBitmap);
    
    	BITMAP bitmap;
    	GetObject(hBitmap,sizeof(bitmap),&bitmap);
    
    	DWORD start = GetTickCount();
    	DWORD now = start;
    	while ((now - start <= ms) && (now >= start))
    	{
    		BitBlt(dc, 5, 5,
    				bitmap.bmWidth, bitmap.bmHeight,
    				dcMem,
    				0, 0,
    				RCCOPY);
    		Beep(880,1);
    		now = GetTickCount();
    	}
    
    	DeleteObject(hBitmap);
    	DeleteObject(dcMem);
    
    	InvalidateRect(0, NULL, TRUE);
    	UpdateWindow(GetDesktopWindow());
    	return 0;
    }
    

    So, jetzt macht er bei dem letzten parameter von BitBlt halt.
    warum?
    thx.
    ps: wie verwende ich die resourcen?


Anmelden zum Antworten