본문 바로가기

게임 공부/Windows API17

[WinAPI] LParam으로부터 마우스 커서의 좌표를 얻을 때 LParam으로부터 마우스 커서의 좌표를 얻을 때 미리 정의된 매크로인 LOWORD 또는 HIWORD를 사용할 수 있다. 그러나 해당 매크로들은 모든 좌표를 unsigned 타입으로 변환한다. 보통의 시스템 환경에선 양의 좌표만 가지기 때문에 문제가 없지만, 특정 시스템 환경에선 음의 좌표를 가질 수 있기 때문에 문제가 된다. 이를 위해 헤더의 GET_X_LPARAM과 GET_Y_LPARAM 매크로를 사용할 수 있다. 음수와 양수 모두 취급 가능하며 매크로의 이름 또한 가독성이 더 좋다. 2020. 9. 16.
[WinAPI] 윈도우즈 프로그램에서 특정 값 확인하고 싶을 때 윈도우즈 프로그램에서 어떤 변수 또는 결과의 값을 확인하고 싶을 때가 있다. 디버거로 확인할 수 있지만 가끔 디버거로 확인하기 어려운 경우도 있다. 그럴 때 다음과 같이 사용해서 윈도우 메세지로 띄우면 된다. 다음은 숫자 타입의 값을 확인하고 싶을 때 문자열로 변경하여 메세지로 출력하는 방법이다. 문자열 출력을 원할 경우 그냥 바로 MessageBoxA() 함수에 넣으면 된다. MessageBoxA()는 두 번째 인자가 char* 타입이다. 따라서 와이드 타입의 문자열일 경우 MessageBoxW()를 사용하면 된다. 와이드 타입의 경우 std::wstring과 std::to_wstring()을 사용한다. #include VOID CheckValue() { // 숫자 타입의 값을 문자열로 변경 int x.. 2020. 9. 9.
[WinAPI] 윈도우 크기 고정시키기, 리사이즈 막기 윈도우를 생성하는 함수인 CreateWindow의 인자 중 dwStyle에 해당하는 인자가 있다. 이 인자를 WS_OVERLAPPED | WS_SYSMENU 로 설정해준다. WS_OVERLAPPED 옵션은 기본 윈도우를 의미하고 WS_SYSMENU는 시스템 메뉴를 가지도록 한다는데 왜 이게 가능한지는 이해가 가지 않지만 일단은 임시 방편으로 이렇게 사용한다. 다른 방법으로는 윈도우의 조절 가능한 MIN, MAX크기를 설정할 수 있는 함수가 있는데, MIN과 MAX를 동일하게 하는 방법도 있다고 한다. 2020. 9. 7.
UpdateWindow()와 InvalidateRect()와 WM_PAINT 메세지 UpdateWindow() 함수는 윈도우에 WM_PAINT 메세지를 전송함으로써 무효화된 영역을 다시 그려주는 함수이다. 이와 비슷하게 InvalidateRect()라는 함수가 있는데, 이 함수는 Rect를 통해 특정 영역을 지정하여 그 영역을 무효화된 영역으로 만들어주고 WM_PAINT 메세지를 발생시킨다. 두 함수의 차이 점은 InvalidateRect() 함수는 단순히 무효화 영역을 지정함으로써 시스템이 WM_PAINT 메세지를 발생시키도록 하는 것이고, UpdateWindow() 함수는 WM_PAINT 메세지를 강제로 발생시킨다. 원래 무효화 영역이 발생함으로써 생기는 WM_PAINT 메세지는 메세지 큐로 들어가며 다른 메세지들이 처리된 후 처리된다. 즉 우선순위가 낮다. 반면 UpdateWind.. 2020. 9. 6.
GetMessage()와 PeekMessage()의 차이 Windows API 함수 중 운영체제의 메세지 큐로부터 메세지를 가져오는 함수로 GetMessage()와 PeekMessage()가 있다. [공통점] 두 함수는 모두 메세지 큐로부터 메세지를 가져온다. 두 함수는 동일한 매개변수 4개를 가진다. 그중에 첫 번째 인자로 MSG 구조체를 받는다. 메세지 큐로부터 얻은 메세지 값을 MSG 구조체에 저장한다. [GetMessage()] GetMessage()는 메세지 큐에 메세지가 존재한다면 가져와서 MSG 구조체에 그 값을 저장하고 TRUE를 반환한다. 그런데 만약 읽은 메세지가 WM_QUIT이면 FALSE를 리턴한다. WM_QUIT은 메세지 루프를 종료하기 위한 조건으로 사용된다. 만약 메세지 큐에 메세지가 존재하지 않으면 메세지가 생성될 때까지 무한정 기.. 2020. 6. 22.
HINSTANCE 타입과 HWND 타입의 차이 개인적으로 공부하는 내용으로, 틀린 부분이 있을 수 있습니다. 틀린 부분을 발견하시면 알려주세요 :) HINSTANCE 타입은 보통 애플리케이션(프로그램)의 인스턴스(핸들)라고 한다. 혹은 독립적인 개체인 모듈의 시작 주소라고도 한다. 인스턴스란 하나의 고유한 프로그램을 나타내는 운영체제가 부여하는 고유한 주소값이라 생각하면 된다. GetModuleHandle() 을 통해 얻을 수도 있고, WinMain 엔트리 포인트를 사용할 시 운영체제가 인자로 넘겨주기도 한다. 메모장이라는 한 종류의 프로그램을 2개이상 띄울 수 있는데, 이러한 모든 창은 모두 동일한 인스턴스 값을 가진다. HWND 타입은 윈도우 핸들이라는 뜻으로 운영체제가 자원에 할당하는 값이다. 핸들은 프로그램 내의 1개 이상의 윈도우(창)을 식.. 2020. 6. 12.