[C++] template, 템플릿 사용 예제 – 1. 함수 템플릿, 특수화

template는 매개변수의 타입에 따라 함수나 클래스를 생성하는 C++의 일반화 프로그래밍의 메커니즘입니다.template를 사용하면 같은 작업, 다른 매개변수에 따라 동작하는 함수나 클래스를 한번에 정의할 수 있습니다. 함수 템플릿은 다음과 같은 방식으로 사용합니다. typename키워드 대신 class 키워드를 사용하셔도 됩니다.(C++ 98 부터 typename 키워드 추가됨) 아래 예제는 두개의 매개 변수의 합을 표시하는 Sum 함수를 template로 작성한 것입니다. 위 함수를 … Read more

[C++] 각도, 길이로 원하는 좌표값 구하기

이번 글에서는 특정한 좌표에서 각도, 거리를 입력했을 때 좌표를 구하는 방법을 알아보겠습니다. 해당 방법을 알기 위해서 삼각함수(sin, cos)를 사용해야하는데 이 함수들은 매개변수로 라디안을 사용합니다.보통 일반적으로 사용하는 0도, 90도, 180도 등등은 60분법(Degree)이라 합니다. 그리고 라디안은 호의 길이를 이용한 호도법(Radian)을 사용하는데, 예를 들어 반지름이 r인 원에서, 호 AB가 길이가 r일 경우, 그 각을 a라 해봅시다. 이 부채꼴 호의 중심각인 a의 … Read more

[WinAPI] SetWindowDisplayAffinity, Application Content 보호

이번 글에서는 윈도우의 내용을 보호하는 Windows API 함수, SetWindowDisplayAffinity에 대해 알아보겠습니다. SetWindowDisplayAffinity 를 사용하기 위해선 아래 조건을 만족해야 합니다. Minimum supported client Windows 7 [desktop apps only] Minimum supported server Windows Server 2008 R2 [desktop apps only] Header winuser.h (include Windows.h) Library User32.lib DLL User32.dll SetWindowDisplayAffinity 함수 원형은 아래와 같습니다. 첫번째 인자는 윈도우의 핸들이고, 두번째는 WDA_MONITOR, WDA_NONE 중 하나를 인자로 사용하시면 됩니다.WDA_MONITOR는 보호, WDA_NONE는 보호 해제입니다.반환 값은 해당 작업이 성공하면 TRUE, 실패하면 FALSE 입니다. MFC 대화상자에 아래와 … Read more

[WinAPI] CommandLine 사용하기

아래와 같이 프로젝트 속성에서 명령 인수를 사용하면 쉽게 command를 전달할 수 있습니다. C, C++에서 CommandLine을 사용할 때, main의 인자값인 int argc, char *argv[]를 사용합니다. 콘솔기반 C, C++에서는 아래와 같이 사용합니다. 위 코드의 실행 결과는 아래와 같습니다. Command가 있건 없건 0번째 인자에는 프로그램의 실행경로가 나오고, 그 이후부터 입력한 명령줄이 나옵니다. MFC에서는 아래 두가지 방법 중 하나를 … Read more

[WinAPI] Compress, Decompress 압축 API 사용하기

이번 글에서는 데이터를 압축하는 Windows API를 알아보겠습니다. Compress를 사용하려면 아래 헤더파일과 라이브러리를 추가해야합니다. 압축을 위해선 우선 핸들을 만들어야 합니다. 만들어진 핸들을 이용하여 우선 압축 사이즈를 구합니다. 사이즈가 정상적으로 반환이 되면 실제 압축을 진행합니다. 압축이 모두 정상적으로 실행되면 핸들을 닫아줍니다. 위 과정을 진행하면 pucComp 변수에 압축된 데이터가 있습니다. 이제 반대 과정인 압축 해제 함수를 알아보겠습니다.압축과 비슷하게 … Read more

[MFC] Progress Control 사용법

이번 글에서는 Progress Control 사용법에 대해 알아보겠습니다.Progress Control은 아래와 같이 사용자에게 진행률을 표시할 때 매우 직관적으로 보여주는 컨트롤입니다. MFC 프로젝트 생성후 도구상자에서 Progress Control을 추가해줍니다. Progress Control을 사용하기 전에 범위를 지정해줘야합니다. 해당 함수는 SetRange 입니다. 범위 지정 값은 0 ~ 65,535까지 할 수 있습니다. Progress Control Bar의 위치를 변경하려면 SetPos를 사용하시면 됩니다. Bar의 현재 위치를 알기위해서는 … Read more

[WinAPI] GetPrivateProfileSection, Section안의 모든 문자 읽어오기

이번글에서는 GetPrivateProfileSection에 대해 알아보겠습니다. GetPrivateProfileString을 사용하여 ini에 값을 읽어오는 글을 쓴 적이 있습니다.(링크)GetPrivateProfileString은 하나의 section과 하나의 key값에 대해 값을 읽어오는 것을 해봤습니다. GetPrivateProfileSection은 GetPrivateProfileString, GetPrivateProfileInt와 비슷하지만 Key가 없이 Section의 내용을 모두 읽어온다는 것이 특징입니다. 함수 원형은 아래와 같습니다. 반환값은 버퍼에 복사된 문자수 입니다. 만약 버퍼 크기가 충분치 않으면 nSize – 2값이 반환 됩니다.예시를 만들어보겠습니다. 우선 아래와 … Read more

[WinAPI] SetCapture, ReleaseCapture, 영역 밖에서도 WM_MOUSEMOVE 받기

발을 하다보면, 프로세스 영역 바깥에서는 WM_MOUSEMOVE 이벤트가 받아지지 않습니다. 이렇게 마우스가 영역 밖으로 이동했을 때 WM_MOUSEMOVE를 받고 싶으면 SetCapture, ReleaseCapture를 사용합니다.SetCaptrue 함수 원형은 아래와 같습니다. 이전에 SetCapture를 했던 HWND가 있다면 이전 HWND를 반환합니다. 없다면 NULL을 반환합니다.SetCapture를 했다면 후에 ReleaseCapture를 호출해야합니다.ReleaseCapture를 하면 영역 밖에서 WM_MOUSEMOVE가 더 이상 받아지지 않습니다. ReleaseCapture 함수 원형은 아래와 같습니다. 함수가 실패하면 return … Read more

[WinAPI] 리틀엔디안, 빅엔디안(htons, ntohs, htonl, ntohl)

이번 글에서는 엔디안에 대해 간단히 알아보고 Visual C++에서 어떻게 변환해야하는지 알아보겠습니다. 엔디안은 컴퓨터 메모리에 연속된 대상을 배열하는 방법을 말하며 바이트를 배열하는 방법을 말합니다.엔디안은 리틀엔디안, 빅엔디안, 미들엔디안이 있으며, 리틀엔디안 빅엔디안의 차이는 아래와 같습니다. 프로세서는 CPU아키텍쳐에 따라 다를수 있습니다만 네트워크상에서는 빅엔디안을 사용합니다. 빅엔디안과 리틀엔디안의 저장 방식을 가시적으로 보면 아래와 같습니다. 해당 저장 방식을 고려해야하는 때는 보통 서로 다른 프로세서끼리 … Read more

[MFC] WOL(wake on lan) 원격으로 컴퓨터 전원 켜기 구현해보기

WOL(wake on lan)은 컴퓨터가 특정 네트워크 데이터 패킷을 받으면 부팅이 되는 기능입니다.그 특정 데이터 패킷을 매직 패킷이라고 하고, 컴퓨터는 윈도우를 종료하더라도 대기 전력을 사용하여 매직 패킷을 감지합니다.매직 패킷에는 맥 주소가 일정한 규칙으로 입력되어 있는데 컴퓨터에서는 자신의 맥 주소를 비교하여, 같으면 부팅합니다.매직 패킷의 첫 6 Bytes는 0xFF FF FF FF FF FF로 입력 되어 있고, 부팅을 하려는 … Read more