Malen in ein Device Context
-
Hi,
ich habe ein grosses Problem:Ich möchte in einen DC malen den gerade in meinem Anwendungsfenster gezeigt wird.
OnLButtonDown(UINT nFlags, CPoint point)
{
int x,y;
x=point.x;
y=point.y;CPen Createpen(PS_SOLID,2,RGB(255,255,92));
SelectObject(m_hdc,&Createpen);
SetPixel(m_hdc,x,y,RGB(255,255,92));
}
Ich sehe aber beim klicken keine Pixel.
Kann jemand helfen ?
Grüsse
-
Ich nehme mal an, dass du mit vc++ und der mfc arbeitest.
Du musst dir erstmal einen Gerätekontext beschafen,
z.B. mit : CDC* pDC = this->GetDC();
//deine Zeichenanweisungen
//z.B.:
pDC->SetPixel(10,10,RGB(255,255,92));
ReleaseDC(pDC);
-
Hi,
meines Wissens nach nimmt "SelectObject(CPen *Pen)" nur die Adresse des CPen entgegen.
Im folgenden mal ein Auschnitt aus einem meiner Programme, bei dem man auch ins Fenster malen kann(eine Dialogfeldanwendung):void CGraphDlg::OnLButtonDown(UINT nFlags, CPoint point) { // if(point.x < 640) // rechter Bereichsbegrenzer // { m_iPrevX = point.x; m_iPrevY = point.y; // bOldXY = FALSE; // neu geklickt // } // else // bOutOfBounds = TRUE; // außerhalb des zulässigen Bereiches geklickt CDialog::OnLButtonDown(nFlags, point); } void CGraphDlg::OnMouseMove(UINT nFlags, CPoint point) { if(nFlags & MK_LBUTTON) { // CString sBuffer; // Puffer zur Zwischenspeicherung der Koordinaten CClientDC dc(this); // aktueller DC // if(bOutOfBounds) /* { m_iPrevX = 639; // letzter X Wert an der Grenze m_iPrevY = point.y; if(point.x < 640) bOutOfBounds = FALSE; bOldXY = FALSE; }*/ // if(point.x < 640) // { // if(!bOldXY) // { // sBuffer.Format("%d;%d",m_iPrevX,m_iPrevY); // letzte Punkte in Buffer // m_sPointArray.Add(";;"); // Trennzeichen für neue Linie // m_sPointArray.Add(sBuffer); // neue Startkoordinaten in Punkte-Array // bOldXY = TRUE; } dc.MoveTo(m_iPrevX,m_iPrevY); dc.LineTo(point); m_iPrevX = point.x; m_iPrevY = point.y; // bis hier: Linie zeichnen und neue Koordinaten = alte // sBuffer.Format("%d;%d",point.x,point.y); // m_sPointArray.Add(sBuffer); // Koordinaten speichern // } } CDialog::OnMouseMove(nFlags, point); }
Sobald man die linke Maustaste drückt, werden die x und y Werte gespeichert (m_iPrevX,m_iPrevY).
Bei bewegen der Maus mit gedrückter linker Taste, springt er zu den alten Punkten und zeichnet eine Linie zu den aktuellen. Dann werden die aktuellen in die Variablen der alten gespeichert und die neuen geholt.Wenn man nur Pixel setzt wird das gezeichnete immer schwächer, je schneller du die Maus beim zeichnen bewegst, deshalb verwende ich Linien.
Hoffe, das hilft dir weiter.
mfg takeiteasy
[ Dieser Beitrag wurde am 10.12.2002 um 14:17 Uhr von takeiteasy editiert. ]
-
Also das mit dem SelectObject ist schon vollkommen in Ordnung. Damit selektiert man den Zeichenstift, mit dem man Zeichnen möchte.
-
Hi,
ein dickes fettes Dankeschön.
Hat prima geklappt.Viele Grüsse.
-
@vagabond:
Ist mir schon klar, was SelectObject macht, aber er übergibt 2 Werte: m_hdc und &Createpen. Geht das ? Ich meine, dass man nur ein Argument übergeben kann ?!?mfg takeiteasy
-
Ihr habt beide recht, er benutzt in diesem Fall eine API funktion und muss daher auch den Gerätekontext übergeben. Benutzt du aber die C++-Klasse CDC, dann musst du natürlich den Gerätekontext nicht mehr übergeben.