본문 바로가기

Application Programming Interface/Windows API

갈아 만든 Windows API - #2. 창 배경색 수정하기

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

갈아 만든 Windows API

#2. 창 배경색 수정하기

tapitolife (dkhighest@naver.com)

1. 원본 소스 보기

#include <windows.h>
HINSTANCE g_hInstance;
TCHAR szClassName[] = TEXT("TAPITO WinAPI Example");
TCHAR szWindowName[] = TEXT("TAPITO Windows API Example #1");

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam);

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    HWND hWnd;
    MSG msg;
    WNDCLASS WndClass;

    g_hInstance = hInstance;

    WndClass.cbClsExtra = 0;
    WndClass.cbWndExtra = 0;
    
/* ↓ 조작해 볼 부분 ↓ */
    WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
    WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    WndClass.hInstance = hInstance;
    WndClass.lpfnWndProc = WndProc;
    WndClass.lpszClassName = szClassName;
    WndClass.lpszMenuName = NULL;
    WndClass.style = CS_HREDRAW | CS_VREDRAW;

    RegisterClass(&WndClass);

    hWnd = CreateWindow(
        szClassName,
        szWindowName,
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
        (HWND)NULL,
        (HMENU)NULL,
        hInstance,
        (LPVOID)NULL
        );

    ShowWindow(hWnd, nShowCmd);

    while(GetMessage(&msg, (HWND)NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return (int)msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam)
{
    LRESULT ret;

    switch(uMessage)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        ret = 0;
        break;

    default:
        ret = DefWindowProc(hWnd, uMessage, wParam, lParam);
        break;
    }

    return ret;
}

 

WNDCLASS는 창의 서식을 지정하는 구조체입니다. 마치 워드프로세서의 서식처럼 미리 각 멤버들을 원하는 대로 속성을 준 다음 RegisterClass를 통해 운영체제에 서식을 등록하고, 필요할 때마다 서식을 불러와 창을 찍어내는 것이죠. 이렇게 하면 비슷한 종류의 창은 비슷한 커서, 배경색, 메뉴 등을 사용함으로써 UI가 일관성을 갖게 된다는 장점이 있습니다.

 

이번 화에서 볼 것은 HBRUSH 형식의 hbrBackground 멤버입니다. 말 그대로 창의 배경색을 지정하는 것이죠. 직접 색상을 지정할 수도 있고 위와 같이 GetStockObject API를 이용해 운영체제에서 기본 정의된 배경색을 사용할 수도 있습니다.

 

GetStockObject를 사용한 기본 색 배경

 

API 2. HGDIOBJ GetStockObject(IN int fnObject)

시스템에서 기본 정의된 그리기 도구(펜, 브러시, 폰트, 시스템 팔레트)를 가져옵니다.

그러나 여기에서는 우선 브러시만을 써보도록 하겠습니다.

 

fnObject [IN]

아래 표 중 하나의 상수를 지정합니다.

상수명

의미

BLACK_BRUSH

검정색 붓을 가져옵니다.

DKGRAY_BRUSH

어두운 회색 붓을 가져옵니다.

DC_BRUSH

해당 DC에서 기본 값으로 정의한 바탕색 붓을 가져옵니다. 기본 색은 흰색이지만 SetDCBrushColor API를 쓰면 다른 색으로 지정할 수 있습니다.

GRAY_BRUSH

회색 붓을 가져옵니다.

HOLLOW_BRUSH

투명 붓을 가져옵니다.

LTGRAY_BRUSH

밝은 회색 붓을 가져옵니다.

NULL_BRUSH

NULL 브러시입니다. (HOLLOW_BRUSH와 동일)

WHITE_BRUSH

흰색 붓을 가져옵니다.

 

각 속성의 실행 결과

그림 1 BLACK_BRUSH

 

그림 2 DKGRAY_BRUSH

 

그림 3 GRAY_BRUSH

 

그림 4 HOLLOW_BRUSH/NULLBRUSH

HOLLOW_BRUSH의 경우 보시는 바와 같이 창이 뜬 처음 위치의 화면을 그대로 베끼게 되는데 이동을 시킨다고 해서 배경이 달라지지는 않습니다.

그림 5 LTGRAY_BRUSH

 

그림 6 WHITE_BRUSH

 

CreateSolidBrush를 사용한 사용자 정의 색 배경

 

API 3. HBRUSH CreateSolidBrush(IN COLORREF crColor);

 

RGB 코드를 직접 지정한 붓을 가져옵니다.

 

crColor [IN]

직접 지정할 붓의 색입니다. 매크로함수 RGB(r, g, b)를 사용해 지정합니다.

그림 7 RGB 코드 (0, 255, 255) 배경