BOOL InvalidateRect(
HWND hWnd,
const RECT* lpRect, // 다시 그릴 영역, 0 또는 NULL 또는 nullptr 이면 전체영역 의미
BOOL bErase // 지우고 그릴건지 여부
)
BOOL TextOut (
HDC hdc, // 출력 목표 DC
int xStart, int YStart, // 출력 좌표값
LPCTSTR lpString, // 출력 문자열 주소
int cbString, // 문자열 길이
)
문자열은 시작주소부터 '\0' 널문자 까지 읽는 것이 기본이다.
'\0' == 0x0000
#include <windows.h>
#include <stdio.h>
HINSTANCE hInstance;
HWND hWnd;
HDC hDC;
...
// 멀티바이트 출력
{
char buffer[100];
sprintf(buffer , "%d, %f, %s", 10, 3.14f, "windows");
TextOut(hDC, 0, 0, buffer, strlen(buffer)); // 글자 출력
}
// 유니코드 출력 (wchar_t *, TCHAR *)
{
TCHAR buffer[100];
wsprintf(buffer, TEXT("%d, %f, %s"), 10, 3.14f, L"windows)
TextOut(hDC, 0, 0, buffer, lstrlen(buffer)); // 글자 출력
}
COLORREF SetTextColor ( HDC hDC, COLORREF crColor );
COLORREF SetBKColor ( HDC hdc, COLORREF crColor )
TEXT(" ") 매크로는 C++/Win32 API에서
유니코드와 멀티바이트 문자열을 구분하여 처리할 수 있도록 지원하는 매크로입니다.
이 매크로는 매개변수로 전달된 문자열을
유니코드 문자열로 변환하거나, 멀티바이트 문자열로 변환합니다.
TEXT("문자열")
#include <tchar.h>
#ifdef _UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif
TCHAR buffer[] = TEXT("Hello, world!");
sprintf(char* buffer, "%d %f %s", int, float, char*);
strlen(char* str)
swprintf(char* buffer, int sizeofBuffer, L"%d %f %s", int, float, wchar_t*);
lstrlen(wchar_t* str)
화면 DC 에 특정 좌표에 픽셀을 출력하는 함수
SetPixel (
HDC hdc, // DC
int x, int y, // 점의 좌표
COLORREF crColor // 점의 색상
)
화면 DC 에 출력된 특정 좌표에 있는 픽셀의 색상값을 구하는 함수
GetPixel (
HDC hdc, // DC
int nXPos, int nYPos // 점의 좌표
)
BOOL MoveToEX(
HDC hdc, // DC
int x, int y, // 시작점의 좌표
LPPOINT lpPoint // 이전 시작점을 받을 POINT 변수 주소, 잘안쓴다. NULL, 0
)
LineTo(
HDC hdc, // DC
int nXEnd, int nYEnd // 끝점의 좌표, 다음선의 시작점
)
BOOL Rectangle(
HDC hdc,
int nLeftRect,
int nTopRect,
int nRightRect,
int nBottomRect
)
BOOL Ellips(
HDC hdc,
int nLeftRect,
int nTopRect,
int nRightRect,
int nBottomRect
)
// 핸들로 자원 정보 요청하기
int GetObject(
HGDIOBJ hgdiobj, // GDI Object 핸들
int cbBuffers, // 구조체 버퍼의 메모리 사이즈
LPVOID lpvObject // 정보를 얻고자 하는 구조체 변수의 메모리 주소
)
cbBuffer 의 사이즈 만큼 DC 가 지정한 HGDIOBJ 를 사용하도록 설정한다
HGDIOBJ SelectObject(
HDC hdc,
HGDIOBJ gdiobj // Bitmap 에 있는 내용들이 DC 에 옮겨져서 출력을 할 수 있는 상태가 된다.
)
BOOL DeleteObject( HGDIOBJ hObject )
// 비트맵 구조체
typedef struct tagBITMAP{
int bmType;
int bmWidth;
int bmHeight;
int bmWidthBytes;
BYTE bmPlanes;
BYTE bmBitsPixel;
LPVOID bmBits;
} BITMAP
HBITMAP LoadBitmap(
HINSTANCE hInstance,
LPCSTR lpBitmapName // MAKERESOURCE() 함수를 활용
)
파일을 경로로 비트맵 이미지를 찾아 핸들을 얻으려는 경우 LoadImage 을 사용합니다.
반환된 핸들을 HBITMAP 으로
HANDLE LoadImage (
HINSTANCE hInstance,
LPCSTR lpszName, // 파일 경로와 파일명
UINT uType, // IMAGE_BITMAP
int cXDesired, int cYDesired, // 0 또는 LR_DEFAULTSIZE 또는 이미지사이즈지정
UINT fuLoad // 파일로부터 읽기 때문에 설정이 필요하다. (정수형 Bit OR 연산)
/*
1. 실제 이미지 크기 입력을 했다면
fuLoad = LR_CREATEDIBSECTION | LR_LOADFROMFILE
2. 0 또는 LR_DEFAULTSIZE 로 입력을 했다면
fuLoad = LR_CREATEDIBSECTION | LR_LOADFROMFILE | LR_DEFAULTSIZE
*/
)
임의의 크기의 비트맵을 생성하는 함수
HBITMAP CreateCompatibleBitmap(
HDC hdc, // hdc 가 사용하고 있는 비트맵을 가져오기 위한 dc 핸들
int nWidth, int nHeight // 가로 세로 크기
)
HDC CreateCompatibleDC(HDC hdc)
HGDIOBJ SelectObject (
HDC hdc,
HGDIOBJ gdiobj //
)
고속 복사
이 때 두 DC 는 반드시 호환되는 DC 이거나 한쪽이 흑백이어야 한다.
다른 Color Format 을 가지는 DC 끼리는 비트맵을 전송할 수 없다. ( 흑백은 예외 )
BOOL BitBlt (
HDC hdcDest, // DC 가 가리키는 화면에 대한 DC
int nXDest, int nYDest, // 좌표
int nWidth, int nHeight, // 이미지의 가로, 세로 사이즈
HDC hdcSrc, // 메모리 DC
int nXSrc, int nYSrc, // 메모리 DC 의 어디서부터 출력할 것인가.
DWORD dwRop // 레스터 연산,변형 여부, 일반적인 경우 SRCCOPY
)
매개변수는 BitBlt 하고 동일하나 추가적으로 원본 이미지의 넓이와 폭을 지정할 수 있다.
그래서 두 DC 간의 면적비에 따라 이미지가 확대되거나 축소된다.
확대 / 축소 과정은 이미지의 픽셀끼리 1:1 로 되는것이 아니기 때문에,
추가로 픽셀이 삽입되기도 하고 픽셀이 생략되거나 합쳐지기도 한다
확대 될 때는 원본의 픽셀을 여러번 반복하면 되므로 별 문제가 없지만,
축소될 때는 불가피하게 원본의 픽셀중 일부를 생략해야 하는데
이때 어떤 픽셀이 삽입되고, 어떤 픽셀이 생략될 것인가를 계싼하는 방법을
스트레칭 모드 라고 하며, 합쳐질 픽셀들의 논리방법을 지정해야 한다.
BOOL StretchBlt (
HDC hdcDest, // DC 가 가리키는 화면에 대한 DC
int nXOriginDest, int nYOriginDest, // 시작 좌표
int nWidthDest, int nHeightDest, // 출력하고자 하는 이미지의 가로, 세로 사이즈
HDC hdcSrc, // 메모리 DC
int nXOriginSrc, int nYOriginSrc, // 메모리 DC 의 어디서부터 출력할 것인가
int nXWidthSrc, int nYHeightSrc, // 원판의 크기
DWORD dwRop // 변형 여부, 일반적인 경우 SRCCOPY
)
msgimg32.lib 라이브러리 추가
프로젝트 속성->링커->입력->추가 종속성 = [ ... , msimg32.lib ]
BOOL TransparentBlt (
HDC hdcDest, // DC 가 가리키는 화면에 대한 DC
int nXOriginDest, int nYOriginDest, // 시작 좌표
int nWidthDest, int nHeightDest, // 출력하고자 하는 이미지의 가로, 세로 사이즈
HDC hdcSrc, // 메모리 DC
int nXOriginSrc, int nYOriginSrc, // 메모리 DC 의 어디서부터 출력할 것인가
int nXWidthSrc, int nYHeightSrc, // 원판의 크기
UINT crTransparent // 투명 처리하고자 하는 색상 설정 , GetPixel( ) 을 사용할 수도 있고, RGB( ) 로도 입력할 수 있다
)
패턴방식 초기화
DC 의 비트맵 영역을 DC 가 사용하고 있는 브러쉬 형태로 채운다.
다른점은 FillRect 는 사각영역을 무조건 브러쉬로 채우지만,
PatBlt 은 ROP 코드를 통한 화면색상과 브러쉬 색상의 논리 연산을 지정할 수 있다. )
BOOL PatBlt(
HDC hdc, // DC 핸들
int x, int y, // 시작좌표
int w, int h, // 영역
DWORD rop // 레스터 연산. 화면을 하얀색으로 채우고 싶다면 WHITENESS
)
// unsinged long == DWORD == COLORREF
#typedef DWORD COLORREF;
// 색상 반환 매크로 함수
COLORREF RGB(
BYTE byRed, // 빨강 색상값
BYTE byGreen, // 초록 색상값
BYTE byBlue, // 파랑 색상값
)
// 색상값 저장
DOWRD dwColor = RGB(100,200,50);
BYTE GetRValue( DWORD rgb ); // 빨강색상값 반환
BYTE GetGValue( DWORD rgb ); // 초록색상값 반환
BYTE GetBValue( DWORD rgb ); // 파랑색상값 반환
typedef struct _RECT {
LONG left;
LONG top;
LONG right;
LONG bottom;
} RECT *PRECT;
OS 에서 제공하는 GDI Object
기본적인 설정이 완료된 오브젝트
HGDIOBJ GetStockObject(
int fnObject // GDI OBject ID
)
HPEN hPen = (HPEN)GetStockObject(BLACK_PEN);
// 펜 생성함수
HPEN CreatePen (
int fnPenSytle, // PS_SOLID, PS_DASH, PS_DASHDOT
int nWidth,
COLORREF crColor
)
HBRUSH CreateSolidBrush(
COLORREF crColor
)
HBRUSH CreateHatchBrush( )
HBRUSH CreatePatternBrush( )
HBRUSH CreateBrushIndirect( )
HBRUSH CreateBrushIndirect( )
HBRUSH CreateDIBPatternBrushPt( )