Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.net  
   

Die mobilen Seiten von c++.net:
https://m.c-plusplus.net

  
C++ Forum :: WinAPI ::  DrawLine macht nur eine einzige Line. Aber warum?     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
YuecelZeGerm
Mitglied

Benutzerprofil
Anmeldungsdatum: 11.09.2017
Beiträge: 4
Beitrag YuecelZeGerm Mitglied 20:50:31 13.09.2017   Titel:   DrawLine macht nur eine einzige Line. Aber warum?            Zitieren

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
{
class CLine
public:
 
 
    void OnPaint();
    void DrawLine(HWND hWnd, HINSTANCE hInst);
    void Init(int X1, int Y1, int X2, int Y2);
 
 
private:
 
    HDC          hdc;
    PAINTSTRUCT  ps;
 
 
    GdiplusStartupInput gdiplusStartupInput;
    ULONG_PTR           gdiplusToken;
 
 
    int m_X1;
    int m_Y1;
 
    int m_X2;
    int m_Y2;
 
};
 
void CLine::Init(int X1,int Y1, int X2, int Y2)
{
    m_X1 = X1;
    m_X2 = X2;
 
    m_Y1 = Y1;
    m_Y2 = Y2;
 
}
 
void CLine::DrawLine(HWND hWnd, HINSTANCE hInst)
{  
 
    // Initialize GDI+.
    GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
 
    hdc = BeginPaint(hWnd, &ps);
    CLine::OnPaint();
}
 
 
void CLine::OnPaint()
{
 
 
 
    Graphics graphics(hdc);
    Pen      pen(Color(255, 0, 0, 255));
    graphics.DrawLine(&pen, m_X1, m_Y1, m_X2, m_Y2);
 
 
 
 
}
 
 
void Line(HWND hWnd, HINSTANCE hInst)
{
 
    CLine Linie1;
    CLine Linie2;
 
 
    Linie1.Init(10, 10, 200, 20);
    Linie1.DrawLine(hWnd, hInst);
   
 
    Linie2.Init(120, 100, 100, 100);
    Linie2.DrawLine(hWnd, hInst);
 
}



Wollte mir einen Graphen Zeichnen lassen und hab mir dazu eine Klasse gebaut in der ich einfach Linien Zeichnen kann.
Problematisch dabei ist, dass immer nur die erste Linie gezogen wird.
Es werden doch eigentlich alle benötigten Variablen innerhalb der Klasseninstanz für je eine Klasse, also Linie erzeugt,
wieso lässt sich dann trotzdem nur einen Line Zeichenen?


Jemand eine Idee?

_________________
"Realize deeply that the present moment is all you ever have."
ralros
Unregistrierter




Beitrag ralros Unregistrierter 21:50:13 13.09.2017   Titel:              Zitieren

Warum "BeginnPaint()"?
Nach "BeginnPaint()" kommt ein "EndPaint()"
Sollte man nicht "GetDC()" verwenden um den "hdc" zu bekommen?
Martin Richter
Moderator

Benutzerprofil
Anmeldungsdatum: 18.04.2006
Beiträge: 15354
Beitrag Martin Richter Moderator 07:12:57 14.09.2017   Titel:              Zitieren

Solange man nicht sieht in welchem Kontext das ausgeführt wird, macht diese Frage keinen Sinn.

BeginPaint/EndPaint gehören nur ein einen WM_PAINT handler.

Ansonsten sollte Dir klar sein, das der Aufruf von BeginPaint ein WM_ERASEBKGND auslöst. Es wird also der Hintergrund gelöscht.
Wo wir wieder bei meinem ersten Einwurf sind.

Vorschlag: Du liest malk ein Buch oder einen Artikel über Win32... :cool:

_________________
Martin Richter (MVP für C++ von 2000 bis 2015) WWJD http://blog.m-ri.de
"A well-written program is its own heaven; a poorly written program is its own hell!" The Tao of Programming
ralros
Unregistrierter




Beitrag ralros Unregistrierter 23:40:05 14.09.2017   Titel:              Zitieren

@Martin Richter
Meinst Du mich?
Die Frage von mir war an den Thread-Ersteller gerichtet, da er "BeginPaint()" in seiner Klasse aufruft (ohne "EndPaint()" und auch außerhalb von WM_PAINT; CLine::OnPaint() ist ja kein WM_PAINT, da CLine nicht von einer Fensterklasse abgeleitet ist), vielleicht könnte es gerade daran liegen, daß es nicht richtig gezeichnet wird.
Ich würde hier "GetDC()" verwenden.
Martin Richter
Moderator

Benutzerprofil
Anmeldungsdatum: 18.04.2006
Beiträge: 15354
Beitrag Martin Richter Moderator 09:37:53 15.09.2017   Titel:              Zitieren

ralros schrieb:
@Martin Richter
Meinst Du mich?


Nein!

Zitat:

Ich würde hier "GetDC()" verwenden.


Auch das macht keinen Sinn, denn eigentlich muss alles Zeichen in einem Fenster immer im Kontext eines WM_PAINT erfolgen. Andernfalls ist das Ergebnis der Ausgabe random und nicht "persistent"...

_________________
Martin Richter (MVP für C++ von 2000 bis 2015) WWJD http://blog.m-ri.de
"A well-written program is its own heaven; a poorly written program is its own hell!" The Tao of Programming
ralros
Unregistrierter




Beitrag ralros Unregistrierter 22:15:02 15.09.2017   Titel:              Zitieren

@Martin Richter
Ja, das ist richtig, man könnte "CLine::OnDraw()" in die WM_PAINT-Nachricht setzen und dann würde man das HDC als Parameter übergeben, dann würde es auch immer gezeichnet werden, wenn es gezeichnet werden muß.
"GetDC()/ReleaseDC()" würde dann auch funktionieren, aber besser wäre es das Divice-Context-Handle als Parameter zu übergeben.
C++ Forum :: WinAPI ::  DrawLine macht nur eine einzige Line. Aber warum?   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.net ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.