www.gusucode.com > 一款C++开源代码编辑器Notepad源代码-源码程序 > 一款C++开源代码编辑器Notepad源代码-源码程序\code\PowerEditor\src\WinControls\ColourPicker\ColourPopup.cpp
//Download by http://www.NewXing.com /* this file is part of notepad++ Copyright (C)2003 Don HO < donho@altern.org > This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "ColourPopup.h" #include "SysMsg.h" DWORD colourItems[] = { RGB( 0, 0, 0), RGB( 64, 0, 0), RGB(128, 0, 0), RGB(128, 64, 64), RGB(255, 0, 0), RGB(255, 128, 128), RGB(255, 255, 128), RGB(255, 255, 0), RGB(255, 128, 64), RGB(255, 128, 0), RGB(128, 64, 0), RGB(128, 128, 0), RGB(128, 128, 64), RGB( 0, 64, 0), RGB( 0, 128, 0), RGB( 0, 255, 0), RGB(128, 255, 0), RGB(128, 255, 128), RGB( 0, 255, 128), RGB( 0, 255, 64), RGB( 0, 128, 128), RGB( 0, 128, 64), RGB( 0, 64, 64), RGB(128, 128, 128), RGB( 64, 128, 128), RGB( 0, 0, 128), RGB( 0, 0, 255), RGB( 0, 64, 128), RGB( 0, 255, 255), RGB(128, 255, 255), RGB( 0, 128, 255), RGB( 0, 128, 192), RGB(128, 128, 255), RGB( 0, 0, 160), RGB( 0, 0, 64), RGB(192, 192, 192), RGB( 64, 0, 64), RGB( 64, 0, 64), RGB(128, 0, 128), RGB(128, 0, 64), RGB(128, 128, 192), RGB(255, 128, 192), RGB(255, 128, 255), RGB(255, 0, 255), RGB(255, 0, 128), RGB(128, 0, 255), RGB( 64, 0, 128), RGB(255, 255, 255), }; void ColourPopup::create(int dialogID) { _hSelf = ::CreateDialogParam(_hInst, MAKEINTRESOURCE(dialogID), _hParent, (DLGPROC)dlgProc, (LPARAM)this); if (!_hSelf) { systemMessage("ColourPopup"); throw int(696); } Window::getClientRect(_rc); display(); } BOOL CALLBACK ColourPopup::dlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_MEASUREITEM: { RECT rc; LPMEASUREITEMSTRUCT lpmis = (LPMEASUREITEMSTRUCT) lParam; ::GetWindowRect(::GetDlgItem(hwnd, lpmis->CtlID), &rc); lpmis->itemHeight = (rc.bottom-rc.top)/6; lpmis->itemWidth = (rc.right-rc.left)/8; return TRUE; } case WM_INITDIALOG : { ColourPopup *pColourPopup = (ColourPopup *)(lParam); pColourPopup->_hSelf = hwnd; ::SetWindowLong(hwnd, GWL_USERDATA, (long)lParam); pColourPopup->run_dlgProc(message, wParam, lParam); return TRUE; } default : { ColourPopup *pColourPopup = reinterpret_cast<ColourPopup *>(::GetWindowLong(hwnd, GWL_USERDATA)); if (!pColourPopup) return FALSE; return pColourPopup->run_dlgProc(message, wParam, lParam); } } } BOOL CALLBACK ColourPopup::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_INITDIALOG: { int nColor; for (nColor = 0 ; nColor < int(sizeof(colourItems)/sizeof(DWORD)) ; nColor++) { ::SendDlgItemMessage(_hSelf, IDC_COLOUR_LIST, LB_ADDSTRING, nColor, (LPARAM) ""); ::SendDlgItemMessage(_hSelf, IDC_COLOUR_LIST, LB_SETITEMDATA , nColor, (LPARAM) colourItems[nColor]); //if (g_bgColor == colourItems[nColor]) //::SendDlgItemMessage(_hSelf, IDC_COLOUR_LIST, LB_SETCURSEL, nColor, 0); } //::SetCapture(_hSelf); return TRUE; } case WM_CTLCOLORLISTBOX: return (LRESULT) CreateSolidBrush(GetSysColor(COLOR_3DFACE)); case WM_DRAWITEM: { HDC hdc; COLORREF cr; HBRUSH hbrush; DRAWITEMSTRUCT *pdis = (DRAWITEMSTRUCT *)lParam; hdc = pdis->hDC; RECT rc = pdis->rcItem; // Transparent. SetBkMode(hdc,TRANSPARENT); // NULL object if (pdis->itemID == UINT(-1)) return 0; switch (pdis->itemAction) { case ODA_DRAWENTIRE: switch (pdis->CtlID) { case IDC_COLOUR_LIST: rc = pdis->rcItem; cr = (COLORREF) pdis->itemData; InflateRect(&rc, -3, -3); hbrush = CreateSolidBrush((COLORREF)cr); FillRect(hdc, &rc, hbrush); DeleteObject(hbrush); FrameRect(hdc, &rc, (HBRUSH) GetStockObject(GRAY_BRUSH)); break; } // *** FALL THROUGH *** case ODA_SELECT: rc = pdis->rcItem; if (pdis->itemState & ODS_SELECTED) { rc.bottom --; rc.right --; // Draw the lighted side. HPEN hpen = CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNSHADOW)); HPEN holdPen = (HPEN)SelectObject(hdc, hpen); MoveToEx(hdc, rc.left, rc.bottom, NULL); LineTo(hdc, rc.left, rc.top); LineTo(hdc, rc.right, rc.top); SelectObject(hdc, holdPen); DeleteObject(hpen); // Draw the darkened side. hpen = CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNHIGHLIGHT)); holdPen = (HPEN)SelectObject(hdc, hpen); LineTo(hdc, rc.right, rc.bottom); LineTo(hdc, rc.left, rc.bottom); SelectObject(hdc, holdPen); DeleteObject(hpen); } else { hbrush = CreateSolidBrush(GetSysColor(COLOR_3DFACE)); FrameRect(hdc, &rc, hbrush); DeleteObject(hbrush); } break; case ODA_FOCUS: rc = pdis->rcItem; InflateRect(&rc, -2, -2); DrawFocusRect(hdc, &rc); break; default: break; } return TRUE; } case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK : { isColourChooserLaunched = true; CHOOSECOLOR cc; // common dialog box structure static COLORREF acrCustClr[16] = { RGB(0xFF,0xFF,0xFF),RGB(0xFF,0xFF,0xFF),RGB(0xFF,0xFF,0xFF),RGB(0xFF,0xFF,0xFF),\ RGB(0xFF,0xFF,0xFF),RGB(0xFF,0xFF,0xFF),RGB(0xFF,0xFF,0xFF),RGB(0xFF,0xFF,0xFF),\ RGB(0xFF,0xFF,0xFF),RGB(0xFF,0xFF,0xFF),RGB(0xFF,0xFF,0xFF),RGB(0xFF,0xFF,0xFF),\ RGB(0xFF,0xFF,0xFF),RGB(0xFF,0xFF,0xFF),RGB(0xFF,0xFF,0xFF),RGB(0xFF,0xFF,0xFF),\ }; // array of custom colors // Initialize CHOOSECOLOR ::ZeroMemory(&cc, sizeof(cc)); cc.lStructSize = sizeof(cc); cc.hwndOwner = _hParent; cc.lpCustColors = (LPDWORD) acrCustClr; cc.Flags = CC_FULLOPEN | CC_RGBINIT; display(false); if (ChooseColor(&cc)==TRUE) { ::SendMessage(_hParent, WM_PICKUP_COLOR, cc.rgbResult, 0); } else { ::SendMessage(_hParent, WM_PICKUP_CANCEL, 0, 0); } return TRUE; } case IDC_COLOUR_LIST : { if (HIWORD(wParam) == LBN_SELCHANGE) { int i = ::SendMessage((HWND)lParam, LB_GETCURSEL, 0L, 0L); _colour = ::SendMessage((HWND)lParam, LB_GETITEMDATA, i, 0L); ::SendMessage(_hParent, WM_PICKUP_COLOR, _colour, 0); return TRUE; } } default : return FALSE; } case WM_ACTIVATE : { if (LOWORD(wParam) == WA_INACTIVE) if (!isColourChooserLaunched) ::SendMessage(_hParent, WM_PICKUP_CANCEL, 0, 0); return TRUE; } } return FALSE; }