首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

擴展顏色對話框:添加 Alpha 透明度滑塊

     編輯:關於VC++

CHOOSECOLOR 結構與 API

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);

完整實現步驟

1. 初始化結構體

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 表示用戶點擊確定

2. 鉤子函數:WM_INITDIALOG 動態添加控件

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 = NULL

參考資源

CodeProject 類似範例:子類化 CColorDialog 添加全選按鈕

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved