⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fodropcolorbutton.cpp

📁 visual c++ 实例编程
💻 CPP
字号:
// Copyright UCanCode Software Technology Inc, All Rights Reserved
// You can contact us.
// Support@UCanCode.net
// http://www.ucancode.net
/********************************************************************/
// FODropColorButton.cpp : implementation file
//

#include "stdafx.h"
#include "FODropColorButton.h"
#include "resource.h"
#include "FOColorDialog.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

void DDX_FODropColorButton(CDataExchange *pDX, int nIDC, COLORREF& crColor)
{
    HWND hWndCtrl = pDX->PrepareCtrl(nIDC);
    ASSERT (hWndCtrl != NULL);                
    
    CFODropColorButton* pColorPicker = (CFODropColorButton*) CWnd::FromHandle(hWndCtrl);
    if (pDX->m_bSaveAndValidate)
    {
        crColor = pColorPicker->GetColor();
    }
    else
    {
        pColorPicker->SetColor(crColor);
    }
}

CFODropColorButton::CFODropColorButton()
{	
    m_bForce = FALSE;
	
	m_pPopupColorPalette = NULL;
	m_bPopup = FALSE;
	m_szPopup = CSize(200,150);
	pNotifyWnd = NULL;
	
}

CFODropColorButton::~CFODropColorButton()
{
	if ( m_pPopupColorPalette->GetSafeHwnd() != NULL )
		delete m_pPopupColorPalette;
}

IMPLEMENT_DYNCREATE(CFODropColorButton, CButton)
BEGIN_MESSAGE_MAP(CFODropColorButton, CButton)
//{{AFX_MSG_MAP(CFODropColorButton)
ON_WM_CREATE()
ON_WM_ERASEBKGND()
ON_WM_PAINT()
ON_CONTROL_REFLECT_EX(BN_CLICKED, OnClicked)
	ON_WM_KEYDOWN()
	ON_WM_GETDLGCODE()
	//}}AFX_MSG_MAP
ON_MESSAGE(WM_FO_SELECTCOLOROK,     OnSelectColorOK)
ON_MESSAGE(WM_FO_SELECTCOLORCANCEL, OnSelectColorCancel)
ON_MESSAGE(WM_FO_SELECTCOLORCUSTOM, OnSelCustom)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CFODropColorButton message handlers

LONG CFODropColorButton::OnSelectColorOK(UINT lParam, LONG /*wParam*/)
{
	COLORREF crNewColor = (COLORREF) lParam;
	m_bForce = FALSE;
	if ( m_bPopup ) 
	{
		SetColor(crNewColor);
		delete m_pPopupColorPalette;
		m_pPopupColorPalette = NULL;
		m_bPopup = FALSE;
	}
	
    if (pNotifyWnd) 
	{
        pNotifyWnd->SendMessage(WM_FO_SELECTCOLOROK, lParam, (WPARAM) GetDlgCtrlID());
    }
	
    if (crNewColor != GetColor()) 
	{
        if (pNotifyWnd) 
		{
			pNotifyWnd->SendMessage(WM_FO_SELECTCOLORCHANGE, lParam, (WPARAM) GetDlgCtrlID());
		}
	}
	Invalidate(FALSE);
    return TRUE;
}

LONG CFODropColorButton::OnSelectColorCancel(UINT lParam, LONG /*wParam*/)
{
    m_bForce = FALSE;
	if ( m_bPopup ) 
	{
		SetColor((COLORREF) lParam);
		delete m_pPopupColorPalette;
		m_pPopupColorPalette = NULL;
		m_bPopup = FALSE;
	}
	
    if (pNotifyWnd) 
	{
        pNotifyWnd->SendMessage(WM_FO_SELECTCOLORCANCEL, lParam, (WPARAM) GetDlgCtrlID());
    }
	Invalidate(FALSE);
    return TRUE;
}

LONG CFODropColorButton::OnSelCustom(UINT lParam, LONG /*wParam*/)
{
	m_bForce = FALSE;
    COLORREF crNewColor = (COLORREF) lParam;
	CFOColorDialog dlg;
	dlg.SetColor(crNewColor);
	COLORREF crOld = GetColor();
	if (dlg.DoModal () == IDOK)
	{
		crNewColor = dlg.GetColor();
		SetColor(crNewColor);
	}
	if ( m_bPopup ) 
	{
		SetColor(crNewColor);
		delete m_pPopupColorPalette;
		m_pPopupColorPalette = NULL;
		m_bPopup = FALSE;
	}
	
	if (pNotifyWnd) 
	{
        pNotifyWnd->SendMessage(WM_FO_SELECTCOLOROK, lParam, (WPARAM) GetDlgCtrlID());
    }

    if (crNewColor != crOld) 
	{
        if (pNotifyWnd) 
		{
			pNotifyWnd->SendMessage(WM_FO_SELECTCOLORCHANGE, lParam, (WPARAM) GetDlgCtrlID());
		}
	}
	Invalidate(FALSE);
	
    return TRUE;
}

int CFODropColorButton::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
    if (CButton::OnCreate(lpCreateStruct) == -1)
        return -1;
    
    AdjustWindowSize();
    return 0;
}

// On mouse click, create and show a AFCColorPopup window for Color selection
BOOL CFODropColorButton::OnClicked()
{
    m_bForce = TRUE;
	CRect r;
	GetWindowRect(&r);
	
	if(m_pPopupColorPalette != NULL)
	{
		delete m_pPopupColorPalette;
		m_pPopupColorPalette = NULL;
	}
	m_pPopupColorPalette = new CFOPopupColorPaletteWnd;	
	
	if ( m_pPopupColorPalette->Create( WS_VISIBLE|WS_POPUP|FO_ALIGNBOTTOMLEFT, r,this,m_crCurColor,m_szPopup)) 
	{
		m_bPopup = TRUE ;
	} 
	else 
	{
		TRACE0("Failed to create Popup Calendar.\n");
	}
	
    return TRUE;
}

BOOL CFODropColorButton::OnEraseBkgnd(CDC* pDC) 
{
	// TODO: Add your message handler code here and/or call default
	pDC;
	return TRUE;
}

//  begin 
void CFODropColorButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
{
	ASSERT(lpDrawItemStruct);
 
    CDC*    pDC     = CDC::FromHandle(lpDrawItemStruct->hDC);
    CRect   rect    = lpDrawItemStruct->rcItem;
    UINT    state   = lpDrawItemStruct->itemState;

    CSize Margins(::GetSystemMetrics(SM_CXEDGE), ::GetSystemMetrics(SM_CYEDGE));

    // Draw Line
    if (m_bForce) 
		state |= ODS_SELECTED;

	BOOL bIn;
	bIn = FALSE;
	if(state & ODS_FOCUS)
		bIn = TRUE;
    pDC->DrawFrameControl(&m_ArrowRect, DFC_SCROLL, DFCS_SCROLLDOWN  | 
                          ((state & ODS_SELECTED) ? DFCS_PUSHED : 0) |
                          ((state & ODS_DISABLED) ? DFCS_INACTIVE : 0));

    pDC->DrawEdge(rect, EDGE_SUNKEN, BF_RECT);

    // Must reduce the size of the "client" area of the button due to edge thickness.
    rect.DeflateRect(Margins.cx, Margins.cy);

    // Fill remaining area with colour
    rect.right -= m_ArrowRect.Width();
	if(!m_bForce && !bIn)
	{
		pDC->FillSolidRect(rect, RGB(255,255,255));
	}
	else
	{
		pDC->FillSolidRect(rect, gfxData.m_crAcCaption);
	}
	//center the Line
    rect.DeflateRect(2, 0);
	pDC->SaveDC();
	
	CRgn rgnClip;
	rgnClip.CreateRectRgn(rect.left, rect.top,
		rect.right, rect.bottom);
	pDC->SelectClipRgn(&rgnClip);

	rect.DeflateRect(2,2,2,2);
	
	if(!m_bForce && !bIn)
	{
		CBrush br (GetColor());
		pDC->FillRect (rect, &br);
		pDC->Draw3dRect(rect,RGB(0,0,0),RGB(0,0,0));
	}
	else
	{
		CBrush br (GetColor());
		pDC->FillRect (rect, &br);
		pDC->Draw3dRect(rect,RGB(255,255,255),RGB(255,255,255));
		pDC->DrawFocusRect(&rect);
	}
	pDC->RestoreDC(-1);
}

/////////////////////////////////////////////////////////////////////////////
// CFODropColorButton overrides

void CFODropColorButton::PreSubclassWindow() 
{
    ModifyStyle(0, BS_OWNERDRAW); 
    CButton::PreSubclassWindow();
    AdjustWindowSize();
}

/////////////////////////////////////////////////////////////////////////////
// CFODropColorButton attributes

COLORREF CFODropColorButton::GetColor()
{ 
    return m_crCurColor; 
}

void CFODropColorButton::SetColor(COLORREF crColor)
{ 
    m_crCurColor = crColor; 
}

/////////////////////////////////////////////////////////////////////////////
// CFODropColorButton implementation

void CFODropColorButton::AdjustWindowSize()
{
	if(pNotifyWnd == NULL)
	{
		pNotifyWnd = GetParent();
	}
    CSize MarginSize(::GetSystemMetrics(SM_CXEDGE), ::GetSystemMetrics(SM_CYEDGE));
    int nLineWidth = max(::GetSystemMetrics(SM_CXHTHUMB), 5*MarginSize.cx);
    int nLineHeight = max(::GetSystemMetrics(SM_CYVTHUMB), 5*MarginSize.cy);
    CSize LineSize(max(nLineWidth, nLineHeight), max(nLineWidth, nLineHeight));

    CRect rect;
    GetWindowRect(rect);

    CWnd* pParent = GetParent();
    if (pParent)
        pParent->ScreenToClient(rect);

    int nWidth = max(rect.Width(), 2*LineSize.cx + 2*MarginSize.cx);
    MoveWindow(rect.left, rect.top, nWidth, LineSize.cy+2*MarginSize.cy, TRUE);

    GetWindowRect(rect);
    ScreenToClient(rect);

    m_ArrowRect.SetRect(rect.right - LineSize.cx - MarginSize.cx, rect.top + MarginSize.cy, rect.right - MarginSize.cx,rect.bottom - MarginSize.cy);

}

void CFODropColorButton::OnPaint() 
{
	CPaintDC dc(this);

	CRect rcClient, rcClip;
	dc.GetClipBox( &rcClip );
	GetClientRect( &rcClient );

	CDC memDC;
	CBitmap bitmap;
	memDC.CreateCompatibleDC(&dc);
	bitmap.CreateCompatibleBitmap(&dc, rcClient.Width(), rcClient.Height());
	CBitmap* pOldBitmap = memDC.SelectObject(&bitmap);
	
	memDC.FillSolidRect( rcClient, gfxData.m_crWindowFrame );
	
	CWnd::DefWindowProc( WM_PAINT, (WPARAM)memDC.m_hDC, 0 );
	
	dc.BitBlt( rcClip.left, rcClip.top, rcClip.Width(), rcClip.Height(), &memDC, 
		rcClip.left, rcClip.top, SRCCOPY );
	
	memDC.SelectObject(pOldBitmap);
	memDC.DeleteDC();
	bitmap.DeleteObject();
}

void CFODropColorButton::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default
	if (nChar == VK_SPACE || nChar == VK_DOWN)
	{
		OnClicked ();
		return;
	}
	CButton::OnKeyDown(nChar, nRepCnt, nFlags);
}

UINT CFODropColorButton::OnGetDlgCode() 
{
	// TODO: Add your message handler code here and/or call default
	return DLGC_BUTTON | DLGC_WANTARROWS;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -