Antialiasing, Transparente Farben



  • Hat man bei den MFC auch die Möglichkeit eines Antialiasing, bzw Smoothingmodes?
    zB: Bei der CDC Member LineTo, könnten man sich wünschen das der CPen geglätete
    Kanten hat. Oder bei einer Ellipse ebenso. Bei CFont geht das offensichtlich.
    Eigentlich sollte das in der CDC-Klasse integriert sein !
    Dann frage ich mich, ob es bei den MFC auch transparente Farben gibt. So wie
    bei C#, wo es eine Methode Color.FromArbg(Alpha, rot , gruen, blau). Mit Alpha
    kann man den Transparents-Grad einstellen. Bei Google habe ich nichts gefunden.



  • Hi,

    Du kannst mit AlphaBlend verschiedene Ebenen übereinander blenden:

    Pseudo Beispiel

    BLENDFUNCTION bld = { AC_SRC_OVER, 0, 200, 0 };
    	pTDc->AlphaBlend(rc.left, rc.top, rc.Width(), rc.Height(), &m_MemDc.m_dcMem, 0, 0, m_MemDc.m_rect.Width(), m_MemDc.m_rect.Height(), bld);
    

    Linien werden mit der GDI nicht weich gezeichnet, dazu kann man aber GDIPlus
    in der MFC Anwendung integrieren.

    https://www.c-plusplus.net/forum/128603-full
    https://msdn.microsoft.com/de-de/library/aa984365(v=vs.71).aspx

    Grüße
    Karsten



  • Wie kann man GDIPlus in seine C++ MFC Anwendung integrieren ? Übers Internet ?
    Oder ist es in VS 2008 oder VS 2010 enthalten ?



  • Hi,

    das kannst Du alles er'googeln:

    So kannst Du das verwenden
    http://stackoverflow.com/questions/14044536/how-to-draw-create-gdi-on-mfc-dialog

    Hier noch ein anderes Beispiel von 100.Millionen ^^
    http://www.codeproject.com/Articles/13783/Alpha-Blending-Dialog-Using-GDI

    Gdi+ ist halt eine klasse die wird zugänglich über das Header:
    #include <gdiplus.h>

    Grüße und viel Spass damit ...
    Karsten



  • So jetzt habe ich gegoogelt, aber eben nicht alle Treffer. Das Beispiel von
    oben lies sich nicht compilieren. Da habe ich bestimmt etwas falsch gemacht. Könnte mir jemand eine kurzes Code-Beispiel schreiben. In einem MFC-CView Fenster möchte ich eine Linie anzeigen die geglättet sein sollte. GDI+
    verstehe ich nicht richtig. Offensichtlich ist es eine Klasse, aber in welcher
    Sprache gechrieben ? Bei .NET wird es verwandt. Ist es eine Assembly ? Wieso
    kann man es dann bei C++ MFC einsetzen ?



  • Folgendes Problem: Wenn ich bei stdafx.h die Anweisung #include <gdiplus.h>
    einfüge, wie es in obigen Codebeispiel gezeigt wird, kommt es zu 107
    Fehlermeldungen. Die erste: "fehlendes ; vor ... Graphics ..." keine Ahnung,
    weiss jemand Rat ?


  • Mod

    GDI+ ist ganz normaler WinAPI Code (DLL), der gekapselt in eine C++ Klasse ist.
    Der Code verträgt sich ohne Probleme mit der MFC. Warum auch nicht?
    Schau Dir doch gdiplus.h an!

    Ich verwende oft genug GDI+, aber wo hast Du gdiplus.h eingefügt?
    Ich mache das meisten in der stdafx.h am Ende.

    Zeig uns Code...



  • Hi,

    das einfache Beispiel kann man Kompilieren:

    http://www.codeproject.com/Articles/13783/Alpha-Blending-Dialog-Using-GDI

    Da geht alles weitere hervor, ich muss nun sagen das Du erst mit den
    Standard Konzepten arbeiten musst, damit weiterführende Konzepte einfach handhabbar bleiben.

    Dafür benötigst Du rund 3 Jahre.

    Es gibt aber auch einfachere Programmiere -Oberflächen wie Net C# das sieht fast genauso aus, und du musst nur noch reinspammen was kommen soll.
    Auch der FlashPlayer bietet so eine IDE, dito Java und Konsorten, hier mit
    MFC und C++ geht erstmal aus dem Stegreif Garnichts.

    Viel Erfolg
    Gruß Karsten



  • Ich habe ein jungfräuliches MFC Projekt angelegt, und bei stdafx.h am Anfang
    #include <gdiplus.h> eingefügt. Das ist mein Code ...



  • Ich versuchs noch mal am Ende von stdafx.h ...


  • Mod

    Am Anfang ist immer schlecht. Vor den Windows Headern bzw. Vor den MFC Headern sollte man höchstens Includes machen, die ein paar Settings/#defines vornehmen.

    Alles andere kann sehr komische Effekte haben.



  • Gottseidank es hat geklappt ! Jetzt noch etwas: In OnPaint konnte ich mit GDI+
    eine Linie mit SmoothingMode zeichnen. Bei OnDraw nicht ! Folgender Code:

    ... CMeinView::OnDraw(CDC* pDC)
    {
    Graphics graphics(pDC->m_hDC);
    Pen blue(Color(128, 0, 0, 255), 4.0f);
    graphics.DrawLine(&blue, 20, 20, 500, 40);
    }

    Es wurde nichts gezeichnet !


  • Mod

    Und wie sah Dein Paint Code aus. Zwischen OnDraw und OnPaint gibt es "eigentlich" keinen Unterschied. In OnPaint musst Du Dir den Paint DC halt selber besorgen.



  • Er sah so aus:
    ...OnPaint ...
    {
    CPaintDC dc(this);
    Graphics graphics(dc.m_hDC);
    Pen blue(Color(128, 0, 0, 255), 4.0f); // mit Transparenz 128
    graphics.SetSmoothingMode(SmoothingModeHighQuality); // Eventuell
    graphics.DrawLine(&blue, 200, 200, 500, 500);
    }
    Das ging ohne Probleme, meiner Meinung genauso geschtieben wie bei OnDraw ...


  • Mod

    Das ist identisch.

    Bitte Code Tags verwenden.



  • Ich gebe es offen zu, ich weiss nicht was Code Tags sind, oder kenne die
    Bezeichnung nicht ...
    Kürzlich habe ich auf einer VS 2010 Professional, ein neues MFC-Projekt
    angelegt, und bei OnDraw die Funktion pDC->TextOut(100, 100, L"MeinText");
    eingefügt. Das ging, der Text wurde angezeigt. Als ich die Zeilen, für GDI+
    hinzugefügt hatte, wurde OnDraw gar nicht mehr ausgeführt. Nur noch OnPaint.
    Nochmals folgender Text, wie er im Beispiel von Code Projekt gezeigt wurde:

    In stdafx.h am Ende:
    #include "gdiplus.h"
    using namespace Gdiplus;
    #pragma comment(lib, "gdiplus.lib")

    In ...App.h...
    ULONG_PTR m_gdiplusToken;

    In ...App.cpp... bei InitInstance, an verschiedenen Stellen ausprobiert !
    Gdiplus::GdiplusStartupInput gdiplusStartupInput;
    Gdiplus::GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);

    In ...ExitInstance
    Gdiplus::GdiplusShutDown(m_gdiplusToken);

    Und dann OnPaint, bzw OnDraw wie oben ...
    Also habe ich auf VS 2008 Standard und VS 2010 Professional das gleiche
    Ergebnis erhalten.


Anmelden zum Antworten