龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

C++实现仿Office风格的颜色选取框代码(3)

时间:2009-12-22 15:42来源:未知 作者:admin 点击:
分享到:
//显示窗体,进入消息循环 ShowWindow(m_hwnd, SW_SHOW); UpdateWindow(m_hwnd); SetCapture(m_hwnd); MSG msg; while (GetMessage (msg); DispatchMessage( } } HWND CColorPicker::GetHwnd() ...{retur

    //显示窗体,进入消息循环

    ShowWindow(m_hwnd, SW_SHOW);

    UpdateWindow(m_hwnd);

    SetCapture(m_hwnd);

    MSG msg;

    while (GetMessage (&msg, NULL, 0,0))

    {

        TranslateMessage(&msg);

        DispatchMessage(&msg);

    }

}

HWND CColorPicker::GetHwnd() ...{return m_hwnd;}

DWORD CColorPicker::GetColor() ...{return m_Color;}

//响应WM_PAINT重画整个窗口

void CColorPicker::OnPaint()

{

    PAINTSTRUCT ps;

    RECT rc;

    HBRUSH hb;

    HDC hdc = BeginPaint(m_hwnd, &ps);

    GetClientRect(m_hwnd, &rc);

    hb = CreateSolidBrush(GetSysColor(COLOR_WINDOW));

    FillRect(hdc, &rc, hb);

    DeleteObject(hb);

    //绘制色块

    for (byte i=0; i<5; i++)

        for (byte j=0; j<8; j++)

        {

            Draw(hdc, i, j, false, 1);

            if (m_Color == ColorMap[i][j]) m_bCustomColor = false;

        }

    //绘自定义文字

    Draw(hdc, 5, 0, m_HotRow==5, 1);

    EndPaint(m_hwnd, &ps);

}

//根据参数画指定区域

//窗体重绘与局部刷新竟相差了一个点,correction参数用于校正

void CColorPicker::Draw(HDC hdc, byte row, byte col, bool hot, byte correction)

{

    RECT rc;

    HGDIOBJ hpen, holdpen, hbold;

    HBRUSH hb;

    if (row<5 && col<8)

    {

        rc.left = col*18 + 5 - correction;

        rc.top  = row*18 + 5 - correction;

        rc.right = rc.left + 18;

        rc.bottom = rc.top + 18;

        //显示选中热区

        if (hot || ColorMap[row][col] == m_Color)

        {

            hb = CreateSolidBrush(GetSysColor(m_bMouseDown ? COLOR_HIGHLIGHT : COLOR_INACTIVECAPTIONTEXT));

            hpen = CreatePen(PS_SOLID, 1, GetSysColor(m_bMouseDown ? COLOR_WINDOWFRAME : COLOR_INACTIVECAPTION));

            hbold = SelectObject(hdc, hb);

            holdpen = SelectObject(hdc, hpen);

            Rectangle(hdc, rc.left, rc.top, rc.right, rc.bottom);

            SelectObject(hdc, holdpen);

            SelectObject(hdc, hbold);

            DeleteObject(hb);

            DeleteObject(hpen);

        }

        else

            FillRect(hdc, &rc, NULL); //GetSysColorBrush

        //显示颜色

        InflateRect(&rc, -3, -3);

        hb = CreateSolidBrush(ColorMap[row][col]);

        hpen = CreatePen(PS_SOLID, 1, GetSysColor(COLOR_ACTIVEBORDER));

        hbold = SelectObject(hdc, hb);

        holdpen = SelectObject(hdc, hpen);

        Rectangle(hdc, rc.left, rc.top, rc.right, rc.bottom);

        SelectObject(hdc, holdpen);

精彩图集

赞助商链接