DrawItem Problem
-
So, hallo, mal wieder!
Und wieder nerve ich euch mit meinen Problemen. Dieses Mal handelt es sich um die Funktion DrawItem().
Ich habe vor, mir eine eigene ComboBox-Klasse zu schreiben, die alles etwas farbiger macht und einige neue Funktionen bereitstellt. Dazu habe ich bei CodeProject eine Klasse namens ReadOnlyComboBox heruntergeladen, um mir die Techniken dafür abzugucken. Schließlich will ich selber die Klassen schreiben und mit meinen Funktionen ergänzen.Ich habe gesehen, dass für das Zeichnen die Funktion DrawItem() zuständig ist, dabei wird die virtuelle Funktion genommen.
Seltsamerweise springt mein Programm nicht in diese Funktion und ich habe keine Ahnung, woran das liegt.
Hier mal die Implementierung:// Header Datei #pragma once // CEasyComboBox class CEasyComboBox : public CComboBox { DECLARE_DYNAMIC(CEasyComboBox) public: CEasyComboBox(); virtual ~CEasyComboBox(); public: virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct); DECLARE_MESSAGE_MAP() };
//Cpp Datei // EasyComboBox.cpp : implementation file // #include "stdafx.h" #include "NewComboTest.h" #include "EasyComboBox.h" #include ".\easycombobox.h" // CEasyComboBox IMPLEMENT_DYNAMIC(CEasyComboBox, CComboBox) CEasyComboBox::CEasyComboBox() { } CEasyComboBox::~CEasyComboBox() { } BEGIN_MESSAGE_MAP(CEasyComboBox, CComboBox) END_MESSAGE_MAP() void CEasyComboBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { CDC dc; dc.Attach(lpDrawItemStruct->hDC); // Set backgroud color. if (lpDrawItemStruct->itemState & ODS_SELECTED) dc.SetBkColor(RGB(0,0,200));//GetSysColor(COLOR_HIGHLIGHT));} else if (lpDrawItemStruct->itemID == 0){ dc.SetBkColor(RGB(0,200,0));//GetSysColor(COLOR_WINDOW)); else dc.SetBkColor(RGB(200,0,0));//GetSysColor(CTLCOLOR_MSGBOX)); CString strText; GetLBText(lpDrawItemStruct->itemID, strText); dc.ExtTextOut(lpDrawItemStruct->rcItem.left, lpDrawItemStruct->rcItem.top, ETO_OPAQUE, &lpDrawItemStruct->rcItem, strText, strText.GetLength (), NULL); dc.SetBkColor(GetSysColor(COLOR_WINDOW)); dc.Detach(); }
Keine Ahnung, was da falsch ist.
-
Und Du hast das Control (bzw. Deine Klasse) auch mit dem Style "CBS_OWNERDRAWVARIABLE" erzeugt?
-
Oh, scheint daran zu liegen!
Kann man denn auch das irgendwie bewerkstelligen, dass falls ein User vergisst, diesen Flag zu setzen, dies im Konstruktor geschieht?Danke!!
-
könntest in der PreCreate das ergänzen
-
BOOL CEasyComboBox::PreCreateWindow(CREATESTRUCT& cs) { cs.style |= CBS_OWNERDRAWVARIABLE; return CComboBox::PreCreateWindow(cs); }
-
In die PreCreateWindow() - Funktion springt der gar nicht rein?
-
Schau dir mal die PreSubclassWindow Funktion an...
http://www.codeproject.com/listctrl/skinlist.asp?df=100&forumid=16072&exp=0&select=895363