Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Andi

Frischling

  • »Andi« ist der Autor dieses Themas

Beiträge: 37

Beruf: Student

  • Private Nachricht senden

1

13.07.2005, 14:55

Grafikfläche in MFC GUI

Moin,

ich hab mit MFC eine Gui für mein Programm gebastelt und würd noch gerne eine Grafikfläche einfügen, wo ich z.B. mit den GDI Funktionen Kreise und Rechtecke zeichnen und anzeigen will. Geht das nur in neuen Dialogen oder wie kann ich in meine Oberfläche eine solche Zeichenfläche implementieren?Geht das vieleicht mit Picture Control?

Mir fehlt da irgendwie der Ansatz.Kann mir jemand helfen?

Andi

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

13.07.2005, 18:27

Geht auch ohne neues Fenster, solange du schon eins hast. Habe immo nur leider mein notebook nit in der nähe, aber man erstellt ja ein HDC bzw. holt sich einen handle (gethdc) und über den zeichnet man.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Andi

Frischling

  • »Andi« ist der Autor dieses Themas

Beiträge: 37

Beruf: Student

  • Private Nachricht senden

3

14.07.2005, 08:54

Moin,

Danke, das sind ja schon mal gute News. Nur welche Komponente nehm ich da? Bei Delphi z.B. gibts ja Canvas. Da zieht man sich ein Zeichenfeld auf und dann gehts los. Ich dachte mit MFC geht das ähnlich. Das Picture Control sieht ja ein bisschen so aus. Geht das vieleicht darüber? Ich hab noch vergessen zu sagen, dass ich mit dem VisualStudio .net arbeite. In der Toolbox dort sieht eigtl. kein Element so aus, als ob man damit eine Zeichenfläche aufspannt.

Wovon soll ich mir das handle holen?

Weiß nich weiter
Ani

Phil_GDM

Alter Hase

Beiträge: 443

Wohnort: Graz

Beruf: Student-Softwareentwicklung u. Wissensmanagement

  • Private Nachricht senden

4

14.07.2005, 09:41

Du kannst im Grunde genommen jede Komponente nehmen, die eine Methode mit dem Namen getDC zur Verfügung stellt.
Ich neheme für sowas meist ein Static-Control.

Der Zeichencode sieht dann ungefähr so aus:

C-/C++-Quelltext

1
2
3
4
5
  CDC* pDc = m_DrawArea.GetDC();  //Get the HDC of the static control

  CPen RedPen(PS_SOLID, 3, RGB(255, 0, 0));
  pDc->SelectObject(&RedPen);
  pDc->MoveTo(0, 0);
  pDc->LineTo(300, 300);


Es ist jedoch wichtig, wann du den Zeichencode aufrufst.
Dies muss nämlich nach dem Zeichnen des eigentlichen Steuerelements geschehen, da sich dieses sonst über deine selbst gezeichneten Sachen drüberzeichnet (ich habs immer mit Timern gelöst, sehr einfach aber nicht unbedingt sauber).

mfg Philipp

Anonymous

unregistriert

5

14.07.2005, 11:03

Super Danke!!

aber eine Frage hab ich noch. Woher kommt deine m_DrawArea?Ist das die ID des Static- Control?

Anonymous

unregistriert

6

14.07.2005, 12:14

Nein das ist die die Membervariable des Dialogs, die mit dem Steuerelement "verknüpft" ist (einfach rechter Mausklick auf das Steuerelement und dann "Add Variable" auswählen).

mfg Philipp

Andi

Frischling

  • »Andi« ist der Autor dieses Themas

Beiträge: 37

Beruf: Student

  • Private Nachricht senden

7

14.07.2005, 13:52

sorry, aber ich muss noch mal fragen. Welchen Datentyp soll die Variable kriegen? Hab mit CStatic versucht, aber das funktioniert nicht. Da kommt ein Speicherfehler, wenn ich das Programm starten will.Ich benutze das VS.net 2003.

Ich muss doch die ID des Elements von IDC_STAIC auf was anderes ändern. Dann kann ich membervariablen erstellen. Muss dann alles manuell einstellen. Und da initialisiere ich die Var. erstmal mit CStatic. danach muss man den Datentyp in der header- Datei ändern, aber ich weiß nich in was?

8

14.07.2005, 13:53

let there be code...

Andi

Frischling

  • »Andi« ist der Autor dieses Themas

Beiträge: 37

Beruf: Student

  • Private Nachricht senden

9

14.07.2005, 14:13

MFCDlg.h
...
CStatic m_DrawArea;
...


MFCDlg.cpp
#include <MFCDlg.h>
...

void CMFCDlg::DoDataExchange(CDataExchange* pDX)
{
...
DDX_Control(pDX, IDC_DRAWAREA, m_DrawArea);
}
...

void CMFCDlg::OnNMCustomdrawSlider1(NMHDR *pNMHDR, LRESULT *pResult)
{
...
CDC* pDc = m_DrawArea.GetDC();
...
}

IDC_DRAWAREA ist die ID vom Picture Control. pDc soll das handle übergeben werden. Das Compilieren und linken haut hin. Aber beim Programstart kommt ´ne Speicherverletzung, wenn die Variable allein schon definiert wird. m_Drawarea soll eine Control- Variable für das Picture control sein.
Achja, ich will in der Zeichfläche Kreise und so anzeigen, die sich ändern sollen, wenn ich einen Slider verschiebe.

Ich bin für jede Hilfe dankbar
Andi

Andi

Frischling

  • »Andi« ist der Autor dieses Themas

Beiträge: 37

Beruf: Student

  • Private Nachricht senden

10

14.07.2005, 14:33

japp, hab die Lösung. Man braucht garkeine membervariable.
Es geht auch so:

void CMFCDlg::OnNMCustomdrawSlider1(NMHDR *pNMHDR, LRESULT *pResult)
{
...
CWnd *pCtl = this->GetDlgItem(IDC_DRAWAREA);
CDC *pDc = pCtl->GetDC();
...
}

aber danke für die Denkanstöße! :huhu:
Andi

Werbeanzeige