본문 바로가기

C++15

[Win32] 메시지 루프는 어떻게 창에 메시지를 전달할까? 하나의 윈도우 프로그램에는 여러 개의 창이 존재한다. 그리고 그 창에는 자기한테 들어온 메시지를 처리하기 위해 각자의 프로시저(Procedure)를 갖는다(엄밀히 창 클래스마다 프로시저를 갖는다). 그렇다면 어떻게 메시지 루프는 메시지에 알맞은 창을 찾을 수 있을까? 다음은 일반적인 윈도우 프로그램의 메인 메시지 루프(싱글스레드)이다. // Main message loop: while (GetMessage(&msg, nullptr, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } 메시지 큐에서 GetMessage로 메시지를 가져와 Transla.. 2022. 7. 31.
[Win32] 윈도우의 닫기 버튼을 눌렀을 때 일어 나는 일 (WM_CLOSE) 이번 포스트에서는 Win32 GUI프로그래밍을 공부하면서 거의 처음으로 배우는 내용인 윈도우가 닫힐 때 일어나는 일에 대해서 알아보겠다. 쌩으로 Win32부터 MFC, WTL까지 하다보니 좀 오래전에 공부해서 인지 가물가물하여 다시한번 리마인드 차원에서 정리해본다. Windows에서 창의 닫기 버튼을 눌렀을때 어떤일이 발생할까? 사용자가 닫기창이 눌렸을 때, 개발자는 많은 것을 고려해야 할 수 있다. 단순히 창을 hide할 것인지, 정말로 프로그램을 종료할 것 인지? 종료한다면 메모리정리, 리소스 정리, 사용자가 작업한 내용, 프로그램의 상태등을 안전하게 정리할 것인지 고려 해야 할 수 있을 것 이다. 닫기동작은 나름 그래서 중요하다고 생각한다. 그럼 닫기 버튼을 눌렀을 때 어떤 일이 발생할까? http.. 2022. 7. 31.
HIWORD, LOWORD 매크로, DWORD 쪼개기 Windows 프로그래밍을 하다보면 32bit 자료형인 DWORD를 쪼개야 할때가 생긴다. 예를 들면 WM_LBUTTONDOWN와 같은 마우스 메시지의 lParam변수에는 마우스 좌표가 들어 있는데, X축은 하위 16비트, Y축은 상위 16비트에 존재 한다. 이때 상위, 하위 16비트를 쪼개어야 X축 Y축을 알 수 있다. 그렇다면 대충 코드 비트연산을 다음과 같이 할 수 있을 것이다. DWORD dwXPos = ((((DWORD)lParam)) & 0xffff); DWORD dwYPos = ((((DWORD)lParam >> 16)) & 0xffff); 이렇게 할 수 있지만 상당히 거추장스러운 코드 처럼 보인다. 이렇게 가독성이 떨어지는 코드를 막기위해 Windows SDK에서는 매크로를 정의해 놓았다... 2022. 6. 16.
C++/WinRT의 필요성 - 노트북 배터리 정보 구하기 마이크로소프트에서 수년간 유지해온 Win32 API를 밑에 두고 대 모바일 시대에 다양한 디바이스에서 일괄적인 인터페이스를 제공하기 위해 만든 Windows Runtime 라이브러리를 C++인터페이스로 사용할 수 있게 되었다. 그것이 바로 C++/WinRT . https://docs.microsoft.com/ko-kr/windows/uwp/cpp-and-winrt-apis/intro-to-using-cpp-with-winrt C++/WinRT 소개 - UWP applications Windows 런타임 API용 표준 C++ 언어 프로젝션인 C++/WinRT에 대한 소개입니다. docs.microsoft.com Win32 애플리케이션만 만들어온 개발자로써 좀 이해가 가지 않는다. 빠른빌드 속도, C++ 1.. 2021. 11. 18.
해커랭크(HackerRank) - Almost Sorted // C++ https://www.hackerrank.com/challenges/almost-sorted/problem Almost Sorted | HackerRank Sort an array by either swapping or reversing a segment www.hackerrank.com void segmentSort(vector* arr, int from, int to) { sort(arr->begin()+from, arr->begin()+to+1); } bool isASC(vector arr, int from, int to) { int prev = arr[from]; for(int i = from+1; i arr[i]) { return false; } prev = arr[i]; } return tru.. 2021. 5. 19.
해커랭크(HackerRank) - Strong Password / C++ 문제 : 해커랭크 - Strong Password 난이도 : easy 언어 : C++ https://www.hackerrank.com/challenges/strong-password/problem Strong Password | HackerRank How many characters should you add to make the password strong? www.hackerrank.com // Complete the minimumNumber function below. int minimumNumber(int n, string password) { // Return the minimum number of characters to make the password strong string numbers .. 2020. 6. 30.
해커랭크(HackerRank) - Climbing the Leaderboard / C++ 문제 : 해커랭크 - Climbing the Leaderboard 난이도: midium 언어 : C++ https://www.hackerrank.com/challenges/climbing-the-leaderboard/problem Climbing the Leaderboard | HackerRank Help Alice track her progress toward the top of the leaderboard! www.hackerrank.com // Complete the climbingLeaderboard function below. vector climbingLeaderboard(vector scores, vector alice) { vector aliceRank ; set scoreSet; for(.. 2020. 6. 29.
해커랭크(HackerRank) - Bon Appétit / C++ 문제 : 해커랭크 - Bon Appétit https://www.hackerrank.com/challenges/bon-appetit/problem Bon Appétit | HackerRank Determine whether or not Brian overcharged Anna for their split bill. www.hackerrank.com 난이도: Easy 언어 : C++ // Complete the bonAppetit function below. void bonAppetit(vector bill, int k, int b) { int annaToChargeSum = 0; int toRefund = 0; for(int i = 0 ;i 2020. 6. 26.
UINT32[4] IPv6를 스트링으로 변환하기 / MFC, C++ 이전에 쓴 IPv4 UINT32 자료형을 String으로 변환하는 것에 이어 이번에는 UINT32[4] 자료형으로 된 IPv6 String으로 변환해 보는 코드를 작성해 보았다. 물론 ipv6의 축약 포맷은 구현되지 않았다. IPv6는 128비트로 조합된 주소 형식이다. // UINT32 ipv6[4]; CString IPv6ToString(UINT32 ipv6[]) { CString strIPv6; strIPv6.Format(_T("%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x"), (ipv6[3] >> 16) & 0xFFFF, (ipv6[3] >> 0) & 0xFFFF, (ipv6[2] >> 16) & 0xFFFF, (ipv6[2] >> 0) & 0xFFFF, (ipv6[1].. 2020. 2. 19.