Linie zeichnen
-
Hallo, muss einen Kompass simulieren und dazu müsste ich wissen, wie man eine Linie zeichnet. Kann mir da einer ein Beispiel zeigen? Besten Dank! Gruß daMike
-
Dafür kannst du die GDI+ Library benutzen, hier ist ein Einsteigerartikel:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-128603.html
-
Hallo,
besten Dank für den Link! Bin beim einbinden der GDI+ auf Probleme gestoßen. Dabei habe ich folgende Bescheibung verwendet:http://www.codersource.net/mfc_gdi_plus_common_issues.html
Wo genau muss ich
private: GdiplusStartupInput m_gdiplusStartupInput; ULONG_PTR m_pGdiToken;platzieren? Wenn ich es in
class CAttitude_3App : public CWinApp { private: GdiplusStartupInput m_gdiplusStartupInput; ULONG_PTR m_pGdiToken;einfüge, bekomme ich folgende Fehlermeldung:
error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'm_gdiplusStartupInput'
error C2501: 'GdiplusStartupInput' : Fehlende Speicherklasse oder Typbezeichner
error C2501: 'm_gdiplusStartupInput' : Fehlende Speicherklasse oder Typbezeichner
error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'm_pGdiToken'
error C2501: 'ULONG_PTR' : Fehlende Speicherklasse oder TypbezeichnerGruß
daMike
-
Hallo,
wenn ich
GdiplusStartupInput gdiplusStartupInput; ULONG_PTR gdiplusToken; GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); GdiplusShutdown(gdiplusToken);aufrufe im Programm, dann erhalte ich folgende Fehlermeldung:
error C2065: 'GdiplusStartupInput' : nichtdeklarierter Bezeichner
error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'gdiplusStartupInput'
error C2065: 'gdiplusStartupInput' : nichtdeklarierter Bezeichner
error C2065: 'GdiplusStartup' : nichtdeklarierter Bezeichner
error C2065: 'GdiplusShutdown' : nichtdeklarierter BezeichnerWarum erkennt er GdiplusStartupInput nicht, obwohl alle *.h Dateien als exteren Abhängigkeiten angezeigt werden .. auch die gdiplusinit.h ?!?!
Gruß
daMike
-
Hast du auch den Namespace Gdiplus benutzt????? Hast wohl meinen Artikel doch nicht gelesen? Oder wenigstens die GDI+ Dokumentation?
-
Funktioniert .. Besten Dank! Wie kann ich eigentlich meine Dialogoberfläche als Ausgabe für die Zeichenjobs definieren?
Graphics graphics(??????);Die ID vom Dialog lautet IDD_ATTITUDE_3_DIALOG, aber das läuft so nicht ?!?!
-
Das hat mit der ID nichts zu tun. Du mußt in deiner OnPaint()-Methode deine Grafik zeichnen bzw. diese Methode wird immer aufgerufen, um den Dialog zu zeichnen. Jede Klasse die von CView abgeleitet ist, stellt dir einen Gerätekontext (Device Context) zur Verfügung. Da CDialog von CView abgeleitet ist kannst du den Kontext einfach holen.
Ein Bsp.:
void MyCDialog::OnPaint() { CDialog::OnPaint(); // Super-Methode einmal aufrufen, sonst gibts 100% CPU-Auslastung Gdiplus::Graphics g(GetDC()); // Graphics zeichnet jetzt auf dem DC von MyCDialog // ... }
-
sorry, bin nicht so fit mit C++ ..
habe mal meine OnPaint angefügt ..
void CAttitude_3Dlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // Gerätekontext für Zeichnen SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Symbol in Client-Rechteck zentrieren int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Symbol zeichnen dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); // Hier erhalte ich einen Fehlermeldung Gdiplus::Graphics g(GetDC()); // Graphics zeichnet jetzt auf dem DC von MyCDialog } }Was folgende Fehlermeldung verursacht ..
error C2664: '__thiscall Gdiplus::Graphics::Gdiplus::Graphics(struct HDC__ *)' : Konvertierung des Parameters 1 von 'class CDC *' in 'struct HDC__ *' nicht moeglich
Die Typen, auf die verwiesen wird, sind nicht verwandt; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder FunktionsformatBei mir gibt es einen Button RUN ..
void CAttitude_3Dlg::OnRun() { // Start GDI+ GdiplusStartupInput gdiplusStartupInput; ULONG_PTR gdiplusToken; GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); // Kompasszeiger paint_kompass(????) // Stop GDI+ GdiplusShutdown(gdiplusToken); } ;bei dem ich die Methode paint_kompass ausführen möchte ..
void paint_kompass(Gdiplus::Graphics &g) { Pen pen(Color::Black, 1); g.DrawEllipse(&pen, 340, 340, 400, 400); g.TranslateTransform(50, 50); // alle 30° ein kleiner Strich damit alle 12 voll werden for(int i=0; i< 360; i = i + 45) { g.RotateTransform(30.0f); g.DrawLine(&pen, 0, 45, 0, 50); } }hoffe Du kannst mir helfen, damit ich mit
ins WE gehen kann !!!
-
ARGH! Das nächste mal schau ich vorher in die Doku! Graphics erwartet einen HDC, probier bitte mal folgendes aus:
Gdiplus::Graphics g( GetDC()->GetSafeHdc() );Ich hoffe es funktioniert, kanns hier leider nicht ausprobieren. Ansonst mußt du warten bis jemand anders es ausprobiert oder am Sa. bin ich zu Hause an meinem PC.
In deiner OnRun() initialisierst du bei jedem Knopfdruck die GDI+ neu (GdiplusStartup), was nicht nötig ist. Mach das einmalig in deiner CWinApp (?) Klasse und gut ist.
paint_kompass() mußt du in der OnPaint() aufrufen, da wird ja alles gezeichnet.
void CAttitude_3Dlg::OnPaint() { // ... else { CDialog::OnPaint(); Gdiplus::Graphics g(GetDC()->GetSafeHdc()); if(kompass_zeichnen) paint_kompass(g); } }Um zu entscheiden ob der Kompass gezeichnet werden soll, mußt du dir irgendwie eine bool Variable in deiner CAttitude_3Dlg-Klasse anlegen, die du per Run-Button auf true oder false schaltest. Ich denke mal, das willst du erreichen? In dem obigen Bsp. anhand der kompass_zeichnen Variable... mußt du selber entscheiden, wie du das lösen willst.
Am besten noch eine eigenen Kompass-Klasse schreiben, die nur für das Zeichnen zuständig ist... so wie es auch in meinem clock-Beispiel der Fall ist.
-
Funktioniert .... Besten DANK und schönes WE!!
Gruß
daMike