📄 fodropcolorbutton.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 + -