본문 바로가기

c++

API, MFC에서 사용하는 변수형 API, MFC를 처음 공부하면 생소한 변수 타입을 자주 접하게 됩니다. API, MFC에서 주로 사용되는 변수 타입은 다음과 같습니다.BOOL기존의 bool(true, false의 값을 가짐)BSTR32비트 문자 포인터BYTE8비트 부호 없는(unsigned) 정수COLORREF색 지정에 사용되는 32비트값(RGB매크로 사용으로 생성 가능)DWORD32비트 부호 없는(unsigned) 정수, 세그먼트 어드레스 / 옵셋LONG32비트 부호 있는 정수LPARAM윈도우 프로시저 또는 콜백 함수의 인수로서 넘어가는 32비트 값LPCSTR문자열 32비트 포인터(const 속성)LPSTR문자열 32비트 포인터LPCTSTR정수문자열로의 32비트 포인터(Unicode 지원)LPTSTR문자열로의 32비트 포인터(Uni.. 더보기
MFC에서 프로그램의 hInstance와 hWnd 구하기 MFC에서 hInst와 hWnd를 필요로 할 때가 있습니다.Win32 API함수 등을 이용할 때 사용해야 할 필요가 생깁니다. // hInstance를 구하는 법 AfxGetInstanceHandle(); // hWnd를 구하는 법 GetSafeHwnd(); 이 2개를 이용해서 사용하면 됩니다.예제 코드는 다음과 같습니다. ::SetWindowLong(GetSafeHwnd(), GWL_EXSTYLE, ::GetWindowLong(GetSafeHwnd(),GWL_EXSTYLE) | WS_EX_LAYERED); this->SetLayeredWindowAttributes(RGB(0, 0, 255), 128, LWA_ALPHA | LWA_COLORKEY); 윈도우를 투명하게 만들어주는 코드로 GetSafeHwn.. 더보기
윈도우 리전(Region) 설정해서 윈도우 모양 바꾸기 윈도우 리전(Region)은 똑같은 사각형 형태의 밋밋한 윈도우의 모습을 바꿔줍니다.자기가 만들고 싶은 모양을 얼마든지 만들 수 있습니다.윈도우 리전을 생성하는 API함수는 다음과 같이 있습니다.CreatePolygonRgn(); CreateRectRgn(); CreateEllipticRgn();딱 봐도 그 용도가 보이는 참 착한 함수입니다.Polygon은 다각형, Rect는 사각형, Elliptic은 원을 그리는 용도로 쓰입니다.이 함수들 외에도 생성된 리전을 합쳐주는 함수와 만들어진 리전을 화면에 세팅하는 함수가 있습니다.CombineRgn(); SetWindowRgn();이 함수들이 그런 역할을 수행하는 함수입니다.CombineRgn() 은 만들어진 리전을 합치는데 사용하는 함수입니다.SetWind.. 더보기
다중 실행 방지 코드(CreateMutex) 프로그램을 보면 하나의 프로세스(실행되어진 프로그램)만 허용하는 경우가 있습니다.보통 게임에서 물가 안정 등의 이유로 다중 실행 방지를 많이 사용합니다.그래서 그걸 깨는 멀티로더들도 암암리에 제작이 됩니다.다중 실행을 방지하는 코드는 뮤텍스라는 걸 사용합니다.물론 뮤텍스가 아닌 다른 커널 오브젝트를 사용해도 가능합니다.뮤텍스는 커널 오브젝트기 때문에 모든 프로세스를 통틀어서 하나만 존재합니다.이 뮤텍스가 중복되는 지 확인(이미 존재하는가 확인)하면 되는것이죠.이 뮤텍스를 이용한 방법을 알아보도록 하겠습니다. #include #include HANDLE hMutex = nullptr; int main() { hMutex = ::CreateMutex(nullptr, TRUE, _T("Unique_Name_o.. 더보기
[C++11] cbegin()과 cend(), crbegin()과 crend() C++의 STL 컨테이너들은 Iterator(반복자)를 통해서 내부에 있는 데이터의 한 위치를 가리킬 수가 있습니다.Iterator의 종류는 Input, Output, Foward, Bidirectional, Random Access로 구분할 수 있습니다.Input과 Output은 각각 출력과 입력만을 담당하는 최소한의 기능을 가지고 있는 Iterator입니다. Foward의 경우는 순방향 Iterator로 한 쪽으로(처음 -> 끝) 이동하는 Iterator입니다.Bidirectional은 이름 그대로 양방향으로 이동이 가능한 Iterator입니다.Random Access는 랜덤하게 한 곳을 콕 찝어서 이동이 가능한 Iterator입니다.Input -> Foward -> Bidirectional -> R.. 더보기
[C++11] final과 override C++에서는 명시적으로 클래스의 상속을 막는 방법이 없었습니다.C++ CLI 등에서 selaed라는 키워드가 존재했지만 이것은 표준이 아닌 MS 확장 키워드입니다.C# 역시 sealed라는 키워드를 사용합니다.C#의 sealed 키워드에 대한 내용은 다음 링크에서 확인 가능합니다.2014/12/27 - [Programming/C#] - sealed 키워드를 사용한 클래스 상속 방지C++ CLI나 C#이나 모두 닷넷을 지원하기 위해서 만들어진 것을 생각하면 공통된 특정 키워드가 있는 것이 이해가 갑니다.C++11에서는 상속을 정교하게 다루기 위해 final과 override라는 새로운 키워드가 추가되었습니다.final은 상속을 차단하기 위해 추가된 키워드이고, override는 클래스의 메소드를 명시적으로.. 더보기
[C++11] RValue Reference(3) 5. Forwarding Problem과 Perfect FowardingFowarding Problem은 레퍼런스 타입을 매개 변수로 갖고 있는 제너릭 함수에서 발생할 수 있습니다.레퍼런스 타입의 매개변수를 다른 함수에 전달해 주는 과정에서 발생할 수 있습니다.예제를 먼저 확인하겠습니다. struct W { W(int&, int&){} }; struct X { X(const int&, int&){} }; struct Y { Y(int&, const int&){} }; struct Z { Z(const int&, const int&){} }; template T* factory(A1& a1, A2& a2) { return new T(a1, a2); } int main() { int a = 4, b = 5;.. 더보기
[C++11] RValue Reference(2) 3. Move SemanticsRValue Reference는 Move Semantics를 통해서 성능 향상이 가능합니다.객체의 리소스를 다른 객체로 이동시켜주는 것이 Move Semantics입니다.왜 기존의 복사가 아닌 이동을 사용해야 되는가에 대한 이유는 다음과 같습니다.RValue가 표현식 이후에 어디에서도 참조할 수 없는 임시적인 값이기 때문에 복사 대신 이동을 하는 것입니다.LValue라면 리소스의 이동을 해버리면 원본이 훼손되는 문제가 있지만 RValue는 그런 문제가 생기지 않습니다.이 Move Semantics의 이점은 복사 생성자, 복사 대입 연산자 등에서 발생하는불필요한 리소스의 할당 및 복사, 해제의 과정을 생략할 수 있다는 점입니다.STL의 vector를 통해서 자세히 알아보도록 .. 더보기