none
CPaintDC Farbe setzen RRS feed

  • Frage

  • Hallo,

    wie kann die Farbe für LineTo und Rectangle setzen ?

    Ich habe es mit SetDCBrushColor und SetDCPenColor versucht, aber ich bekomme nur schwarze Linien und ein weißes Rechteck.

    Gruß

    Thorsten

    Montag, 19. Juli 2010 08:14

Antworten

  • Diese Farben werden durch den aktuellen Pen bestimmt.

    Du musst einen CPen erzeugen und diesen in den DC selektieren.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Montag, 19. Juli 2010 08:38
    Moderator
  • Das sollte etwa so aussehen:

    CPaintDC dc(this); // device context for painting 
    CBrush brush; 
    CPen pen;
    
    ...
    
    brush.CreateSolidBrush(0x0000FF00); // green brush
    pen.CreatePen(PS_SOLID , 0x000000FF); // red pen
    dc.SelectObject(brush); 
    dc.SelectObject(pen);
    
    ...
    
    dc.Rectangle(10,10,20,20); // Rechteck mit rotem Rahmen und grüner Füllung

     

    Montag, 19. Juli 2010 08:42

Alle Antworten

  • Diese Farben werden durch den aktuellen Pen bestimmt.

    Du musst einen CPen erzeugen und diesen in den DC selektieren.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Montag, 19. Juli 2010 08:38
    Moderator
  • Das sollte etwa so aussehen:

    CPaintDC dc(this); // device context for painting 
    CBrush brush; 
    CPen pen;
    
    ...
    
    brush.CreateSolidBrush(0x0000FF00); // green brush
    pen.CreatePen(PS_SOLID , 0x000000FF); // red pen
    dc.SelectObject(brush); 
    dc.SelectObject(pen);
    
    ...
    
    dc.Rectangle(10,10,20,20); // Rechteck mit rotem Rahmen und grüner Füllung

     

    Montag, 19. Juli 2010 08:42
  • Danke, funktioniert einwandfrei !
    Dienstag, 20. Juli 2010 14:57
  • Hallo Forum Es gibt sie noch ... die Fragen im Forum, dich ICH auch beantworten könnte ;-) Eines möchte ich jedoch noch hinzufügen: Wenn das Programm auch unter Win95, Win98 oder WinME laufen sollte, dann bitte in jeder Funktion am Ende wieder alles restaurieren, also: void func(CDC *pDC) { CPen DrawPen(PS_SOLID,1,RGB(255,128,128)); CPen *pOldPen = pDC->SelectObject(&DrawPen); .... pDC->MoveTo(0,0); pDc->LineTo(200,200); ... pDC->SelectObject(pOldPen); } Das Objekt "DrawPen" hört nämlich am Ende der Funktion "zu leben auf" und ist aber immer noch im Device Kontext selektiert. Man sollte meinen, das sei egal, weil ja nicht mehr darauf zugegriffen wird. Unter WinNT, W2K, WinXP, ... ist es auch kein Problem, aber Win95,98 und ME schmeißt die Anwendung sofort mit einem Resourcenfehler raus. Grüße FireHeart
    Montag, 26. Juli 2010 13:01
  • Hallo Fire-Heart!

    WinNT, W2K, WinXP, ... ist es auch kein Problem,
    aber Win95,98 und ME schmeißt die Anwendung sofort mit einem
    Resourcenfehler raus. Grüße FireHeart

    Du irrst. Auch unter Win2K und später führt dies auf kurz oder lang zu Ressourcen-Leaks nur ist die Zahl der GDI Objekte nicht mehr auf 64000 (oder so) begrenzt. D.h. das Programm frisst Speicher bei jedem OnPaint Vorgang, wenn man nicht so vorgeht wie Du es beschreibst.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Montag, 26. Juli 2010 14:00
    Moderator
  • Hallo Martin Du hast sicher recht. Ich hatte ja auch ein ungutes Gefühl im Bauch, als ich das erste Mal meine Anwendungen auf Win7 getestet hatte...wer weiß schon, was man immer schon für "Unsauberkeiten" gemacht hatte, ohne zu wissen, das dies überhaupt eine solche ist. Glücklicherweise liefen die Anwendungen aber auch unter Win7 stabil ( ** Freude **) Grüße FireHeart
    Dienstag, 27. Juli 2010 06:57