?? util_clr.cpp
字號:
// util_clr.cpp
#include "stdafx.h"
#include "util_clr.h"
#include "util_mdc.h"
#include "util_gdi.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
GColorComboBox::GColorComboBox()
{
m_cl = RGB(0,0,0);
}
GColorComboBox::~GColorComboBox()
{
}
void GColorComboBox::SetColor(COLORREF clInit)
{
m_cl = clInit;
}
COLORREF GColorComboBox::GetColor() const
{
return m_cl;
}
void GColorComboBox::UpdateColor(COLORREF clUpdate)
{
if(clUpdate != m_cl)
{
m_cl = clUpdate;
Invalidate();
int nChildID = GetDlgCtrlID();
WPARAM wParam = MAKEWPARAM((WORD)nChildID, CCN_SELCHANGE);
GetParent()->SendMessage(WM_COMMAND, wParam, (LPARAM)m_hWnd);
}
}
BEGIN_MESSAGE_MAP(GColorComboBox, CWnd)
ON_WM_LBUTTONDOWN()
ON_WM_PAINT()
ON_WM_ERASEBKGND()
END_MESSAGE_MAP()
BOOL GColorComboBox::Create(DWORD dwStyle, const RECT& rect,
CWnd *pParentWnd, UINT nID)
{
return CWnd::Create(NULL, NULL, dwStyle, rect, pParentWnd, nID);
}
void GColorComboBox::OnLButtonDown(UINT nFlags, CPoint pt)
{
CRect cr;
GetClientRect(cr);
cr.right -= CCBDIM_CXEDGE;
cr.left = cr.right - CCBDIM_CXARROW -
CCBDIM_CXBORDER - CCBDIM_CXSPACERIGHT;
cr.top += CCBDIM_CYEDGE;
cr.bottom -= CCBDIM_CYEDGE;
if(cr.PtInRect(pt))
{
CRect wr;
GetWindowRect(wr);
WNDCLASS wndcls;
memset(&wndcls, 0, sizeof(wndcls));
wndcls.lpszClassName = "GPopupColorCtrl";
wndcls.lpfnWndProc = AfxWndProc;
wndcls.hInstance = AfxGetInstanceHandle();
if(AfxRegisterClass(&wndcls))
{
GPopupColorCtrl *pPopup = new GPopupColorCtrl(m_cl, this);
pPopup->CreateEx(0, wndcls.lpszClassName, NULL, WS_BORDER|WS_POPUP,
wr.left, wr.bottom+2, 0, 0, AfxGetMainWnd()->m_hWnd, 0, NULL);
}
}
}
void GColorComboBox::OnPaint()
{
CPaintDC dc(this);
GMemDC memDC;
CBrush brush(GetSysColor(COLOR_BTNFACE));
CRect cr;
GetClientRect(cr);
if(memDC.Create(&dc, cr, &brush))
{
CDC *pDC = &memDC;
CRect rectDraw(cr);
rectDraw.DeflateRect(1,1);
CPen penBlack(PS_SOLID, 1, RGB(0,0,0));
CPen penDarkGray(PS_SOLID, 1, GetSysColor(COLOR_BTNSHADOW));
CPen penWhite(PS_SOLID, 1, RGB(255,255,255));
CPen penGray(PS_SOLID, 1, GetSysColor(COLOR_BTNFACE));
// draw the borders
CPen *pOldPen = pDC->SelectObject(&penGray);
pDC->MoveTo(rectDraw.left, rectDraw.top);
pDC->LineTo(rectDraw.right, rectDraw.top);
pDC->MoveTo(rectDraw.left, rectDraw.top);
pDC->LineTo(rectDraw.left, rectDraw.bottom);
pDC->SelectObject(&penWhite);
rectDraw.DeflateRect(1, 1);
pDC->MoveTo(rectDraw.left, rectDraw.top);
pDC->LineTo(rectDraw.right, rectDraw.top);
pDC->MoveTo(rectDraw.left, rectDraw.top);
pDC->LineTo(rectDraw.left, rectDraw.bottom);
pDC->SelectObject(&penBlack);
rectDraw.InflateRect(1, 1);
pDC->MoveTo(rectDraw.right, rectDraw.top);
pDC->LineTo(rectDraw.right, rectDraw.bottom+1);
pDC->MoveTo(rectDraw.left, rectDraw.bottom);
pDC->LineTo(rectDraw.right, rectDraw.bottom);
pDC->SelectObject(&penDarkGray);
rectDraw.DeflateRect(1, 1);
pDC->MoveTo(rectDraw.right, rectDraw.top);
pDC->LineTo(rectDraw.right, rectDraw.bottom+1);
pDC->MoveTo(rectDraw.left, rectDraw.bottom);
pDC->LineTo(rectDraw.right, rectDraw.bottom);
// draw arrow
pDC->SelectObject(&penBlack);
int nEnd = rectDraw.right - CCBDIM_CXEDGE -
CCBDIM_CXBORDER;
int nStart = nEnd - CCBDIM_CXARROW;
int nMiddle = cr.top + (cr.Height()/2);
pDC->MoveTo(nStart, nMiddle-1);
pDC->LineTo(nEnd, nMiddle-1);
nStart++;
nEnd--;
pDC->MoveTo(nStart, nMiddle);
pDC->LineTo(nEnd, nMiddle);
nStart++;
nEnd--;
pDC->MoveTo(nStart, nMiddle+1);
pDC->LineTo(nEnd, nMiddle+1);
// draw dividers
nEnd = rectDraw.right - CCBDIM_CXEDGE -
CCBDIM_CXBORDER - CCBDIM_CXARROW -
CCBDIM_CXSPACERIGHT - 1;
pDC->SelectObject(&penWhite);
int nTop = cr.top + CCBDIM_CYEDGE + CCBDIM_CYBORDER;
int nBottom = (cr.bottom - CCBDIM_CYEDGE) - CCBDIM_CYBORDER;
pDC->MoveTo(nEnd, nTop);
pDC->LineTo(nEnd, nBottom);
pDC->SelectObject(&penDarkGray);
nEnd--;
pDC->MoveTo(nEnd, nTop);
pDC->LineTo(nEnd, nBottom);
// draw color rectangle
nEnd -= CCBDIM_CXSPACELEFT;
CRect rectColor(cr);
rectColor.DeflateRect(1,1);
rectColor.right = nEnd;
rectColor.left += cr.left + CCBDIM_CXEDGE + CCBDIM_CXBORDER;
rectColor.top = nTop;
rectColor.bottom = nBottom;
pDC->SelectObject(&penBlack);
CBrush brush(m_cl);
CBrush *pOldBrush = pDC->SelectObject(&brush);
pDC->Rectangle(rectColor);
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldBrush);
memDC.Copy(&dc, cr);
memDC.Release();
}
}
BOOL GColorComboBox::OnEraseBkgnd(CDC *pDC)
{
return TRUE;
}
///////////////////////////////////////////////////
// GPopupColorCtrl
COLORREF g_clArray[] = {RGB(0,0,255), RGB(0,255,0),
RGB(0,255,255), RGB(255,0,0),
RGB(255,0,255), RGB(255,255,0),
RGB(255,255,255), RGB(0,0,0),
RGB(0,0,127), RGB(0,127,0),
RGB(0,127,127), RGB(127,0,0),
RGB(127,0,127), RGB(127,127,0),
RGB(127,127,127), RGB(63,63,63)};
GPopupColorCtrl::GPopupColorCtrl(COLORREF clInit,
GColorComboBox *pBuddyCombo)
{
m_pBuddyCombo = pBuddyCombo;
m_nActiveSquare = 0;
m_nCurHoverSquare = 0;
for(int nColor = 0; nColor < CCDIM_TOTALINDECES; nColor++)
{
if(g_clArray[nColor] == clInit)
{
m_nActiveSquare = nColor;
m_nCurHoverSquare = nColor;
break;
}
}
m_clSelected = g_clArray[m_nActiveSquare];
}
GPopupColorCtrl::~GPopupColorCtrl()
{
}
int GPopupColorCtrl::CursorToColorIndex(CPoint ptTest)
{
CPoint pt(CCDIM_CXSPACE, CCDIM_CYSPACE);
int nIndex = 0;
for(int nRow = 0; nRow < 4; nRow++)
{
for(int nCol = 0; nCol < 4; nCol++)
{
CRect rectSquare(pt, CSize(CCDIM_SQUAREWIDTH, CCDIM_SQUAREHEIGHT));
if(rectSquare.PtInRect(ptTest))
return nIndex;
pt.x += (CCDIM_SQUAREWIDTH + CCDIM_CXSPACE);
nIndex++;
}
pt.x = CCDIM_CXSPACE;
pt.y += (CCDIM_SQUAREHEIGHT + CCDIM_CYSPACE);
}
return -1;
}
void GPopupColorCtrl::DrawColorSquare(CDC *pDC, int nIndex, CPoint pt)
{
CRect rectDraw(pt, CSize(CCDIM_SQUAREWIDTH, CCDIM_SQUAREHEIGHT));
_3DPENS pens;
int nThickness = GfxDraw3DBorder(pDC, &pens, rectDraw);
rectDraw.DeflateRect(nThickness, nThickness);
CBrush brush(g_clArray[nIndex]);
pDC->FillRect(rectDraw, &brush);
if(nIndex == m_nCurHoverSquare)
{
rectDraw.InflateRect(1, 1);
GfxDrawBorder(pDC, rectDraw, pens.pPenWhite);
rectDraw.DeflateRect(1,1);
GfxDrawBorder(pDC, rectDraw, pens.pPenBlack);
}
}
BEGIN_MESSAGE_MAP(GPopupColorCtrl, GPopupWindow)
ON_WM_CREATE()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONUP()
ON_WM_PAINT()
ON_WM_ERASEBKGND()
END_MESSAGE_MAP()
int GPopupColorCtrl::OnCreate(LPCREATESTRUCT lpcs)
{
int nCreate = GPopupWindow::OnCreate(lpcs);
if(nCreate == 0)
{
int cx = CCDIM_CXSPACE * 5;
cx += GetSystemMetrics(SM_CXBORDER) * 2;
cx += (CCDIM_SQUAREWIDTH * 4);
int cy = CCDIM_CYSPACE * 5;
cy += GetSystemMetrics(SM_CYBORDER) * 2;
cy += (CCDIM_SQUAREHEIGHT * 4);
SetWindowPos(&wndTopMost, 0, 0, cx, cy,
SWP_NOMOVE|SWP_NOZORDER|SWP_SHOWWINDOW|SWP_NOACTIVATE);
}
return nCreate;
}
void GPopupColorCtrl::OnPaint()
{
CPaintDC dc(this);
GMemDC memDC;
CBrush brush(GetSysColor(COLOR_BTNFACE));
CRect cr;
GetClientRect(cr);
if(memDC.Create(&dc, cr, &brush))
{
CPoint pt(CCDIM_CXSPACE, CCDIM_CYSPACE);
int nIndex = 0;
for(int nRow = 0; nRow < 4; nRow++)
{
for(int nCol = 0; nCol < 4; nCol++)
{
DrawColorSquare(&memDC, nIndex, pt);
pt.x += (CCDIM_SQUAREWIDTH + CCDIM_CXSPACE);
nIndex++;
}
pt.x = CCDIM_CXSPACE;
pt.y += (CCDIM_SQUAREHEIGHT + CCDIM_CYSPACE);
}
memDC.Copy(&dc, cr);
memDC.Release();
}
}
BOOL GPopupColorCtrl::OnEraseBkgnd(CDC *pDC)
{
return TRUE;
}
void GPopupColorCtrl::OnMouseMove(UINT nFlags, CPoint pt)
{
int nIndex = CursorToColorIndex(pt);
if(nIndex != -1 && nIndex != m_nCurHoverSquare)
{
m_nCurHoverSquare = nIndex;
Invalidate();
}
}
void GPopupColorCtrl::OnLButtonUp(UINT nFlags, CPoint pt)
{
if(!OnLButtonDownCheck(nFlags, pt))
{
int nIndex = CursorToColorIndex(pt);
// find out what color mouse is over
if(nIndex != -1)
{
if(m_pBuddyCombo)
m_pBuddyCombo->UpdateColor(g_clArray[nIndex]);
m_nActiveSquare = nIndex;
::ReleaseCapture();
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -