Einfaches Bild darstellen



  • 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?



  • 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?



  • RCCOPY gibts nicht, SRCCOPY 😉

    Bild aus Resource laden: Siehe LoadImage() oder LoadBitmap() Doku!
    Möglicherweise auch interessant: http://www.winprog.org/tutorial/resources.html



  • so jetzt gehts!
    aber wie bekomme ich den Hintergrund (weiß) transparent?

    {
    	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, (rect.right-rect.left-bitmap.bmWidth)/2, (rect.bottom-rect.top-bitmap.bmHeight)/2,
    				bitmap.bmWidth, bitmap.bmHeight,
    				dcMem,
    				0, 0,
    				SRCCOPY);
    		Beep(880,1);
    		now = GetTickCount();
    	}
    
    	DeleteObject(dcMem);
    	DeleteObject(hBitmap);
    
    	InvalidateRect(0, NULL, TRUE);
    	UpdateWindow(GetDesktopWindow());
    	return 0;
    }
    




  • error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__TransparentBlt@44" in Funktion ""public: int __thiscall CAction::DisplayImage(int)" (?DisplayImage@CAction@@QAEHH@Z)".

    was ist da los??



  • sry code vergessen.

    {
    	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, (rect.right-rect.left-bitmap.bmWidth)/2, (rect.bottom-rect.top-bitmap.bmHeight)/2,
    				bitmap.bmWidth, bitmap.bmHeight,
    				dcMem,
    				0, 0,
    				SRCCOPY);
    */		TransparentBlt(dc,
    					   (rect.right-rect.left-bitmap.bmWidth)/2,
    					   (rect.bottom-rect.top-bitmap.bmHeight)/2,
    						bitmap.bmWidth, bitmap.bmHeight,
    						dcMem,
    						0, 0,
    						bitmap.bmWidth, bitmap.bmHeight,
    						RGB(255,255,255));
    		Beep(880,1);
    		now = GetTickCount();
    	}
    
    	DeleteObject(dcMem);
    	DeleteObject(hBitmap);
    
    	InvalidateRect(0, NULL, TRUE);
    	UpdateWindow(GetDesktopWindow());
    	return 0;
    }
    


  • Probier mal "GdiTransparentBlt (...)".



  • wie geht nicht.
    "GdiTransparentBlt": Bezeichner wurde nicht gefunden.
    thx.


Anmelden zum Antworten