Koordinatensystem in nichtmodalem Dialogfenster
-
hallo, ich möchte in einem nichtmodalen dialogfenster die punkte aus einem 2d-array in ein koordinatensystem übertragen. dazu habe ich die klasse cdc gefunden. wie kann ich denn meinen gerätekontext mit dem fenster verbinden (wofür ich ein handle habe). jede memberfunktion der klasse cdc, die ich in der dialogklasse aufrufe, führt bei mir zu einem programmabsturz.
vielen dank schonmal, daniel
-
Servus,
ich hatte, vor langer Zeit, mal ein bisschen damit herumgespielt:
m_ctrStaticPic.RedrawWindow(); int iFaktor = iGridSize; CRect mapRect, mapClRect; CPoint cpPos; CString strTemp; m_ctrStaticPic.GetWindowRect(mapRect); m_ctrStaticPic.GetClientRect(mapClRect); // Den Stift erzeugen CPen lPen(iPenStyle, 1, colGrid); // Den Stift als aktuellen Zeichenstift auswählen CBrush lPatternBrush(colLineWP); pMapDC->SelectObject(&lPen); pMapDC->SelectObject(&lPatternBrush); pMapDC->FillSolidRect(mapClRect, colBk); for (int x = iFaktor; x < (mapRect.right - mapRect.left); x = x+iFaktor) { pMapDC->MoveTo(x, 0); pMapDC->LineTo(x, (mapRect.bottom - mapRect.top)-4); } for (int y = iFaktor; y < (mapRect.bottom - mapRect.top); y = y+iFaktor) { pMapDC->MoveTo((mapRect.right - mapRect.left)-4, y); pMapDC->LineTo(0, y); }
iGridSize = Kästchengröße
m_ctrStaticPic = Member von einem einfachen StaticFeld
iPenStyle = Penstyle MSDN -> CPen -> Constructor
colBk, colGrid, colLineWP = COLORREF(RGB(WasweissichfürneFarbe))kannst ja mal ein bisschen damit rumspielen...
*winke*
Hellsgore
-
Hi,
du musst ihm glaub ich noch sagen, wie er korrekt zu pMapDC kommt.
-
Oh...
stimmt:pMapDC = m_ctrStaticPic.GetDC();
pMapDC ist der DeviceContext von dem StaticCtrl. Ich weiss, ist alles etwas umständlich .
*winke*
Hellsgore
-
ich habe inzwischen schonmal auf das dialogfenster zugreifen können, meine funktion sieht jetzt folgendermassen aus:
[cpp] void CPaintDialog::PaintCoordSystem() { //Gerätekontext erzeugen und mit Fenster verbinden StaticHandle = ChildHandle->GetDlgItem(IDC_SGRAPH); CDC* dc = StaticHandle->GetDC(); CRect rect; StaticHandle->GetWindowRect(rect); //Mittelpunkt ermitteln CPoint center = rect.CenterPoint(); CPoint upleft = rect.TopLeft(); CPoint downright = rect.BottomRight(); //Stift anlegen CPen lPen(PS_SOLID, 10, RGB(255, 255, 255)); CBrush* lbrush = new CBrush; lbrush->CreateSolidBrush(RGB(255,255,255)); //Den Stift als aktuellen Zeichenstift auswählen dc->SelectObject(&lbrush); dc->SelectObject(&lPen); dc->SetViewportOrg(center); dc->MoveTo(downright); dc->LineTo(upleft); picture->UpdateWindow(); dc->SetMapMode(MM_ISOTROPIC); } [/cpp]
dabei ist staticHandle ein handle auf die ID meines staticfeldes. allerdings zeichnet der keine linien ein. was habe ich denn da vergessen?
-
laut return von dc->lineTo wird die linie aber gezeichnet.
-
picture->UpdateWindow(); //<- *schlag* *prügel* *tret*
MSDN schrieb:
CWnd::UpdateWindow
Updates the client area by sending a WM_PAINT message if the update region is not empty.Du zeichnest zuerst alles schön brav und dann löschst du es dir wieder selber . Ich glaube das ist nicht gut.....
Oder rufe bei OnPaint() deine Funktion zum Zeichnen wieder auf.
*winke*
Hellsgore
-
irgendwie scheint das nicht nur das problem zu sein:
-die linien werden auch nicht gezeichnet, wenn man das picture->Updatewindow weglässt.
dann habe ich mal ein
dc->FillRect(center, lbrush) zugefügt.
allerdings wird ohne updatewindow rechts unten in der ecke ein weisses fenster gezeichnet, aber noch keine linien.
-
Servus,
//Gerätekontext erzeugen und mit Fenster verbinden StaticHandle = GetDlgItem(IDC_STATIC_PIC); StaticHandle->RedrawWindow(); CDC* dc = StaticHandle->GetDC(); CRect rect; StaticHandle->GetClientRect(rect); //Mittelpunkt ermitteln CPoint center = rect.CenterPoint(); CPoint upleft = rect.TopLeft(); CPoint downright = rect.BottomRight(); //Stift anlegen CPen lPen(PS_SOLID, 10, RGB(255, 255, 255)); CBrush lbrush(RGB(255,255,255)); //Den Stift als aktuellen Zeichenstift auswählen dc->SelectObject(&lbrush); dc->SelectObject(&lPen); //dc->SetViewportOrg(center); Wenn du den setzt nimmt er den Mittelpunkt als Start dc->MoveTo(upleft); dc->LineTo(downright); dc->SetMapMode(MM_ISOTROPIC);
Wenn du ein weisses Staticfeld hast, wirst du damit nichts sehen Ich gehe mal davon aus das StaticHandle vom Typ CWnd* ist. So funzt es...
*winke*
Hellsgore
-
super, vielen dank, so hats geklappt