typedef struct {
DWORD lStructSize; HWND hwndOwner; HWND hInstance;
COLORREF rgbResult; COLORREF* lpCustColors;
DWORD Flags; LPARAM lCustData;
LPCCHOOKPROC lpfnHook; LPCTSTR lpTemplateName;
} CHOOSECOLOR;
BOOL ChooseColor(LPCHOOSECOLOR lpcc);
UINT_PTR CALLBACK CCHookProc(HWND hdlg, UINT uiMsg, WPARAM wParam, LPARAM lParam);
COLORREF cust[16] = {0};
CHOOSECOLOR cc = {
sizeof(CHOOSECOLOR), m_hwndParent, NULL,
RGB(255,0,0), cust,
CC_RGBINIT | CC_FULLOPEN | CC_ENABLEHOOK | CC_ANYCOLOR,
0, (LPCCHOOKPROC)MyCCHookProc, NULL
};
ChooseColor(&cc); // 返回 TRUE 表示用戶點擊確定
UINT_PTR CALLBACK MyCCHookProc(HWND hdlg, UINT uiMsg, WPARAM wParam, LPARAM lParam) {
static HWND hAlphaEdit; static int alphaPos = 128;
switch (uiMsg) {
case WM_INITDIALOG: {
// 擴大對話框高度
RECT rt; GetWindowRect(hdlg, &rt);
SetWindowPos(hdlg, NULL, 0,0, rt.right-rt.left, rt.bottom-rt.top+20, SWP_NOMOVE);
// 移動確定/取消按鈕
HWND btn = GetDlgItem(hdlg, IDOK);
GetWindowRect(btn, &rt);
POINT pt = {rt.left, rt.top}; ScreenToClient(hdlg, &pt);
pt.x += 250; pt.y += 22;
SetWindowPos(btn, NULL, pt.x, pt.y, 0,0, SWP_NOSIZE);
btn = GetDlgItem(hdlg, IDCANCEL);
GetWindowRect(btn, &rt);
pt = {rt.left, rt.top}; ScreenToClient(hdlg, &pt);
pt.x += 250; pt.y += 22;
SetWindowPos(btn, NULL, pt.x, pt.y, 0,0, SWP_NOSIZE);
// 添加滑塊
pt.x -= 250;
HWND hScroll = CreateWindowEx(0, "ScrollBar", "Alpha",
SBS_HORZ|WS_CHILD|WS_VISIBLE|WS_TABSTOP,
pt.x, pt.y, 160, 20, hdlg, NULL, NULL, NULL);
SetScrollRange(hScroll, SB_CTL, 0, 255, TRUE);
SetScrollPos(hScroll, SB_CTL, 128, FALSE);
// 添加數值顯示編輯框
pt.x += 162;
hAlphaEdit = CreateWindowEx(0, "Edit", "", ES_LEFT|ES_NUMBER|WS_CHILD|WS_VISIBLE|WS_TABSTOP,
pt.x, pt.y, 36, 20, hdlg, NULL, NULL, NULL);
SetWindowText(hAlphaEdit, "128");
// 添加靜態標籤
pt.x -= 162; pt.y -= 22;
CreateWindowEx(0, "STATIC", "透明度(255=不透明)",
WS_CHILD|WS_VISIBLE, pt.x, pt.y, 220, 20, hdlg, NULL, NULL, NULL);
break;
}
case WM_HSCROLL: {
HWND hCtrl = (HWND)lParam;
int newPos = alphaPos;
switch (LOWORD(wParam)) {
case SB_LINEUP: newPos--; break;
case SB_LINEDOWN: newPos++; break;
case SB_PAGEUP: newPos -= 20; break;
case SB_PAGEDOWN: newPos += 20; break;
case SB_THUMBPOSITION:
case SB_THUMBTRACK: newPos = HIWORD(wParam); break;
}
newPos = max(0, min(255, newPos));
if (newPos != alphaPos) {
alphaPos = newPos;
SetScrollPos(hCtrl, SB_CTL, alphaPos, TRUE);
char buf[4]; sprintf(buf, "%d", alphaPos);
SetWindowText(hAlphaEdit, buf);
}
break;
}
}
return 0; // 0 繼續默認處理,非 0 會阻塞
}
static 成員函數static ThisClass* pthis,構造函數賦值 pthis = this,.cpp 中定義 ThisClass* ThisClass::pthis = NULLCodeProject 類似範例:子類化 CColorDialog 添加全選按鈕