![]() |
Create custom control. |
Post Reply ![]() |
Author | |
Gorkystreet ![]() Newbie ![]() Joined: 04 July 2007 Location: Ukraine Status: Offline Points: 6 |
![]() ![]() ![]() ![]() ![]() Posted: 04 July 2007 at 9:36am |
Good morning!
I need a custom control to use it with CXTPPropertyGrid. It should be like combobox (with dropdown list), but it should have possibility to be enabled\disabled from the construction. So it has contain the check-box at left side of it's value field. Maybe someone has emplemented such class already? My version is the following:
Declaration:
class CInplaceCheckBox : public CButton
{ public: afx_msg LRESULT OnCheck(WPARAM wParam, LPARAM lParam); afx_msg HBRUSH CtlColor(CDC* pDC, UINT /*nCtlColor*/); DECLARE_MESSAGE_MAP()
protected: CCustomItemCheckBox* m_pItem; COLORREF m_clrBack; CBrush m_brBack; virtual BOOL OnChildNotify(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult);
friend class CCustomItemCheckBox;
}; //---------------------------------------------------------------------------- class CCustomItemCheckBox : public CXTPPropertyGridItemEnum { protected: public:
CCustomItemCheckBox(CString strCaption); CCustomItemCheckBox(CString strCaption, ULONG index); CCustomItemCheckBox(CString strCaption, BOOL checked); CCustomItemCheckBox(CString strCaption, ULONG index, BOOL checked); virtual ~CCustomItemCheckBox(); BOOL GetBool();
void SetBool(BOOL bValue); ControlType GetType();
void SetType(ControlType type); protected:
//virtual void OnDeselect(); //virtual void OnSelect(); virtual BOOL OnLButtonDown(UINT nFlags, CPoint point); virtual CRect GetValueRect(); virtual BOOL OnDrawItemValue(CDC& dc, CRect rcValue); virtual BOOL IsValueChanged(); private:
CInplaceCheckBox m_wndCheckBox; BOOL m_bValue; CRect m_CheckBoxRect; ControlType m_Type; friend class CInplaceCheckBox;
}; Implementation:
BEGIN_MESSAGE_MAP(CInplaceCheckBox, CButton)
ON_MESSAGE(BM_SETCHECK, OnCheck) ON_WM_CTLCOLOR_REFLECT() END_MESSAGE_MAP() //---------------------------------------------------------------------------- HBRUSH CInplaceCheckBox::CtlColor(CDC* pDC, UINT /*nCtlColor*/) { class CGridView : public CXTPPropertyGridView { friend class CInplaceCheckBox; }; CGridView* pGrid = (CGridView*)m_pItem->m_pGrid;
COLORREF clr = pGrid->GetPaintManager()->GetItemMetrics()->m_clrBack;
if (clr != m_clrBack || !m_brBack.GetSafeHandle())
{ m_brBack.DeleteObject(); m_brBack.CreateSolidBrush(clr); m_clrBack = clr; } pDC->SetBkColor(m_clrBack);
return m_brBack; } //---------------------------------------------------------------------------- BOOL CInplaceCheckBox::OnChildNotify(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult) { return CButton::OnChildNotify(message, wParam, lParam, pResult); } //---------------------------------------------------------------------------- LRESULT CInplaceCheckBox::OnCheck(WPARAM wParam, LPARAM lParam) { m_pItem->m_bValue = (wParam == BST_CHECKED); m_pItem->OnValueChanged(m_pItem->GetValue()); return CButton::DefWindowProc(BM_SETCHECK, wParam, lParam); } //---------------------------------------------------------------------------- CCustomItemCheckBox::CCustomItemCheckBox(CString strCaption) : CXTPPropertyGridItemEnum(strCaption) { m_wndCheckBox.m_pItem = this; m_bValue = TRUE; } //---------------------------------------------------------------------------- CCustomItemCheckBox::CCustomItemCheckBox(CString strCaption, ULONG index) : CXTPPropertyGridItemEnum(strCaption,index) { m_wndCheckBox.m_pItem = this; m_bValue = TRUE; } //---------------------------------------------------------------------------- CCustomItemCheckBox::CCustomItemCheckBox(CString strCaption, BOOL checked) : CXTPPropertyGridItemEnum(strCaption) { m_wndCheckBox.m_pItem = this; m_bValue = checked; } //---------------------------------------------------------------------------- CCustomItemCheckBox::CCustomItemCheckBox(CString strCaption, ULONG index, BOOL checked) : CXTPPropertyGridItemEnum(strCaption,index) { m_wndCheckBox.m_pItem = this; m_bValue = checked; } //---------------------------------------------------------------------------- CCustomItemCheckBox::~CCustomItemCheckBox(){} //---------------------------------------------------------------------------- CRect CCustomItemCheckBox::GetValueRect() { CRect rcValue(CXTPPropertyGridItem::GetValueRect()); rcValue.left += 17; return rcValue; } //---------------------------------------------------------------------------- BOOL CCustomItemCheckBox::OnDrawItemValue(CDC& dc, CRect rcValue) { CRect rcText(rcValue); if (m_wndCheckBox.GetSafeHwnd() == 0 && m_bValue)
{ CRect rcCheck(rcText.left , rcText.top, rcText.left + 13, rcText.bottom -1); dc.DrawFrameControl(rcCheck, DFC_MENU, DFCS_MENUCHECK ); m_CheckBoxRect = rcText; } rcText.left += 17;
dc.DrawText( GetValue(), rcText, DT_SINGLELINE | DT_VCENTER ); return TRUE; } //---------------------------------------------------------------------------- BOOL CCustomItemCheckBox::GetBool() { return m_bValue; } //---------------------------------------------------------------------------- void CCustomItemCheckBox::SetBool(BOOL bValue) { m_bValue = bValue; if (m_wndCheckBox.GetSafeHwnd())
m_wndCheckBox.SetCheck(bValue); } //---------------------------------------------------------------------------- ControlType CCustomItemCheckBox::GetType() { return m_Type; } //---------------------------------------------------------------------------- void CCustomItemCheckBox::SetType(ControlType type) { m_Type = type; } //---------------------------------------------------------------------------- BOOL CCustomItemCheckBox::IsValueChanged() { return !m_bValue; } //---------------------------------------------------------------------------- BOOL CCustomItemCheckBox::OnLButtonDown(UINT nFlags, CPoint point) { //ASSERT(FALSE); POINT pt; pt.x = point.x; pt.y = point.y; m_CheckBoxRect.NormalizeRect();
CRect tempRect = m_CheckBoxRect; tempRect.right = tempRect.left + 17; if (PtInRect(&tempRect/*m_CheckBoxRect*/,pt))
{ //if (m_bValue) // SetBool(FALSE); //else SetBool(TRUE); SetBool(!m_bValue); return CXTPPropertyGridItem::OnLButtonDown(nFlags,point); } } The main fault here is that I cannot create it disabled from construction time. If I will pass 'false' value to the CCustomItemCheckBox(CString strCaption, ULONG index, BOOL checked); constructor, the method
OnDrawItemValue(...) will not draw the check box. Now I just don't know how to overcome it :(
I will be very appreciated for any help.
Thanx in advance!
|
|
![]() |
Post Reply ![]() |
|
Tweet
|
Forum Jump | Forum Permissions ![]() You cannot post new topics in this forum You cannot reply to topics in this forum You cannot delete your posts in this forum You cannot edit your posts in this forum You cannot create polls in this forum You cannot vote in polls in this forum |