Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Mein Device Context macht nicht, was ich ihm sage

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
25.07.2003, 10:36 Uhr
0xdeadbeef
Gott
(Operator)


Moin,

Ja, auch ich muss mich ab und zu mal mit der MFC rumschlagen . Es geht um folgendes: Ich hab mir ne Custom Control zusammengebastelt und dahinter ne Klasse gesetzt, die von CWnd abgeleitet ist. Ich muss in dem Ding ein bisschen rumzeichnen, von daher schien mir das am meisten Sinn zu machen. Ich hab dem Ding dann einen Message Handler für WM_PAINT verpasst, in dem ich mir einen CPaintDC für das Fenster erstelle und ein bisschen drin rumzeichne. Soweit, so gut, das macht er auch noch.
Ich muss allerdings auch auf Mauseingaben achten, also verpass ich ihm Message Handler für WM_LBUTTONDOWN, WM_LBUTTONUP, WM_MOUSEMOVE und WM_RBUTTONUP. In der Routine, die WM_MOUSEMOVE behandelt, (OnMouseMove) muss ich ebenfalls in das Fenster reinzeichnen, ich erstelle mir also wieder einen CPaintDC und versuche drin rumzuzeichnen. Der Code läuft dann etwa so:

C++:
void CMyWnd::OnMouseMove(UINT nFlags, CPoint point) {
    AFX_MANAGE_STATE(AfxGetStaticModuleState());    
    
    if(nFlags & MK_LBUTTON) {
        UpdateWindow();
        CPaintDC dc(this);
        dc.RectAngle(m_ptStartingPoint, point);
    }

     CWnd::OnMouseMove(nFlags, point);
}


m_ptStartingPoint wird in CMyWnd::OnLButtonDown(UINT, CPoint) gesetzt, es geht darum, einen Bereich zu markieren. Er kompiliert auch anstandslos und ohne Warnungen, aber wenn ich den Code dann ausführe und die Maus über das Fenster ziehe (linke Taste gedrückt), passiert nichts. Kein Rechteck, nicht mal irgendwie verplant in die Gegend gezeichnet. Auch sonst kein Effekt. Scheinbar reagiert der CPaintDC nicht auf das, was ich ihm sage, und ich weiß nicht warum.

Hat von euch vielleicht jemand ne Idee, woran das liegen könnte?
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
25.07.2003, 11:19 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Hi beefy,
ich hab davon auch nicht viel Plan aber ich glaube du musst denn Punkt erst in die richtigen Koordinaten transformieren

ScreenToClient oder so heisst die funktion
Kann auch sein dass ich völlig falsch liege

Vielleicht hilfts ja

Gruss Heiko
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
25.07.2003, 11:38 Uhr
0xdeadbeef
Gott
(Operator)


Die Koordinaten kommen schon transformiert rein, das hab ich grad nochmal nachgeprüft.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
25.07.2003, 11:48 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


sicher ?
als ich das mal benutzt habe musst ich das transformieren
mach dir mal ein zusätliches Textfeld mit der ID: IDC_POSITIONSFELD
und klopp mal das hier rein
dann müsste der im Textfeld eigentlich immer die richtige Postion anzeigen

C++:
CString str;
CRect rechteck;

(GetDlgItem(IDC_POSITIONWINDOW))->GetWindowRect(&rechteck);
this->ScreenToClient(&rechteck);

CRgn PostionWindowRgn;
PostionWindowRgn.CreateRectRgn(rechteck.TopLeft().x, rechteck.TopLeft().y, rechteck.TopLeft().x+348, rechteck.TopLeft().+260);

if(PostionWindowRgn.PtInRegion(point))
  str.Format("%d x %d", point.x - rechteck.TopLeft().x, point.y - rechteck.TopLeft().y );
GetDlgItem(IDC_POSITIONSFELD)->SetWindowText(str);




Gruss Heiko
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 25.07.2003 um 11:48 Uhr von Heiko editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
25.07.2003, 12:03 Uhr
0xdeadbeef
Gott
(Operator)


Ich bin mir sicher. Ich hab in den Code reingeschrieben:

C++:
CString str;
CPoint tmp_point = point; //point wurde übergeben

ScreenToClient(&tmp_point);

str.Format(_T("%d, %d -> %d, %d"), point.x, point.y, tmp_point.x, tmp_point.y);
MessageBox(str);


Dann bin ich mit dem Mauszeiger oben links in das Feld rein, und der schmiss mir raus

Code:
0, 5 -> -104, -47


Das bedeutet für mich soviel wie: In point standen schon die richtigen Werte drin.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
25.07.2003, 12:28 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


dann musst du wohl auf uwe waren. Ich verwende es selber gerade als Punktanzeige. Alledings male ich nicht drauf.

obwohl du kannst nur mal probieren mit der funktion setPixel des DCs ob der die richtigen pixel anmalt, damit müsstest du zumindest dies testen können.
Wenn das geht muss das mit dem sch**ss rechteck mal auch gehen


das hier malt dir nen schönes Kreuz auf den Desktop
color=255 malt dir ein rotes kreuz

C++:
oid CViewerDlg::paintCrosshair(int color, CPoint point){

    CWnd *positionPic = GetDlgItem(IDC_POSITIONWINDOW);
    CDC *pDCpos = positionPic->GetDC();

    int i,j;

    for(j=-3;j<=3;j++){
        for(i=-3;i<=3;i++){
            if( !((j<-1) || (j>1)) || !((i<-1) || (i>1)) ) {pDCpos->SetPixel(point.x/4 + 2 + i,point.y/4 + 2 + j,color);}
        }
    }

    positionPic->ReleaseDC(pDCpos);    

}






Gruss Heiko
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 25.07.2003 um 12:33 Uhr von Heiko editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
25.07.2003, 12:46 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo deadbeef,
CPaintDc unterstützt IMHO NICHT das Verfolgen der Maus, das geht nur mit CClientDC().
Nun kenne ich Deine einzelnen Behandlungen nicht, aber dann müssten Deine Funktionen etwa so aussehen.

C++:
//BOOL m_bTracking;
//CPoint m_ptFrom;        
//CPoint m_ptTo;
// im ctor
// m_bTracking = FALSE;
void CZeichneDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
    m_ptFrom = point;
    m_ptTo = point;
    m_bTracking = TRUE;
    SetCapture();
}

void CZeichneDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
    if (m_bTracking) {
        m_bTracking = FALSE;
        if (GetCapture () == this)
            ::ReleaseCapture ();

        CClientDC dc (this);

        CPen pen (PS_SOLID, 16, RGB (255, 0, 0));
        dc.SelectObject (&pen);

        dc.MoveTo (m_ptFrom);
        dc.Rectangle(m_ptFrom.x,m_ptFrom.y,point.x,point.y);
    }
}

void CZeichneDlg::OnMouseMove(UINT nFlags, CPoint point)
{
    if (m_bTracking) {
        CClientDC dc (this);
        m_ptTo = point;
    }
}


--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
25.07.2003, 13:25 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo,
das dc.MoveTo (m_ptFrom); ist natürlich Schwachsinn, da ich erst etwas anderes probiert hatte.
--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
25.07.2003, 13:58 Uhr
0xdeadbeef
Gott
(Operator)


Das war genau das, was ich suchte.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: