API X,Y 출력과 비트 연산자에 대한 수업을 들었다.
1. API 마우스 X,Y좌표 출력
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static int nPosX{};
static int nPosY{};
switch (message)
{
case WM_MOUSEMOVE:
nPosX = GET_X_LPARAM(lParam);
nPosY = GET_Y_LPARAM(lParam);
InvalidateRect(hWnd, nullptr, true);
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
wchar_t str[64]{};
swprintf_s(str, 64, L"%d, %d", nPosX, nPosY);
TextOut(hdc, 100, 100, str, 15);
EndPaint(hWnd, &ps);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
static int nPosX{}; / static int nPosY{};
- WndProc은 수정할 수 없는 고정 함수이다.
- WndProc함수 내에 지역 변수를 사용하면 값이 카운팅이 되지 않는다.
- 이는 case문에 들어가 카운팅이 진행되더라도 case문을 벗어나느 순간 지역 변수가 다시 초기화되기 떄문이다.
- 따라서 API예제를 보게 되면 2가지 예시만 볼수있을 것이다.
- 전역 변수 / 정적변수(static) ( 클래스가 아니기 때문에 어쩔수 없다 )
- 다양한 메시지를 처리하려면 수많은 정적 변수가 필요하여 코드 관리가 힘들어지는 단점이 있다.
InvalidateRect(hWnd, nullptr, true);
- 화면을 갱신(즉시 그리기) 하는 함수가 아닌 WM_PAINT 메시지를 메시지 큐에 등록하는 함수이다.
- 그렇기 때문에 메시지 큐에 넣은 뒤 처리하거나 처리한 뒤 넣거나 결과는 동일하다.
- 또한 메시지 큐에 메시지를 넣는 여러 함수가 있으니 이를 숙지해야 한다.
swprintf_s(str, 64, L"%d, %d", nPosX, nPosY);
- 문자열을 버퍼에 출력하는 역활
- 첫 번째 매개변수: 출력 대상 버퍼
- 두 번째 매개변수: 버퍼 크기
- 세 번째 매개변수: 출력할 포맷
- 네 번째 이후: 출력할 변수들
TextOut(hdc, 100, 100, str, 15);
- 텍스트를 화면에 출력하는 역활
- hdc: 그리기 대상의 핸들
- (100, 100): 텍스트를 출력할 위치
- str: 출력할 문자열
- 15: 출력할 문자 개수 (버퍼의 길이)
2. 비트 연산자
연산자 종류 및 설명
- & (AND): 둘 다 참일 때 참 (비트 모두 1이어야 참).
- | (OR): 하나만 참이어도 참 (비트 중 하나가 1이면 참).
- ^ (XOR): 두 비트가 다를 때만 참 (1과 0).
- << (왼쪽 시프트): 비트를 왼쪽으로 n칸 이동.
- >> (오른쪽 시프트): 비트를 오른쪽으로 n칸 이동.
- ~ (NOT): 비트를 반전 (1 ↔ 0).
주의점
- 정수 또는 정수로 변환 가능한 타입에서만 사용 가능.
- 실수나 포인터에는 사용할 수 없음.
'C++' 카테고리의 다른 글
[강의] 1월 21일 수업정리 (0) | 2025.01.21 |
---|---|
[강의] 1월 20일 수업정리 (1) | 2025.01.20 |
[강의] 1월 16일 수업정리 (0) | 2025.01.16 |
[강의] 1월 15일 수업정리 (0) | 2025.01.16 |
[강의] 1월 13일 수업정리 (0) | 2025.01.13 |