2014-12-03 1 views
0

작은 사각형에 색깔이 변하는 (검은 색으로) 원을 그려야합니다. 내가 제어 할 필요가있는 것은 페이딩 강도가 아주 빨리 업데이트된다는 것입니다. 나는 채우는 방법을 알고 전체 정사각형 색상을 제어하고, 내 현재의 알고리즘은 매우 간단 않습니다사각형에 희미한 사각형이나 페이딩 원을 그리는 방법 C++ win32

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 및 기본 마이크로 소프트 라이브러리 preffered, 아무것도하지만, 다른 맞는 ... 누군가가 나에게 예제를 줄 수, 또는 적어도 어떤 기능을 연구해야합니까? 가능한 한 구체적으로

+0

"그라디언트"를 한 색상에서 다른 색상으로 블렌딩한다는 의미입니까? 그렇다면 도움이 될 수도 있습니다. http://stackoverflow.com/q/1418399/3651800 –

답변

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); 
} 
+0

안녕하세요, 원의 색이 아닌면에 원을 흐리게 표시하고 싶습니다. 중간에 둥근 원을 그리고 옆으로 흐리게 만듭니다. 흐림 효과 - 배경이 투명 해짐을 의미합니다. – Tomas

+0

그리고 fillrect (검정색으로 배경을 채우는 것) 이후에 타원을 빠르게 다시 칠하는 것은 타원 repaint을 깜빡 거리게 만들고 배경을 한 번만 채우고 원을 반복해서 칠할 생각입니다. 그러나 그것을 제대로하는 방법을 확실히 모르겠다. – Tomas

관련 문제