📄 colordlg.c
字号:
/* Set the initial values of the color chooser dialog */
r = GetRValue(lpp->lpcc->rgbResult);
g = GetGValue(lpp->lpcc->rgbResult);
b = GetBValue(lpp->lpcc->rgbResult);
CC_PaintSelectedColor(hDlg, lpp->lpcc->rgbResult);
lpp->h = CC_RGBtoHSL('H', r, g, b);
lpp->s = CC_RGBtoHSL('S', r, g, b);
lpp->l = CC_RGBtoHSL('L', r, g, b);
/* Doing it the long way because CC_EditSetRGB/HSL doesn't seem to work */
SetDlgItemInt(hDlg, 703, lpp->h, TRUE);
SetDlgItemInt(hDlg, 704, lpp->s, TRUE);
SetDlgItemInt(hDlg, 705, lpp->l, TRUE);
SetDlgItemInt(hDlg, 706, r, TRUE);
SetDlgItemInt(hDlg, 707, g, TRUE);
SetDlgItemInt(hDlg, 708, b, TRUE);
CC_PaintCross(hDlg, lpp->h, lpp->s);
CC_PaintTriangle(hDlg, lpp->l);
return res;
}
/***********************************************************************
* CC_WMCommand [internal]
*/
LRESULT CC_WMCommand( HWND hDlg, WPARAM wParam, LPARAM lParam, WORD notifyCode, HWND hwndCtl )
{
int r, g, b, i, xx;
UINT cokmsg;
HDC hdc;
COLORREF *cr;
LPCCPRIV lpp = (LPCCPRIV) GetPropW( hDlg, szColourDialogProp );
TRACE("CC_WMCommand wParam=%lx lParam=%lx\n", wParam, lParam);
switch (LOWORD(wParam))
{
case 0x2c2: /* edit notify RGB */
case 0x2c3:
case 0x2c4:
if (notifyCode == EN_UPDATE && !lpp->updating)
{
i = CC_CheckDigitsInEdit(hwndCtl, 255);
r = GetRValue(lpp->lpcc->rgbResult);
g = GetGValue(lpp->lpcc->rgbResult);
b= GetBValue(lpp->lpcc->rgbResult);
xx = 0;
switch (LOWORD(wParam))
{
case 0x2c2: if ((xx = (i != r))) r = i; break;
case 0x2c3: if ((xx = (i != g))) g = i; break;
case 0x2c4: if ((xx = (i != b))) b = i; break;
}
if (xx) /* something has changed */
{
lpp->lpcc->rgbResult = RGB(r, g, b);
CC_PaintSelectedColor(hDlg, lpp->lpcc->rgbResult);
lpp->h = CC_RGBtoHSL('H', r, g, b);
lpp->s = CC_RGBtoHSL('S', r, g, b);
lpp->l = CC_RGBtoHSL('L', r, g, b);
CC_EditSetHSL(hDlg, lpp->h, lpp->s, lpp->l);
CC_PaintCross(hDlg, lpp->h, lpp->s);
CC_PaintTriangle(hDlg, lpp->l);
}
}
break;
case 0x2bf: /* edit notify HSL */
case 0x2c0:
case 0x2c1:
if (notifyCode == EN_UPDATE && !lpp->updating)
{
i = CC_CheckDigitsInEdit(hwndCtl , LOWORD(wParam) == 0x2bf ? 239:240);
xx = 0;
switch (LOWORD(wParam))
{
case 0x2bf: if ((xx = ( i != lpp->h))) lpp->h = i; break;
case 0x2c0: if ((xx = ( i != lpp->s))) lpp->s = i; break;
case 0x2c1: if ((xx = ( i != lpp->l))) lpp->l = i; break;
}
if (xx) /* something has changed */
{
r = CC_HSLtoRGB('R', lpp->h, lpp->s, lpp->l);
g = CC_HSLtoRGB('G', lpp->h, lpp->s, lpp->l);
b = CC_HSLtoRGB('B', lpp->h, lpp->s, lpp->l);
lpp->lpcc->rgbResult = RGB(r, g, b);
CC_PaintSelectedColor(hDlg, lpp->lpcc->rgbResult);
CC_EditSetRGB(hDlg, lpp->lpcc->rgbResult);
CC_PaintCross(hDlg, lpp->h, lpp->s);
CC_PaintTriangle(hDlg, lpp->l);
}
}
break;
case 0x2cf:
CC_SwitchToFullSize(hDlg, lpp->lpcc->rgbResult, &lpp->fullsize);
SetFocus( GetDlgItem(hDlg, 0x2bf));
break;
case 0x2c8: /* add colors ... column by column */
cr = lpp->lpcc->lpCustColors;
cr[(lpp->nextuserdef % 2) * 8 + lpp->nextuserdef / 2] = lpp->lpcc->rgbResult;
if (++lpp->nextuserdef == 16)
lpp->nextuserdef = 0;
CC_PaintUserColorArray(hDlg, 2, 8, lpp->lpcc->lpCustColors);
break;
case 0x2c9: /* resulting color */
hdc = GetDC(hDlg);
lpp->lpcc->rgbResult = GetNearestColor(hdc, lpp->lpcc->rgbResult);
ReleaseDC(hDlg, hdc);
CC_EditSetRGB(hDlg, lpp->lpcc->rgbResult);
CC_PaintSelectedColor(hDlg, lpp->lpcc->rgbResult);
r = GetRValue(lpp->lpcc->rgbResult);
g = GetGValue(lpp->lpcc->rgbResult);
b = GetBValue(lpp->lpcc->rgbResult);
lpp->h = CC_RGBtoHSL('H', r, g, b);
lpp->s = CC_RGBtoHSL('S', r, g, b);
lpp->l = CC_RGBtoHSL('L', r, g, b);
CC_EditSetHSL(hDlg, lpp->h, lpp->s, lpp->l);
CC_PaintCross(hDlg, lpp->h, lpp->s);
CC_PaintTriangle(hDlg, lpp->l);
break;
case 0x40e: /* Help! */ /* The Beatles, 1965 ;-) */
i = RegisterWindowMessageA(HELPMSGSTRINGA);
if (lpp->lpcc->hwndOwner)
SendMessageA(lpp->lpcc->hwndOwner, i, 0, (LPARAM)lpp->lpcc);
if ( CC_HookCallChk(lpp->lpcc))
CallWindowProcA( (WNDPROC) lpp->lpcc->lpfnHook, hDlg,
WM_COMMAND, psh15, (LPARAM)lpp->lpcc);
break;
case IDOK :
cokmsg = RegisterWindowMessageA(COLOROKSTRINGA);
if (lpp->lpcc->hwndOwner)
if (SendMessageA(lpp->lpcc->hwndOwner, cokmsg, 0, (LPARAM)lpp->lpcc))
break; /* do NOT close */
EndDialog(hDlg, 1) ;
return TRUE ;
case IDCANCEL :
EndDialog(hDlg, 0) ;
return TRUE ;
}
return FALSE;
}
/***********************************************************************
* CC_WMPaint [internal]
*/
LRESULT CC_WMPaint( HWND hDlg, WPARAM wParam, LPARAM lParam )
{
PAINTSTRUCT ps;
LPCCPRIV lpp = (LPCCPRIV) GetPropW( hDlg, szColourDialogProp );
BeginPaint(hDlg, &ps);
/* we have to paint dialog children except text and buttons */
CC_PaintPredefColorArray(hDlg, 6, 8);
CC_PaintUserColorArray(hDlg, 2, 8, lpp->lpcc->lpCustColors);
CC_PaintLumBar(hDlg, lpp->h, lpp->s);
CC_PaintCross(hDlg, lpp->h, lpp->s);
CC_PaintTriangle(hDlg, lpp->l);
CC_PaintSelectedColor(hDlg, lpp->lpcc->rgbResult);
CC_PaintColorGraph(hDlg);
EndPaint(hDlg, &ps);
return TRUE;
}
/***********************************************************************
* CC_WMLButtonUp [internal]
*/
LRESULT CC_WMLButtonUp( HWND hDlg, WPARAM wParam, LPARAM lParam )
{
LPCCPRIV lpp = (LPCCPRIV) GetPropW( hDlg, szColourDialogProp );
if (lpp->capturedGraph)
{
lpp->capturedGraph = 0;
ReleaseCapture();
CC_PaintCross(hDlg, lpp->h, lpp->s);
return 1;
}
return 0;
}
/***********************************************************************
* CC_WMMouseMove [internal]
*/
LRESULT CC_WMMouseMove( HWND hDlg, LPARAM lParam )
{
LPCCPRIV lpp = (LPCCPRIV) GetPropW( hDlg, szColourDialogProp );
int r, g, b;
if (lpp->capturedGraph)
{
int *ptrh = NULL, *ptrs = &lpp->l;
if (lpp->capturedGraph == 0x2c6)
{
ptrh = &lpp->h;
ptrs = &lpp->s;
}
if (CC_MouseCheckColorGraph( hDlg, lpp->capturedGraph, ptrh, ptrs, lParam))
{
r = CC_HSLtoRGB('R', lpp->h, lpp->s, lpp->l);
g = CC_HSLtoRGB('G', lpp->h, lpp->s, lpp->l);
b = CC_HSLtoRGB('B', lpp->h, lpp->s, lpp->l);
lpp->lpcc->rgbResult = RGB(r, g, b);
CC_EditSetRGB(hDlg, lpp->lpcc->rgbResult);
CC_EditSetHSL(hDlg,lpp->h, lpp->s, lpp->l);
CC_PaintCross(hDlg, lpp->h, lpp->s);
CC_PaintTriangle(hDlg, lpp->l);
CC_PaintSelectedColor(hDlg, lpp->lpcc->rgbResult);
}
else
{
ReleaseCapture();
lpp->capturedGraph = 0;
}
return 1;
}
return 0;
}
/***********************************************************************
* CC_WMLButtonDown [internal]
*/
LRESULT CC_WMLButtonDown( HWND hDlg, WPARAM wParam, LPARAM lParam )
{
LPCCPRIV lpp = (LPCCPRIV) GetPropW( hDlg, szColourDialogProp );
int r, g, b, i;
i = 0;
if (CC_MouseCheckPredefColorArray(lpp, hDlg, 0x2d0, 6, 8, lParam))
i = 1;
else
if (CC_MouseCheckUserColorArray(lpp, hDlg, 0x2d1, 2, 8, lParam))
i = 1;
else
if (CC_MouseCheckColorGraph(hDlg, 0x2c6, &lpp->h, &lpp->s, lParam))
{
i = 2;
lpp->capturedGraph = 0x2c6;
}
else
if (CC_MouseCheckColorGraph(hDlg, 0x2be, NULL, &lpp->l, lParam))
{
i = 2;
lpp->capturedGraph = 0x2be;
}
if ( i == 2 )
{
SetCapture(hDlg);
r = CC_HSLtoRGB('R', lpp->h, lpp->s, lpp->l);
g = CC_HSLtoRGB('G', lpp->h, lpp->s, lpp->l);
b = CC_HSLtoRGB('B', lpp->h, lpp->s, lpp->l);
lpp->lpcc->rgbResult = RGB(r, g, b);
}
if ( i == 1 )
{
r = GetRValue(lpp->lpcc->rgbResult);
g = GetGValue(lpp->lpcc->rgbResult);
b = GetBValue(lpp->lpcc->rgbResult);
lpp->h = CC_RGBtoHSL('H', r, g, b);
lpp->s = CC_RGBtoHSL('S', r, g, b);
lpp->l = CC_RGBtoHSL('L', r, g, b);
}
if (i)
{
CC_EditSetRGB(hDlg, lpp->lpcc->rgbResult);
CC_EditSetHSL(hDlg,lpp->h, lpp->s, lpp->l);
CC_PaintCross(hDlg, lpp->h, lpp->s);
CC_PaintTriangle(hDlg, lpp->l);
CC_PaintSelectedColor(hDlg, lpp->lpcc->rgbResult);
return TRUE;
}
return FALSE;
}
/***********************************************************************
* ColorDlgProc32 [internal]
*
*/
static INT_PTR CALLBACK ColorDlgProc( HWND hDlg, UINT message,
WPARAM wParam, LPARAM lParam )
{
int res;
LPCCPRIV lpp = (LPCCPRIV) GetPropW( hDlg, szColourDialogProp );
if (message != WM_INITDIALOG)
{
if (!lpp)
return FALSE;
res = 0;
if (CC_HookCallChk(lpp->lpcc))
res = CallWindowProcA( (WNDPROC)lpp->lpcc->lpfnHook, hDlg, message, wParam, lParam);
if ( res )
return res;
}
/* FIXME: SetRGB message
if (message && message == msetrgb)
return HandleSetRGB(hDlg, lParam);
*/
switch (message)
{
case WM_INITDIALOG:
return CC_WMInitDialog(hDlg, wParam, lParam);
case WM_NCDESTROY:
DeleteDC(lpp->hdcMem);
DeleteObject(lpp->hbmMem);
HeapFree(GetProcessHeap(), 0, lpp);
RemovePropW( hDlg, szColourDialogProp );
break;
case WM_COMMAND:
if (CC_WMCommand( hDlg, wParam, lParam, HIWORD(wParam), (HWND) lParam))
return TRUE;
break;
case WM_PAINT:
if ( CC_WMPaint(hDlg, wParam, lParam))
return TRUE;
break;
case WM_LBUTTONDBLCLK:
if (CC_MouseCheckResultWindow(hDlg, lParam))
return TRUE;
break;
case WM_MOUSEMOVE:
if (CC_WMMouseMove(hDlg, lParam))
return TRUE;
break;
case WM_LBUTTONUP: /* FIXME: ClipCursor off (if in color graph)*/
if (CC_WMLButtonUp(hDlg, wParam, lParam))
return TRUE;
break;
case WM_LBUTTONDOWN:/* FIXME: ClipCursor on (if in color graph)*/
if (CC_WMLButtonDown(hDlg, wParam, lParam))
return TRUE;
break;
}
return FALSE ;
}
/***********************************************************************
* ChooseColorW (COMDLG32.@)
*
* Create a color dialog box.
*
* PARAMS
* lpChCol [I/O] in: information to initialize the dialog box.
* out: User's color selection
*
* RETURNS
* TRUE: Ok button clicked.
* FALSE: Cancel button clicked, or error.
*/
BOOL WINAPI ChooseColorW( LPCHOOSECOLORW lpChCol )
{
HANDLE hDlgTmpl = 0;
BOOL bRet = FALSE;
LPCVOID template;
TRACE("ChooseColor\n");
if (!lpChCol) return FALSE;
if (lpChCol->Flags & CC_ENABLETEMPLATEHANDLE)
{
if (!(template = LockResource(lpChCol->hInstance)))
{
COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE);
return FALSE;
}
}
else if (lpChCol->Flags & CC_ENABLETEMPLATE)
{
HRSRC hResInfo;
if (!(hResInfo = FindResourceW((HINSTANCE)lpChCol->hInstance,
lpChCol->lpTemplateName,
(LPWSTR)RT_DIALOG)))
{
COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE);
return FALSE;
}
if (!(hDlgTmpl = LoadResource((HINSTANCE)lpChCol->hInstance, hResInfo)) ||
!(template = LockResource(hDlgTmpl)))
{
COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE);
return FALSE;
}
}
else
{
HRSRC hResInfo;
HGLOBAL hDlgTmpl;
static const WCHAR wszCHOOSE_COLOR[] = {'C','H','O','O','S','E','_','C','O','L','O','R',0};
if (!(hResInfo = FindResourceW(COMDLG32_hInstance, wszCHOOSE_COLOR, (LPWSTR)RT_DIALOG)))
{
COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE);
return FALSE;
}
if (!(hDlgTmpl = LoadResource(COMDLG32_hInstance, hResInfo )) ||
!(template = LockResource(hDlgTmpl)))
{
COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE);
return FALSE;
}
}
bRet = DialogBoxIndirectParamW(COMDLG32_hInstance, template, lpChCol->hwndOwner,
ColorDlgProc, (LPARAM)lpChCol);
return bRet;
}
/***********************************************************************
* ChooseColorA (COMDLG32.@)
*
* See ChooseColorW.
*/
BOOL WINAPI ChooseColorA( LPCHOOSECOLORA lpChCol )
{
LPWSTR template_name = NULL;
BOOL ret;
LPCHOOSECOLORW lpcc = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CHOOSECOLORW));
lpcc->lStructSize = sizeof(*lpcc);
lpcc->hwndOwner = lpChCol->hwndOwner;
lpcc->hInstance = lpChCol->hInstance;
lpcc->rgbResult = lpChCol->rgbResult;
lpcc->lpCustColors = lpChCol->lpCustColors;
lpcc->Flags = lpChCol->Flags;
lpcc->lCustData = lpChCol->lCustData;
lpcc->lpfnHook = (LPCCHOOKPROC) lpChCol->lpfnHook;
if ((lpcc->Flags & CC_ENABLETEMPLATE) && (lpChCol->lpTemplateName)) {
if (HIWORD(lpChCol->lpTemplateName)) {
INT len = MultiByteToWideChar( CP_ACP, 0, lpChCol->lpTemplateName, -1, NULL, 0);
template_name = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) );
MultiByteToWideChar( CP_ACP, 0, lpChCol->lpTemplateName, -1, template_name, len );
lpcc->lpTemplateName = template_name;
} else {
lpcc->lpTemplateName = (LPCWSTR)lpChCol->lpTemplateName;
}
}
ret = ChooseColorW(lpcc);
if (ret)
lpChCol->rgbResult = lpcc->rgbResult;
HeapFree(GetProcessHeap(), 0, template_name);
HeapFree(GetProcessHeap(), 0, lpcc);
return ret;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -