E
Fertig mit Häkeln! *keksfreu*
Man nehme:
im Header:
class CAdCbx : public CComboBox
{
// Konstruktion
public:
CAdCbx();
BOOL EnableWindow(BOOL bEnable = TRUE);
// Attribute
protected:
bool m_bEnableEditing;
CBrush m_brsBkGnd;
// Überschreibungen
// Vom Klassen-Assistenten generierte virtuelle Funktionsüberschreibungen
//{{AFX_VIRTUAL(CAdCbx)
//}}AFX_VIRTUAL
// Implementierung
public:
virtual ~CAdCbx();
// Generierte Nachrichtenzuordnungsfunktionen
protected:
//{{AFX_MSG(CAdCbx)
afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor);
afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
//}}AFX_MSG
virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
bool EnableEditing(bool bEnableEditing = true);
};
im Cpp:
CAdCbx::CAdCbx()
: m_bEnableEditing(true)
{
}
CAdCbx::~CAdCbx()
{
m_brsBkGnd.DeleteObject();
}
BEGIN_MESSAGE_MAP(CAdCbx, CComboBox)
//{{AFX_MSG_MAP(CAdCbx)
ON_WM_CTLCOLOR_REFLECT()
ON_WM_CTLCOLOR()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
bool CAdCbx::EnableEditing(bool bEnableEditing)
{
m_bEnableEditing = bEnableEditing;
if (m_bEnableEditing)
{
m_brsBkGnd.DeleteObject();
m_brsBkGnd.CreateSolidBrush(GetSysColor(COLOR_WINDOW));
}
else
{
m_brsBkGnd.DeleteObject();
m_brsBkGnd.CreateSolidBrush(GetSysColor(COLOR_BTNFACE));
}
Invalidate();
return true;
}
LRESULT CAdCbx::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
if( !m_bEnableEditing )
if( message == WM_LBUTTONDOWN || message == WM_LBUTTONDBLCLK || message == WM_KEYDOWN || message == WM_VKEYTOITEM )
return FALSE;
return CComboBox::WindowProc(message, wParam, lParam);
}
HBRUSH CAdCbx::CtlColor(CDC* pDC, UINT nCtlColor)
{
// TODO: Change any attributes of the DC here
pDC->SetTextColor(RGB(0,0,0));
if (m_bEnableEditing)
{
pDC->SetBkColor(GetSysColor(COLOR_WINDOW));
}
else
{
pDC->SetBkColor(GetSysColor(COLOR_BTNFACE));
}
// TODO: Return a non-NULL brush if the parent's handler should not be called
return (HBRUSH)m_brsBkGnd;
}
HBRUSH CAdCbx::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
// TODO: Change any attributes of the DC here
pDC->SetTextColor(RGB(0,0,0));
if (m_bEnableEditing)
{
pDC->SetBkColor(GetSysColor(COLOR_WINDOW));
}
else
{
pDC->SetBkColor(GetSysColor(COLOR_BTNFACE));
}
// TODO: Return a different brush if the default is not desired
return (HBRUSH)m_brsBkGnd;
}
BOOL CAdCbx::EnableWindow(BOOL bEnable)
{
return EnableEditing(bEnable == TRUE);
}
Nun wird bei EnableWindow einfach nur der Hintergrund geändert und bei "deaktiviert" reagiert es nicht auf klicks.
So, ich hoffe ich habe nichts vergessen.