Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: VCL (C++ Builder) ::  Problem beim Zeichnen auf Panel bei klassischen Windows Thema     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
Hawkxxx
Unregistrierter




Beitrag Hawkxxx Unregistrierter 00:57:22 17.04.2012   Titel:   Problem beim Zeichnen auf Panel bei klassischen Windows Thema            Zitieren

Hallo Leute,

ich habe ein Problem beim Zeichnen von einigen Sachen auf einem TPanel. der folgende Code liegt normalerweise im OnPaint-Ereignis einer Form. Wenn Windows 7 das Aero-Thema hat läuft alles super! Wenn ich aber auf das klassische Thema wechsle, dann zeichnet er es garnicht, sondern nur beim Ziehen des Fensters kann man durch ein Flackern erkennen, dass er die Zeichnung kurz durchführt...

Wie kommt das? Gibt es ein Workaround dafür?


Der Code zeichnet mittig in einem TPanel den Fenstertitel, einen Balken daunter und dann 3 Kreise als Logo.

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 //-----Im OnPaint-Ereignis der Form
TCanvas *can = new TCanvas;
can->Handle=GetDC(OLE_Panel->Handle);
    can->Font->Size=40;
    can->Font->Style=TFontStyles()<<fsItalic;
    SetBkMode(can->Handle,TRANSPARENT);
    can->Font->Color=clRed;
    DrawTextW(can->Handle,Form1->Caption.w_str(),Form1->Caption.Length()+1,&TRect(0,0,OLE_Panel->Width-3,OLE_Panel->Height),DT_SINGLELINE | DT_VCENTER|DT_CENTER|DT_END_ELLIPSIS);
 
    can->Font->Color=clGreen;
    DrawTextW(can->Handle,Form1->Caption.w_str(),Form1->Caption.Length()+1,&TRect(2,2,OLE_Panel->Width-3,OLE_Panel->Height),DT_SINGLELINE | DT_VCENTER|DT_CENTER|DT_END_ELLIPSIS);
 
    can->Brush->Color=TColor(0x004080FF);
    can->FillRect(TRect(OLE_Panel->Width/2+can->TextWidth(Form1->Caption)/2,(OLE_Panel->Height/2)+(can->TextHeight(Form1->Caption)/2),(OLE_Panel->Width/2)-(can->TextWidth(Form1->Caption)/2),(OLE_Panel->Height/2)+(can->TextHeight(Form1->Caption)/2)+10));
    can->Brush->Color=clSkyBlue;
    TRect r=TRect(OLE_Panel->Width/2+can->TextWidth(Form1->Caption)/2+2,(OLE_Panel->Height/2)+(can->TextHeight(Form1->Caption)/2)+2,(OLE_Panel->Width/2)-(can->TextWidth(Form1->Caption)/2)+2,(OLE_Panel->Height/2)+(can->TextHeight(Form1->Caption)/2)+12);
    can->FillRect(r);
    can->Pen->Color=clWhite;
    can->Brush->Color=0x004080FF;
    can->Ellipse(r.Left+5,r.Top-5,r.Left+25,r.top+15);;
    can->Brush->Color=clSkyBlue;
    can->Ellipse(r.Left+30,r.Top-5,r.Left+50,r.top+15);;
    can->Brush->Color=clLime;
    can->Ellipse(r.Left+55,r.Top-5,r.Left+75,r.top+15);;
delete can;



Ich habe es auch in der WndProc des Panels in der WM_PAINT Message probiert, aber immer das gleiche.

Gruß Hawk
martin_b
Mitglied

Benutzerprofil
Anmeldungsdatum: 04.01.2004
Beiträge: 57
Beitrag martin_b Mitglied 11:18:08 17.04.2012   Titel:              Zitieren

Hallo Hawkxxx,

könnte es daran liegen, dass Du das Canvas direkt nach dem Zeichnen mit delete freigibst?

Leg doch eine PaintBox auf das Panel und zeichne auf dem Canvas der PaintBox.

Gruß

Martin
Hawkxxx
Unregistrierter




Beitrag Hawkxxx Unregistrierter 14:33:08 17.04.2012   Titel:              Zitieren

Hi,

also am delete liegt es nicht, ich habe es schon ausprobiert. Auch an den Einstellungen des Panels bei Lock oder FullRepaint oder DoubleBuffering habe ich schon rumprobiert, aber kein Erfolg.

Mag sein, dass es mit einer PaintBox funktioniert - habe es nicht ausprobiert, aber es muss doch irgendwie direkt mit dem Panel gehen, oder?
DerAltenburger
Mitglied

Benutzerprofil
Anmeldungsdatum: 22.02.2003
Beiträge: 1575
Beitrag DerAltenburger Mitglied 18:44:44 17.04.2012   Titel:              Zitieren

Zeichne besser im OnPaint des Panels!

Gruss
Frank

_________________
Hilfreich beim Programmieren:
ZUERST Hirn einschalten!
( WWW.DerAltenburger.de )
Hawkxxx
Unregistrierter




Beitrag Hawkxxx Unregistrierter 19:58:45 17.04.2012   Titel:              Zitieren

Also ein TPanel hat kein OnPaint-Ereignis. Ich verwende deshalb das WM_PAINT in der abgeleiteten WndProc des Panels. Aber auch dort funktioniert es nicht richtig. Das Resultat bleibt gleich.
Stefan71242
Mitglied

Benutzerprofil
Anmeldungsdatum: 11.08.2005
Beiträge: 245
Beitrag Stefan71242 Mitglied 11:34:57 18.04.2012   Titel:   TImage nutzen            Zitieren

Hallo
ich setze für so was ein TImage auf das Panel mit alClient. Ich zeichne auf eine TBitmap und kopiere die Bitmap (bmp) nach dem Zeichnen auf das TImage->Picture->Bitmap=bmp. :)

Grüße Stefan
Hawkxxx
Unregistrierter




Beitrag Hawkxxx Unregistrierter 13:18:18 18.04.2012   Titel:              Zitieren

Danke für euer Bemühen. Anscheinend gibt keine Möglichkeit da etwas so zu machen, dass es mit dem klassischen Windows-Thema funktioniert. Ich werde wohl auf die Methode mit dem TImage zurückgreifen, obwohl es nicht ganz so elegant ist.


Danke!
audacia
Mitglied

Benutzerprofil
Anmeldungsdatum: 05.02.2005
Beiträge: 4149
Beitrag audacia Mitglied 18:17:07 18.04.2012   Titel:              Zitieren

Für sowas ist die PaintBox schon genau richtig.

_________________
"Hey, it compiles! Ship it!"
C++Builder Pages · Typsichere Format-Strings
DerAltenburger
Mitglied

Benutzerprofil
Anmeldungsdatum: 22.02.2003
Beiträge: 1575
Beitrag DerAltenburger Mitglied 23:07:02 19.04.2012   Titel:              Zitieren

Hawkxxx schrieb:
Also ein TPanel hat kein OnPaint-Ereignis. Ich verwende deshalb das WM_PAINT in der abgeleiteten WndProc des Panels. Aber auch dort funktioniert es nicht richtig. Das Resultat bleibt gleich.


ich habe dafür eine Komponente gemacht abgeleitet von TPanel:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
//Header- Datei (.h)
//---------------------------------------------------------------------------
#ifndef CanvasPanelH
#define CanvasPanelH
//---------------------------------------------------------------------------
#include <SysUtils.hpp>
#include <Controls.hpp>
#include <Classes.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
//---------------------------------------------------------------------------
typedef void __fastcall (__closure *TCanvasPanelAfterPaint)(TCanvas *ACanvas,TRect ARect);
//---------------------------------------------------------------------------
class PACKAGE TCanvasPanel : public TPanel
{
private:
        TCanvasPanelAfterPaint FOnAfterPaint;
        virtual void __fastcall Paint(void);
protected:
public:
        __fastcall TCanvasPanel(TComponent* Owner);
__published:
        __property Canvas;
        __property TCanvasPanelAfterPaint OnAfterPaint={read=FOnAfterPaint,write=FOnAfterPaint};
};
//---------------------------------------------------------------------------
#endif
 
 
//CPP- Datei (.cpp)
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "CanvasPanel.h"

#pragma package(smart_init)
//---------------------------------------------------------------------------
// ValidCtrCheck wird benutzt, um sicherzustellen, daß die erzeugten Komponenten keine
// rein virtuellen Funktionen haben.
//
 
static inline void ValidCtrCheck(TCanvasPanel *)
{
        new TCanvasPanel(NULL);
}
//---------------------------------------------------------------------------
__fastcall TCanvasPanel::TCanvasPanel(TComponent* Owner)
        : TPanel(Owner)
{
  DoubleBuffered=true;
}
//---------------------------------------------------------------------------
void __fastcall TCanvasPanel::Paint(void)
{
  TPanel::Paint();
  if (FOnAfterPaint!=NULL)
  { FOnAfterPaint(Canvas,ClientRect);
  }
}
//---------------------------------------------------------------------------
namespace Canvaspanel
{
        void __fastcall PACKAGE Register()
        {
                 TComponentClass classes[1] = {__classid(TCanvasPanel)};
                 RegisterComponents("Image", classes, 0);
        }
}
//---------------------------------------------------------------------------


Damit hast Du:
1. Zugriff auf Cancas von dem Panel von aussen
2. ein Ereignis nach dem Zeichnen des Panels selbst.

das klappt bisher ohne Probleme!

Gruss
Frank

_________________
Hilfreich beim Programmieren:
ZUERST Hirn einschalten!
( WWW.DerAltenburger.de )
Hawkxxx
Unregistrierter




Beitrag Hawkxxx Unregistrierter 23:56:15 19.04.2012   Titel:              Zitieren

Hui! Danke für die Mühe!

Ich werde es demnächst ausprobieren und Bescheid sagen...


Gruß
Hawk
c++.de :: VCL (C++ Builder) ::  Problem beim Zeichnen auf Panel bei klassischen Windows Thema   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.