[Direct2D]Bitmap in einen DC laden

  • C++

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Gonger96.

    [Direct2D]Bitmap in einen DC laden

    Hey,
    ich versuche grade für mein aktuelles Projekt Controls zu zeichnen. Da ich den Windows-Standard-Look haben möchte, benutze ich DrawFramedControl bzw. DrawThemeBackground (für VisualStyle). Diese Funktionen malen mir die normalen Controls auf einen DC. Mit GDI+ geht das ja ganz leicht, ich mach mir eine Bitmap, hohle Graphics von der Bitmap und per Graphics.GetHDC() bekomm ich den DC. Mit Direct2D scheint das nicht möglich zu sein. Kennt jemand eine Möglichkeit eine Direct2DBitmap in einen DC zu laden um mit einer GDI-Funktion darauf zu malen?

    Grüße
    Kann schon sein, dass das etwas dauert, hab ich nie ausprobiert, weil ich meine Bitmaps immer ganz am Anfang lade. Im Prinzip besteht meine Technik nur darin, die Bitmap Pixel für Pixel zu kopieren.

    C#-Quellcode

    1. unsafe private static Bitmap1 ConvertBitmap(DeviceContext deviceContext, System.Drawing.Bitmap bitmap)
    2. {
    3. int stride = bitmap.Width * sizeof(int);
    4. using (var tempStream = new DataStream(bitmap.Height * stride, true, true))
    5. {
    6. var sourceArea = new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height);
    7. var bitmapData = bitmap.LockBits(sourceArea, System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppPArgb);
    8. uint* p = (uint*)bitmapData.Scan0;
    9. for (int i = 0; i < bitmap.Width * bitmap.Height; i++)
    10. {
    11. byte* channels = (byte*)p;
    12. tempStream.Write(channels[2]);
    13. tempStream.Write(channels[1]);
    14. tempStream.Write(channels[0]);
    15. tempStream.Write(channels[3]);
    16. p++;
    17. }
    18. bitmap.UnlockBits(bitmapData);
    19. tempStream.Position = 0;
    20. var bitmapProperties = new BitmapProperties1(new PixelFormat(SharpDX.DXGI.Format.R8G8B8A8_UNorm, AlphaMode.Premultiplied));
    21. return new Bitmap1(deviceContext, new Size2(bitmap.Width, bitmap.Height), tempStream, stride, bitmapProperties);
    22. }
    23. }
    Dein Vorhaben sollte ansonsten auch noch so umzusetzen sein: msdn.microsoft.com/en-us/libra…op/dd371321(v=vs.85).aspx
    Würde theoretisch gehen, nur ich benutze C++ und kann/möchte nicht auf verwaltete Klassen zugreifen. Ich arbeite an einem UI-Framework und so könnte ich einfach Effekte, Transformationen und Transparenz mit den Windowscontrols verbinden.

    Warum wird man eigentlich nicht informiert wenn ein neuer Beitrag gepostet wird? @Artentus So möchte ich das ungern machen. Ich könnte auch CreateFromMemory benutzen, aber kopieren ist viel zu langsam, weil das während des Renderns passiert.
    Nochmal die blöde Frage: Könnte man Direct2D nicht auch mit Direct3D von DX10/DX11 verbinden? Dann könnte man die Bitmap doch direkt als Shaderresource einbinden und in einem Shader kopieren, oder? Würde mich echt wundern, wenn D2D nicht mit D3D kombinierbar wäre.
    In MDX gab es btw. die Möglichkeit, den device context eines Textursurfaces zu ermitteln, wenn ich mich nicht irre.

    Gruß
    ~blaze~
    Direct2D lässt sich mit D3D verbinden, aber dass wäre schon overpowered denke ich. Es läuft so ab: Ich hab ein Interface namens graphics mit dem das ganze Programm gerendert wird. Dieses wird einmal von einem GDI+ - und einem Direct2DRenderer implementiert. In main() sagt man dann womit die App gerendert werden soll, dass ist um beliebig viele Renderer erweiterbar und alle sind untereinander strikt getrennt. Man kann aber Standardcontrols nur mit GDI rendern, WPF macht's dort ja auch so.
    Es gibt leider doch noch ein Problem. Wenn ich AlphaIgnore einstelle klappt alles, hab ich jedoch AlphaPremultiplied (die einzige andere Option die GDI unterstützt) dann wird alles was GDI malt in weiß dargestellt. Jede GDI32-Funktion malt in dem Hintergrund des Fensters. Auf dem Bild im Anhang sollte das weiße Rechteck eigentlich so aussehen, wie auf dem vorherigen Bild. Ich denke GDI malt mit Alpha = 0. Kann ich dass irgendwie ändern?
    Bilder
    • dc.png

      3,44 kB, 152×77, 315 mal angesehen