Frage zu DrawLine



  • hallo,

    als ich heute die DrawLine Funktionen verwenden wollte, musste ich feststellen das Winapi diese anscheind nicht kennt.Ich wollte folgendes Problem lösen. Jeder kennt sicherlich die "SEPARATOR" wenn man ein Menü erzeugt und ich wollte genau sowas direkt in mein Fenster einbauen, um eine Visuelle Trennung zu erzeugen.Jedoch klappt das nicht, kann mir einer weiterhelfen was ich verwenden könnte?



  • du kannst in nem fenster zeichnen indem du mit
    "MoveTo" den stift zu einer koordinate bewegst und von dort aus mit
    "LineTo" nach der ziel koordinate bewegst

    also eine line von 10, 10 nach 10, 20 ist
    dc.MoveTo(10, 10);
    dc.LineTo(10, 20);

    kapsels am besten in eine funktion wenn dus oefters brauchst



  • ok alles klar und was ist in deinem falle das dc? und die kann ich einfach so aufrufen oder muss ich da vorher etwas besonderes erstellen?



  • ? DrawLine? Sollte eigtl. bei Forms-Anwendungen aufzufinden sein. Und wenn du GDI+ nutzt. Ansonsten solltest du dich mich sowas begnügen:

    void draw_line(::HDC& hDC, int x1, int y1, int x2, int y2, ::HPEN const& hPen)
    {
        ::HGDIOBJ hOldPen(::SelectObject(hDC, hPen)); // pen auswählen
        ::POINT old_pos;
        ::MoveToEx(hDC, x1, y1, &old_pos); // zu P(x1, y1) bewegen und alte pos sichern
        ::LineTo(hDC, x2, y2); // linie von P(x1, y1) zu P(x2, y2) ziehen
        ::MoveToEx(hDC, old_pos.x, old_pos.y, NULL); // gesicherte pos wiederherstellen
        ::SelectObject(hDC, hOldPen); // alten pen wieder auswählen
    }
    

    ...



  • @(D)Evil öhmm sorry, aber da blick ich nich so ganz durch, kann man da nich ein einfaches beispiel anbringen wo man die Funktion in aktion sieht, wenn ich bei mir im Programm Draw eingebe und dann die autovervollständigung dann zeigt er mir das DrawLine nicht an.Ich weiß nich, ich benutze Code::Blocks und kann dort ja wenn ich ein Win32GUI Projekt auswähle, entweder "Frame Based" oder "Dialog Based" auswählen, ich habe Dialog Based genommen, vieleicht hängt es damit zusammen. Nur kenne ich auch den Unterschied zwischen den beiden Möglichkeiten nicht, vieleicht kann mir da einer helfen, bin auf jedenfall schonmal Dankbar dafür. :xmas1:



  • Meint er möglicherweise ein SplitWindow?



  • hier mal die paint struktur der WinApi, muesste auch auf nen dialog oder frame funktionieren

    /*...*/
    
    // zeichnen vorbereiten
    PAINTSTRUCT ps;
    HDC hDC = BeginPaint(m_MainWindow, &ps); //m_MainWindow ist das handle des fensters wo gezeichnet werden soll
    
    // linie zeichnen
    PaintLine(&hDC, 10, 10, 10, 20);
    
    // zeichnen fertig
    EndPaint(m_MainWindow, &ps);
    
    /*...*/
    
    void PaintLine(HDC* hDC, int XFrom, int YFrom, int XTo, int YTo)
    {
        // stift auswaehlen mit style und farbe sowie dicke
        HPEN hPen = ::CreatePen(0, 1, RGB(0, 0, 0));
        ::SelectObject(*hDC, hPen);
        // zu position bewegen
        MoveToEx(*hDC, XFrom, YFrom, NULL);
        // von dort aus zeichnen bis
        LineTo(*hDC, XTo, YTo);
        // stift loeschen
        ::DeleteObject(hPen);
    }
    


  • ach das is doch mist, ich hab die funktion von dir in eine .h gepackt, hab sie mti eingebunden, jedoch sagt er zu mir "multiple definition of PaintLine(HDC__*,int,int,int,int);" was soll mir dsa sagen? warum wird denn eigentlich nich so eine funktion vorgegeben?



  • das gehoert ja auch ne in eine header file {o;
    da du an verschiedenen stellen die header benutzt, wird versucht die selbe funktion mehrmals bekannt zu machen, und das geht nunmal nicht



  • ok alles klar, so geht es, aber eigentlich war das doch nicht die lösung meines problem. Nochmal. Ihr wisst ja wenn man eine Resource datei für ein Menü erstellen möchte kann man auch sagen

    "MENUITEM SEPARATOR" so dann erscheint im Menü so ein Trennstrich. Und genau so einen Trennstrich würde ich gerne in meinem Hauptfenster haben, ist denn sowas möglich?



  • wie waer es wenn du nen picture control nimmst und es auf 1 pixel hoehe stellst #gg
    oder du nimmst ne groupbox ?
    was du meinst ist sicher n splitter, das man beide ansichten auch separat scrollen kann ?
    das kann man auch fixieren das man es nicht verschieben kann, das ist aber overhead fuer eine rein optische trennung
    im menue ist auch nichts anderes gemacht nur das der resourcen compileer dort eine linie zeichnet



  • asso...naja und ich dachte man kann genau so eine linie in meinem fenster erzeugen, nee ich benutze keine groupbox, nagut wenn das nicht geht, dann muss ich es wohl erstmal sein lassen, danke trotzdem für die ratschläge



  • @Mr.Evil: Beachte, dass du die Position wieder zurücksetzen musst (in deiner Funktion PaintLine)

    void DrawLine(HDC hDC, int x1, int y1, int x2, int y2, HPEN hPen)
    {
        HGDIOBJ hOldPen = SelectObject(hDC, hPen); // pen auswählen
        POINT old_pos;
        MoveToEx(hDC, x1, y1, &old_pos); // zu P(x1, y1) bewegen und alte pos sichern
        LineTo(hDC, x2, y2); // linie von P(x1, y1) zu P(x2, y2) ziehen
        MoveToEx(hDC, old_pos.x, old_pos.y, NULL); // gesicherte pos wiederherstellen
        SelectObject(hDC, hOldPen); // alten pen wieder auswählen
    }
    

    so sieht meine Funktion ... ehm ... etwas mehr C aus 😉



  • "genauso eine linie" hast du doch wenn du selber eine zeichnest wie hier vorgestellt ?! - was anderes ist doch im menue auch nicht

    // edit
    warum position zuruecksetzen ? da man immer wenn man irgendwo was schreib und zeichnet eh zu beginn immer an die stelle springt

    ich hatte damals als ich mehr machte schreib, zeichen aktionen usw immer in funktionen gekapselt die style, dicke, farbe usw annimmt, am anfang wird der pen immer gesetzt und zu der position gesprungen

    wozu also zurueck setzen wenn man eh immer zu beginn hin springt {o;


Anmelden zum Antworten