Hintergrundfarbe in Komponenten ?



  • Hallo,

    wenn ich nen Farbwechsel durchführe im Windows über (Anzeige->Darstellung->Erweitert (Element für Fenster)) dann ändert sich die Farbe ja auch zum Beispiel die Hintergrundfarbe der Komponenten in meinen Programmen.

    Nur gibts da das Problem das der Hintergrund von Text zum Beispiel in einer TListView sich nicht mit verändert.

    Ändere ich den Hintergrund von weiss auf rot über Start->Einstellungen->Systemsteuerung->Anzeige(Anzeige->Darstellung->Erweitert (Element für Fenster)) dann bleibt der Hintergrund von dem Text in der TListView weiss.

    Was muss ich tun sodaß er auch mit auf rot wechselt oder bzw. wie mache ich die Hintergrundfarbe für den Text in der TListView Transparent, das gleiche passiert auch mit icons die in der TListView dargestellt werden.

    mfg



  • EU-Sklave schrieb:

    Was muss ich tun sodaß er auch mit auf rot wechselt oder bzw. wie mache ich die Hintergrundfarbe für den Text in der TListView Transparent, das gleiche passiert auch mit icons die in der TListView dargestellt werden.
    mfg

    Besteht das Problem auch wenn man nichts macht außer die TListView in die Form zu ziehen? Dann ist die TListView einfach kacke. Da hilft leider nur: Bessere Komponenten suchen oder sich intensiver mit der WinApi beschäftigen und dafür sorgen, dass die richtigen Farben angezeigt werden.



  • Naja, das problem besteht eigentlich bei allen komponenten, wenn ich zur Laufzeit meiner Programme die Farben über Windows wechsle.

    Ich bin sicherlich nicht der einzigste bei dem das so ist, nur wird es kein weiter interessieren wenn man zur Laufzeit seiner Programme das FarbShema wechselt und dort die Hintergrundfarbe eine andere ist als vorher.

    bis denne



  • Besteht das Problem auch wenn man nichts macht außer die TListView in die Form zu ziehen?

    mmm weiss nicht genau was du meinst, die TlistView übernimmt immer die Farben die gerade aktuell sind. (benutze den C++ Builder 6)

    Wenn ich nun aber nach einem Farbwechsel über Windows über einen seperaten Button in meinen Programm die TListView die aktuellen Farben zuweise dann schnallt die TListView das auch.

    [/cpp]
    ListView1->Color = NULL;
    ListView1->Color = clWindow;
    [cpp]

    Nur kann ich das nirgends automatisiert so einbauen das dadurch nicht gleich ne Endlosschleife entsteht.
    Und auf nen Button drücken sodaß die aktuellen Windows-Farben jedesmal nach Farbwechsel von der TlistView übernommen werden kann auch nicht sein.

    Beim Start meines Programms mit einer TListView habe ich genau 2 Farben:
    - schwarz für die Schrift in der TListView
    - und weiss als Hintergrund in der TListView (clWindow aktuelle Windows Farbe)

    nach einem Farbwechsel über Windows hab ich 3 Farben in der TlistView:
    - schwarz für die Schrift in der TListView
    - und neue aktuelle (clWindow Farbe) als Hintergrund in der TListView
    - die Hintergrundfarbe der Schrift in der TlistView ist noch immer die alte
    vor Farbwechsel

    __________________________________________________________________________________________________________________

    Farbe clWindow zu ändern wie folgt: Start->Einstellungen->Systemsteuerung->Anzeige(Anzeige->Darstellung->Erweitert (Element für Fenster))
    __________________________________________________________________________________________________________________



  • Hi Sklave 😉

    Dafür gibt es das OnSettingChange-Ereignis.

    Your Master!



  • Hi,

    Ja mein Master 🙂 schon mal gut dieses OnSettingChange-Ereigniss.

    Hab das auch nun mit der Hintergrundfarbe hinbekommen.

    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
            Application->OnSettingChange = OnSettingChangeEvent;
    }
    
    void __fastcall TForm1::OnSettingChangeEvent(TObject *Sender, int Flag, const AnsiString Section, int &Result)
    {
             if(Section == "WindowMetrics" && Flag == SPI_SETNONCLIENTMETRICS)
             {
                     ListView1->Color = NULL;
                     ListView1->Color = clWindow;
                     Result = 0;
             }
    }
    

    Hab ich auf TListView und TTreeView angewendet funktioniert.

    Mit Icons die ich in einer TImageList ablege und dann in einer TListView anzeigen lasse funktioniert das irgendwie noch nicht richtig, der Hintergrund der Icons bleibt der alte. Hier weiss ich aber nicht genau wo das Problem genau liegt. Bei Text wie gesagt kein Problem mehr.



  • So hab das endlich auf die Reihe bekommen mit der Transparenz der FileIcones,
    nun können die Windows Farben zur Laufzeit ohne Probleme geändert werden,
    es werden immer die richtigen Farben in der TListView angezeigt.

    unit1.h

    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <ImgList.hpp>
    #include <ComCtrls.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
            TButton *Button1;
            TImageList *ImageList1;
            TListView *ListView1;
            void __fastcall Button1Click(TObject *Sender);
            void __fastcall FormCreate(TObject *Sender);
    private:	// Anwender-Deklarationen
            void __fastcall OnSettingChangeEvent(TObject *Sender, int Flag, const AnsiString Section, int &Result);
    public:		// Anwender-Deklarationen
            __fastcall TForm1(TComponent* Owner);
            int __fastcall GetIconFromFile(char *Filename, TImageList *PictureList);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    

    Unit1.cpp

    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
            ImageList1->ShareImages = true;
            ListView1->LargeImages = ImageList1;
    }
    
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
            TListItem *mItem;
    
            mItem = ListView1->Items->Add();
            mItem->Caption = "explorer.exe";
            char *FileName = "D:\\Windows\\explorer.exe";
            mItem->ImageIndex = GetIconFromFile(FileName, ImageList1);
    
            mItem = ListView1->Items->Add();
            mItem->Caption = "Notepad.exe";
            char *FileName2 = "D:\\Windows\\Notepad.exe";
            mItem->ImageIndex = GetIconFromFile(FileName2, ImageList1);
    
            mItem = ListView1->Items->Add();
            mItem->Caption = "explorer.exe";
            char *FileName3 = "D:\\Windows\\explorer.exe";
            mItem->ImageIndex = GetIconFromFile(FileName3, ImageList1);
    
            mItem = ListView1->Items->Add();
            mItem->Caption = "msPaint.exe";
            char *FileName4 = "D:\\Windows\\System32\\mspaint.exe";
            mItem->ImageIndex = GetIconFromFile(FileName4, ImageList1);
    
            mItem = ListView1->Items->Add();
            mItem->Caption = "regedit.exe";
            char *FileName5 = "D:\\Windows\\regedit.exe";
            mItem->ImageIndex = GetIconFromFile(FileName5, ImageList1);
    
            mItem = ListView1->Items->Add();
            mItem->Caption = "explorer.scf";
            char *FileName6 = "D:\\Windows\\explorer.scf";
            mItem->ImageIndex = GetIconFromFile(FileName6, ImageList1);
    
            mItem = ListView1->Items->Add();
            mItem->Caption = "explorer.exe";
            char *FileName7 = "D:\\Windows\\explorer.exe";
            mItem->ImageIndex = GetIconFromFile(FileName7, ImageList1);
    }
    //---------------------------------------------------------------------------
    
    //Rückgabe: INDEX OF current FileIcon
    int __fastcall TForm1::GetIconFromFile(char *Filename, TImageList *PictureList)
    {
            TSHFileInfo FileInfo;
            THandle sIcon;
    
            try
            {
                    sIcon = SHGetFileInfo(Filename, 0, &FileInfo, sizeof(FileInfo), SHGFI_SYSICONINDEX | SHGFI_LARGEICON | SHGFI_ICON);
    									                                          //SHGFI_SYSICONINDEX | SHGFI_SMALLICON | SHGFI_ICON);
                    if(sIcon)
                            PictureList->Handle = sIcon;
                    else
                            FileInfo.iIcon = -1;
            }
            __finally
            {
                    DestroyIcon(FileInfo.hIcon);
            }
    
            return FileInfo.iIcon;
    }
    
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
            Application->OnSettingChange = OnSettingChangeEvent;
    }
    
    //---------------------------------------------------------------------------
    void __fastcall TForm1::OnSettingChangeEvent(TObject *Sender, int Flag, const AnsiString Section, int &Result)
    {
                    ListView1->Color = clNone;
                    ListView1->Color = clWindow;
                    Result = 0;
    }
    


  • Für die Transparenten FileIcones in einer TreeView: (selbes Spiel wie oben nur eine Zeile mehr)

    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
            Application->OnSettingChange = OnSettingChangeEvent;
    }
    
    //---------------------------------------------------------------------------
    void __fastcall TForm1::OnSettingChangeEvent(TObject *Sender, int Flag, const AnsiString Section, int &Result)
    {
                    TreeView1->Color = clNone;
                    TreeView1->Color = clWindow;
                    TreeView1->Images->BkColor = clWindow;
                    Result = 0;
    }
    


  • Hallo Leute,
    ich soll für eine Demonstration Google so nachbauen, dass wenn man in ein Eingabefeld vom Typ TEdit etwas beliebiges eingibt und dann auf einen nachgestellten Knopf drückt der aber nicht zu sehen sein soll, sich ein anderes Bild in TImage zeigt. ich weiß aber nicht wie ich das mit den Knöpfen machen soll, dass sie hinter TImage sind aber trotzdem funktionieren.
    wäre toll wenn ihr mir helfen könntet. 😃 🙂 😉 😞 :p 😡 🙄 🕶


Log in to reply