#include <windows.h>
#include <d2d1.h>
//#include <d2d1helper.h>

#pragma comment(lib, "d2d1.lib")

LRESULT PASCAL WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow);
HRESULT CreateRenderTarget(HWND hWnd);
void ReleaseRenderTarget();

void OnPaint(HWND hWnd);
void OnSize(UINT Width, UINT Height);

ID2D1Factory* Direct2DFactory = nullptr;
ID2D1HwndRenderTarget* RenderTarget = nullptr;
 
int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    HRESULT hResult;

    hResult = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &Direct2DFactory);

    if (SUCCEEDED(hResult))
    {
        WNDCLASSEX wcex = { sizeof(WNDCLASSEX) };
        wcex.style         = CS_HREDRAW | CS_VREDRAW;
        wcex.lpfnWndProc   = &WndProc;
        wcex.cbClsExtra    = 0;
        wcex.cbWndExtra    = sizeof(LONG_PTR);
        wcex.hInstance     = hInstance;
        wcex.hbrBackground = nullptr;
        wcex.lpszMenuName  = nullptr;
        wcex.hCursor       = LoadCursor(nullptr, IDI_APPLICATION);
        wcex.lpszClassName = L"Direct2D Template";
        RegisterClassEx(&wcex);

        HWND hWnd = CreateWindow(L"Direct2D Template", L"Direct2D Template", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, nullptr, nullptr, hInstance, nullptr);
        BOOL ShowWindowState = ShowWindow(hWnd,nCmdShow);
    
        if (ShowWindowState = TRUE)
        {
            ShowWindow(hWnd, nCmdShow);
            UpdateWindow(hWnd);
        }
        else
        {
            //Window Create Error
            return -1;
        }

        MSG Message;

        while (GetMessage(&Message, nullptr, 0, 0))
        {
            TranslateMessage(&Message);
            DispatchMessage(&Message);
        }

        return static_cast<int>(Message.wParam);
    }
    else
    {
        //D2D Initialization Error
        return -1;
    }
}
HRESULT CreateRenderTarget(HWND hWnd)
{
    HRESULT hResult = S_OK;
    
    if (RenderTarget == nullptr)
    {
        RECT Rect;        
        GetClientRect(hWnd, &Rect);
        D2D1_SIZE_U size = D2D1::SizeU(Rect.right - Rect.left, Rect.bottom - Rect.top);
        
        hResult = Direct2DFactory->CreateHwndRenderTarget(D2D1::RenderTargetProperties(), D2D1::HwndRenderTargetProperties(hWnd, size),    &RenderTarget);        
    }

    return hResult;
}
void ReleaseRenderTarget()
{
    if (RenderTarget == nullptr)
    {
        RenderTarget->Release();
        RenderTarget = nullptr;
    }
}
LRESULT PASCAL WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {

    case WM_CREATE:
        return 0;

    case WM_PAINT:
        OnPaint(hWnd);
        return 0;

    case WM_SIZE:
        {
            UINT Width = LOWORD(lParam);
            UINT Height = HIWORD(lParam);
            OnSize(Width, Height);
        }        
        return 0;

    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
     return(DefWindowProc(hWnd, message,wParam,lParam));
}

void OnSize(UINT Width, UINT Height)
{
    if(RenderTarget != nullptr)
    {
        RenderTarget->Resize(D2D1::SizeU(Width, Height));
    }
}

void OnPaint(HWND hWnd)
{
    HRESULT hResult = CreateRenderTarget(hWnd);
    
    if(SUCCEEDED(hResult))
    {
        RenderTarget->BeginDraw();

        D2D1::ColorF BackGroundColor(255,255,255); //RGB
        RenderTarget->Clear(BackGroundColor);
        
        D2D1::ColorF BrushColor(D2D1::ColorF::Black);
        ID2D1SolidColorBrush* RectBrush;        
        RenderTarget->CreateSolidColorBrush(BrushColor, &RectBrush);
        
        D2D1_RECT_F RectangleRect = D2D1::RectF(100.0f, 100.0f, 400.0f, 300.0f);
        RenderTarget->DrawRectangle(RectangleRect, RectBrush);
            
        hResult = RenderTarget->EndDraw();
    }
    
    if (hResult == D2DERR_RECREATE_TARGET)
    {
        //이 경우 RenderTarget이 무효화 된 것이며, RenderTarget과 RenderTarget에서 생성된 모든 객체를 해제한 후 다시 생성해야 한다.
        ReleaseRenderTarget();
    }
}
분류 :
Win32
조회 수 :
11595
등록일 :
2010.06.08
22:07:25 (*.177.122.42)
엮인글 :
http://www.lunapiece.net/4253/5ad/trackback
게시글 주소 :
http://www.lunapiece.net/4253
문서 첨부 제한 : 0Byte/ 10.00MB
파일 제한 크기 : 10.00MB (허용한 확장자만 첨부할 수 있습니다.(관리자는 제외) : *.*)
옵션 :
:
:
:
:
List of Articles
번호 제목 글쓴이 날짜 조회 수
81 Visual C++ CImage 에서 HBITMAP 구하기 Lyn 2010-08-14 16769
80 Visual C++ Static Control 에 Click 이벤트 사용하기. Lyn 2010-08-14 15761
79 Win32 웹페이지 링크 띄우기 Lyn 2010-08-14 14493
78 Codejock Xtream CXTTrayIcon 사용법 Lyn 2010-08-14 13029
77 Visual C++ CToolTipCtrl 사용법 Lyn 2010-08-14 11313
76 Visual C++ SLN 파일 실행시 개발툴 권한상승 Lyn 2010-08-11 11944
75 기타 Tortoise SVN 에서 Araxis Merge 사용하기. Lyn 2010-07-22 11916
74 Delphi / BCB 폴더 선택 다이얼로그 Lyn 2010-07-20 9604
73 기타 Tortoise SVN 에서 Beyond Compare 사용하기 Lyn 2010-07-05 12164
72 Win32 프로세스를 실행할 CPU 지정 Lyn 2010-07-02 10229
71 기타 SVN Ignore List Lyn 2010-06-19 10562
» Win32 Direct2D 기본 템플릿 Lyn 2010-06-08 11595
69 Pure C++ C++ 0x 에서 변화된 부분. file Lyn 2010-06-02 9637
68 기타 Windows Vista/7 RunAs... (다른 계정으로 실행) 사용하기. Lyn 2010-05-24 10379
67 기타 Windows Vista/7 Hibernation (최대절전모드) 끄기 Lyn 2010-05-24 7811
66 기타 Serv-U 서버에서 UTF-8 사용 안하기. Lyn 2010-05-19 10363
65 Win32 OS가 x86인지 AMD64 인지 구별하는 방법 Lyn 2010-05-14 10050
64 기타 Tortoise SVN 오버레이 아이콘 제대로 안나올시 Lyn 2010-05-06 12151
63 Delphi / BCB 델파이 수학 반올림 방법 Lyn 2010-04-29 10972
62 .net Framework Invoke 시 데드락 문제. Lyn 2010-04-28 9315

SITE LOGIN :)