Weiche Kanten mit GDI?



  • Hi!

    Kann man mit GDI eigentlich zB. einen Kreis zeichnen, welcher aber keine Abstufungen hat? Also sozusagen anti-aliased?

    Ich hab das gefunden: http://www.winprog.org/tutorial/transparency.html

    Aber so wird das wohl nicht funktionieren...

    😕



  • Nimm GDI+:
    deinGraphicsObject.SetSmoothingMode(SmoothingModeAntiAlias);
    und anschließend rumzeichnen 😉

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-128603-and-start-is-0.html



  • Mit GDI geht's also nicht, oder?

    Kann man es eigentlich auch so machen, dass eine Grafik auf jedem Hintergrund schöne Ränder hat? Also nicht dass es zB bei weißem Hintergrund gut aussieht, bei schwarzem Hintergrund aber nen hässlichen (zB weißen) Rand bekommt...?



  • Mit GDI geht es soweit ich weiss nur, wenn man das Antialiasing selbst macht. Den Kreis also "zu fuss" zeichnet.

    Und ja, das geht. Dazu liest man vor dem Schreiben der neuen Farbe die alte Hintergrundfarbe aus, und blendet die alte Hintergrundfarbe mit der "neuen" Farbe im entsprechenden Verhältnis.

    Bzw. wenn du GDI+ verwendest, dann macht GDI+ das für dich.



  • Danke, dann werde ich GDI+ verwenden.



  • Hmm, ein PNG Bild wird jetzt aber in der falschen Größe angezeigt, etwa 9 Pixel zu breit und 3 Pixel zu hoch als wie ich es abgespeichert habe.
    Warum das?

    Mein Code (.png als Resource):

    Gdiplus::Bitmap* bitmap;
    
    ...
    
    	HRSRC resourceHandle = FindResource(instanceHandle, MAKEINTRESOURCE(IDB_PNG1), "PNG");
    
    	unsigned long resourceSize = SizeofResource(instanceHandle, resourceHandle);
    
    	void* resourceData = LockResource(LoadResource(instanceHandle, resourceHandle));
    
    	HGLOBAL bufferHandle = GlobalAlloc(GMEM_MOVEABLE, resourceSize);
    
    	void* buffer = GlobalLock(bufferHandle);
    
    	CopyMemory(buffer, resourceData, resourceSize);
    
    	IStream* stream;
    
    	CreateStreamOnHGlobal(bufferHandle, false, &stream);
    
    	bitmap = Gdiplus::Bitmap::FromStream(stream);
    
    	stream->Release();
    
    	GlobalUnlock(bufferHandle);
    
    	GlobalFree(bufferHandle);
    
    ...
    
    	case WM_PAINT:
    		{
    			PAINTSTRUCT ps;
    
    			HDC dc = BeginPaint(dialogHandle, &ps);
    
    			Gdiplus::Graphics graphics(dc);
    
    			graphics.DrawImage(bitmap, 10, 10);
    
    			EndPaint(dialogHandle, &ps);
    
    			break;
    		}
    

    😕



  • Ahso hab mich verlesen, einfach graphics.DrawImage(bitmap, 10, 10, width, height); 🙄


Anmelden zum Antworten