如何在方形c ++ win32中绘制褪色方块或褪色圆圈

时间:2014-12-03 04:04:37

标签: c++

我想在一个小方块中绘制彩色褪色(黑色)圆圈。我需要控制的是衰减强度,它更快地更新它。我知道如何填充和控制全方形颜色,我目前的算法非常简单:

RECT r;
GetClientRect(GetDlgItem(hwnd, 1), &r); //get CLIENT rect of control relative to screen
brush_real = CreateSolidBrush(RGB(Roriginal, Goriginal, Boriginal));
dc = GetDC(GetDlgItem(hwnd, 1));
FillRect(dc, &r, brush_real);
DeleteObject(brush_real);
ReleaseDC(GetDlgItem(hwnd, 1), dc);

Win32和基本的微软库优先,但其他任何东西都适合... 有人可以给我任何例子,或至少我应该研究哪些功能?尽可能具体。

1 个答案:

答案 0 :(得分:0)

鉴于你使用了“快速”这个词。在你的问题中,我假设你喜欢在时域中发生淡入淡出,而不是空间变化。

话虽如此,我所采用的方法是简单地使用计时器和静态变量。每次计时器触发时,我都会更改变量并请求重新绘制。在重新绘制过程中,我会检查变量并使用它来控制我绘制的圆的颜色。

这是一个快速示例,绘制一个包围圆圈的灰色方块。超过100帧,圆圈从黑色(0,0,0)变为红色(255,0,0)。请注意,圆圈是使用当前被选入HDC的HBRUSH和HPEN绘制的。我没有对HPEN感到困扰,所以你会发现圆圈的轮廓是黑色的,因为默认的笔是黑色的。

#include <windows.h>
#include <commctrl.h>
#include <stdio.h>
#include "resource.h"

HINSTANCE hInst;


// hwnd = dest wnd
// percentage - 100% = black, 0% = red
void onPaint(HWND hwnd, int percentage)
{
    PAINTSTRUCT ps;
    HDC hdc = BeginPaint(hwnd, &ps);

    RECT mRect;
    GetClientRect(hwnd, &mRect);
    SetRect(&mRect, 10, 10, 100+10, 100+10);
    HBRUSH bkBrush = CreateSolidBrush( RGB(100, 100, 100) );
    FillRect(hdc, &mRect, bkBrush);

    int col = ( (100-percentage) * 255) / 100.0;
    HBRUSH circleBrush = CreateSolidBrush( RGB(col,0,0) ), oldBrush;
    oldBrush = (HBRUSH)SelectObject(hdc, circleBrush);
    Ellipse(hdc, mRect.left,mRect.top, mRect.right,mRect.bottom);
    SelectObject(hdc, oldBrush);

    DeleteObject(bkBrush);
    DeleteObject(circleBrush);

    EndPaint(hwnd, &ps);
}

BOOL CALLBACK DlgMain(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    static int percentage = 100, framesPerSecond = 60;
    switch(uMsg)
    {
    case WM_INITDIALOG:
    {
        SetTimer(hwndDlg, 0x666, 1000/framesPerSecond, NULL);
    }
    return TRUE;

    case WM_TIMER:
        {
            if (percentage)
                percentage--;
            else
                KillTimer(hwndDlg, 0x666);

            InvalidateRect(hwndDlg, NULL, false);
         //   printf("wm_timer\n");
        }
        return false;

    case WM_PAINT:
        onPaint(hwndDlg, percentage);
        break;

    case WM_CLOSE:
    {
        EndDialog(hwndDlg, 0);
    }
    return TRUE;

    case WM_COMMAND:
    {
        switch(LOWORD(wParam))
        {
        }
    }
    return TRUE;
    }
    return FALSE;
}


int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    hInst=hInstance;
    InitCommonControls();
    return DialogBox(hInst, MAKEINTRESOURCE(DLG_MAIN), NULL, (DLGPROC)DlgMain);
}