귀하의 질문에 '빠른'이라는 단어를 사용 했으므로 공간적 효과가 아닌 시간 영역에서 페이드를 발생시키고 싶다고 가정합니다.
그런데 내가 말한 것은 단순히 타이머와 정적 변수를 사용하는 것입니다. 타이머가 작동 할 때마다 변수를 변경하고 다시 그리기를 요청합니다. 다시 칠하는 동안 변수를 검사하고 그것을 사용하여 내가 그린 원의 색을 제어합니다.
다음은 원을 둘러싸는 회색 사각형을 그리는 간단한 샘플입니다. 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);
}
"그라디언트"를 한 색상에서 다른 색상으로 블렌딩한다는 의미입니까? 그렇다면 도움이 될 수도 있습니다. http://stackoverflow.com/q/1418399/3651800 –