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


Anmelden zum Antworten