본문 바로가기

mfc

afx_msg의 의미 afx_msg는 MFC에서 메소드(이벤트 핸들러)를 오버라이딩 할 때 앞에 자동적으로 적히게 됩니다.afx_msg는 다음과 같이 정의되어 있습니다.#define afx_msg결론적으로 afx_msg는 아무 의미가 없는 정의입니다.afx_msg는 보통 virtual의 의미를 담고 사용합니다.virtual에 대한 내용은 아래의 링크를 통해서 확인할 수 있습니다.2014/12/03 - [Programming/C&C++] - 다형성과 가상함수부모클래스에서 virtual로 선언한 이후에 자식클래스가 구현할 수 있게 해주는 것입니다.부모만 virtual 선언하면 자식은 굳이 virtual을 선언하지 않아도 됩니다.그런데도 afx_msg를 사용하는 이유가 있습니다. 부모클래스의 메소드(함수) 중에는 virtual이 .. 더보기
MFC, API 프로그래밍에서 유니코드 처리하기 요즘은 거의 대부분 유니코드를 적용해서 프로젝트를 진행할 것으로 보입니다.멀티바이트 문자열을 받는 대부분의 Win32 API 함수들은 유니코드로 바꿔서 다시 유니코드 함수를 호출해줍니다.그러니 바로 유니코드 형식을 사용하는 편이 더 효율적이라고 할 수 있습니다.일반적으로 API 함수가 오류가 나면 함수명에 A나 W가 붙죠.MessageBox라는 메시지 박스를 띄우는 게 오류시 MessageBoxA / MessageBoxW로 표기가 됩니다.여기서 A냐 W냐가 멀티바이트 코드 함수, 유니코드 함수로 구분이 됩니다.멀티바이트 코드인가 유니코드 프로젝트인가를 확인해서 해당하는 API를 호출하는 것은 #define 전처리기를 통해 가능합니다.#define UNICODE로 정의되어 있으면 자동으로 유니코드 함수를 .. 더보기
MFC 클래스 계층도(hierarchy chart) MFC 클래스 계층도는 Visual Studio 2008 Feature Pack과 함께 더욱 방대해졌습니다.MFC의 대부분의 클래스는 CObject를 상속받습니다.CObject를 상속받지 않는 클래스도 일부 존재합니다.MFC 클래스 계층도는 다음과 같습니다.윈도우 컨트롤들은 CWnd를 상속받아서 작성되는 클래스로 되어 있습니다. 더보기
프로세스 목록 확인하기(작업 관리자) 작업 관리자는 현재 실행 중인 프로세스의 목록을 보여줍니다.작업 관리자와 유사한 형태로 현재 실행 중인 윈도우 목록을 보여주는 방법은 다음과 같습니다.군더더기 코드를 없애기 위해서 콘솔 프로젝트로 작성합니다.창의 타이틀, 파일명, PID 정도를 추출해서 출력하겠습니다.이것은 일단 EnumWindows()라는 API함수를 이용해서 가능합니다.이 함수는 현재 실행되는 윈도우들의 핸들값을 전부 하나씩 첫번째 인자인 함수에 보내줍니다.그리고 실제 처리는 EnumWindowsProc(이름은 바꿔도 됨)에서 해주게 됩니다. #include #include #include #include using namespace std; BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lPa.. 더보기
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.. 더보기