我想在一个小方块中绘制彩色褪色(黑色)圆圈。我需要控制的是衰减强度,它更快地更新它。我知道如何填充和控制全方形颜色,我目前的算法非常简单:
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和基本的微软库优先,但其他任何东西都适合... 有人可以给我任何例子,或至少我应该研究哪些功能?尽可能具体。
答案 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);
}