본문 바로가기

게임 공부/Windows API17

[윈도우즈 API 정복] 1. 윈도우즈 프로그래밍 Windows와 Windows API 다 알겠지만 Windows는 마이크로소프트에서 개발한 운영체제이다. 윈도우즈 이전엔 주로 MS-DOS(Disk Operating System)가 사용 되었으며, 가장 표면적인 차이점은 윈도우즈 OS는 사용자 입장에서 직관적인 GUI 환경의 운영체제라는 점이다. 운영체제는 응용 프로그램이 하드웨어 위에서 잘 동작할 수 있도록 도와주는 시스템 소프트웨어이다. 응용 프로그램이 디스크에 존재하는 파일을 읽고 싶다면 하드웨어에게 명령을 내려야 하는데, 이를 운영체제가 도와준다. 단순한 파일 읽기라도 내부적으론 많은 복잡한 과정(명령)을 거치게 되는데, 윈도우즈는 이러한 복잡한 명령 집합을 랩핑하여 간단한(상대적으로) 인터페이스를 구현해 놓았고, 우리는 이를 통해 파일을 쉽게 .. 2023. 5. 23.
[GDI+] Image::FromFile 결과가 NULL이 나올 때 원래는 잘 출력 됐었는데 코드를 좀 수정하고 이미지를 출력하니까 이미지가 안나왔다. 다른 이미지는 잘 나오는데 이 이미지에 대한 FromFile 결과(Image*)가 계속 NULL이 나오는 것이다. 한 사십분 삽질하다 찾아보니 Gdiplus 관련 변수가 초기화되어 있지 않을 때 FromFile이 NULL을 반환한다고 한다. 엥? 초기화되어 있을텐데 하고 다시 보니 이 이미지 파일만 Gdiplus 관련 변수보다 일찍 초기화가 됐었다.. 결론: GdiplusStartup()로 초기화하기 전에 FromFile로 이미지 파일을 만들지 않았는지 확인해 본다. 2020. 10. 29.
스레드가 종료되기 전에 CloseHandle()를 호출해도 된다. _beginthreadex() 함수를 이용해 스레드를 성공적으로 생성하면 핸들을 반환한다. 그리고 생성한 스레드가 종료되면 CloseHandle 함수를 통해 핸들을 닫아야 한다는 걸 알고 있었다. 아래는 MSDN의 CloseHandle 글인데 해석해 보면 스레드 핸들을 닫는 행동이 관련된 스레드를 종료하거나 스레드 객체를 종료하진 않는다고 한다. 그리고 스레드 객체를 지우려면 스레드를 종료시키고 핸들을 닫으라고 한다. Closing a thread handle does not terminate the associated thread or remove the thread object. Closing a process handle does not terminate the associated process o.. 2020. 10. 18.
A 스레드로 생성한 윈도우를 다른 스레드가 파괴할 수 없다! 뭣도 모르는 상태에서 멀티 스레드 프로그래밍 하던 도중 버튼 없애는 등의 함수를 수행하는 스레드를 생성했는데 이상하게 버튼 삭제가 안되길래 DestroyWindow()와 thread에 대해 검색해 보았다. 다음과 같은 내용을 얻음 해석해 보면 다른 스레드에 의해 생성된 윈도우는 파괴할 수 없다고 한다. 즉 A 스레드로 윈도우를 생성했으면 A 스레드로만 윈도우를 지울 수 있다. 2020. 10. 17.
[WinAPI] Button 삭제하기 BOOL DestroyWindow( HWND hWnd ); CreateWindow()를 통해 생성한 Button은 DestroyWindow()를 통해 제거할 수 있다. // 버튼 생성 HWND sampleButton = CreateWindow(...); // 버튼 삭제 DestroyWindow(sampleButton); 2020. 10. 3.
[WinAPI] GDI+를 이용하여 이미지 파일(png, jpg 등) 출력하기 우선 GDI+를 사용하기 위해 다음과 같이 를 인클루드하고 Gdiplus.lib 라이브러리를 연결해줍니다. 그리고 편의를 위해 Gdiplus 네임스페이스를 선언해줍니다. #include #pragma comment(lib, "Gdiplus.lib") using namespace Gdiplus; /* GDI 관련 데이터 */ ULONG_PTR gdiplusToken; GdiplusStartupInput gdiplusStartupInput; INT WINAPI wWinMain(HINSTANCE hInst, HINSTNACE, PWSTR, INT) { ... // GDI+ 관련된 어떤 함수라도 사용 전에 해당 함수를 호출해야 합니다. GdiplusStartup(&gdiplusToken, &gdiplusStar.. 2020. 9. 19.