본문 바로가기

Programming/Win32&MFC&COM

MFC 다이얼로그, SDI, MDI의 최소 크기(Size) 설정 MFC에서 프로젝트를 만들 때 SDI, MDI, 다이얼로그 중에 하나를 선택합니다.만들어진 창이 최소 크기나 최대 크기가 정해지면 좋을 때가 있습니다.버튼들이 배치가 되어있는데 창이 타이틀만 남겨놓고 줄어드는 것은 그리 좋아 보이지 않습니다.이 창들의 최소 크기를 정하는 방법을 알아보겠습니다.같은 방법으로 이 방법으로 최대 크기의 수정도 가능합니다.먼저 프로젝트를 생성하면 다음과 같이 MainFrm.h가 생깁니다.SDI, MDI에서는 MainFrm.h이지만 다이얼로그에서는 약간 다르게 생성이 됩니다.프로젝트명Dlg.h 라는 파일이 생기게 됩니다.각자 해당하는 파일을 엽니다.여기서는 SDI를 기준으로 설명하겠습니다.헤더 파일에 커서를 주면 좌측에 속성에 다음과 같이 나오게 됩니다.그럼 빨간색 네모 안의 아.. 더보기
MFC의 CFileFind를 이용한 파일명 열거 MFC에서는 파일을 찾고 나열하기 쉽도록 CFileFind라는 클래스가 존재합니다.이 클래스를 사용하면 굉장히 편리하게 파일을 나열할 수 있습니다.소스 코드는 다음과 같습니다.찾을 파일의 형식이나 파일명을 지정하고 검색을 하시면 됩니다.이것은 MSDN에 나온 예제입니다. CFileFind finder; BOOL bWorking = finder.FindFile("*.*"); while (bWorking) { bWorking = finder.FindNextFile(); cout 더보기
CRect의 DeflateRect() 메소드 CRect는 사각형의 좌표를 저장하고 이 좌표를 더 유용하게 쓸 수 있는 메소드를 갖고 있는 클래스입니다.이 클래스 중에는 DeflateRect()라는 메소드가 존재합니다.이 메소드는 Deflate의 의미(오므라들다, 수축시키다)와 같이 사각형 정보를 줄이는 역할을 합니다.DeflateRect()가 어떻게 찌그러뜨리는지 확인해 보도록 하겠습니다. 간단하게 다이얼로그 기반으로 만들고 OnPaint() 부분을 조금 수정해 줍니다. void CAlwaysOnTopDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetS.. 더보기
메모리DC를 이용한 더블버퍼링으로 그리기 일반적으로 비트맵을 화면에 출력할 때는 더블 버퍼링이라는 방법을 사용합니다.출력을 할 때 바로 화면에 출력하는 것이 아닌 메모리에 먼저 그리고 그려진 내용을 화면에 출력하는 것입니다.이 방법을 사용하면 그림을 그릴 때 깜빡거리는 현상을 줄일 수 있습니다.계속 화면에 출력하는 것보다 메모리에 다 그리고 그려진 내용을 화면에 한 번에 출력하기 때문입니다.보통 비트맵을 이렇게 그리지만, 그래프 등 출력이 많이 발생하는 경우에 활용이 가능합니다.비트맵이 아닌 일반 선, 도형 등을 더블 버퍼링을 이용해서 출력하는 방법을 설명하도록 하겠습니다.기준은 MFC 기준이고, Win32 API 기반에서도 충분히 활용이 가능합니다.OnPaint()에서 적용하는 방법입니다.WM_PAINT 처리 함수인 OnPaint() 함수를 .. 더보기
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로 정의되어 있으면 자동으로 유니코드 함수를 .. 더보기
Windows 메시지의 구조와 처리 Windows 프로그래밍은 메시지를 기반으로 하는 프로그램을 작성합니다.Windows는 메시지를 끊임없이 발생시키고 이 메시지를 처리하게 만들어 주는 것입니다.Win32 프로그래밍을 하다보면 메시지 루프라는 용어가 쓰입니다.이 부분이 메시지를 받아서 메시지를 처리하는 부분이 됩니다.WinMain에는 다음과 같은 코드가 들어가 있습니다. MSG msg; HACCEL hAccelTable; // Initialize global strings LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadString(hInstance, IDC_WIN32PROJECT1, szWindowClass, MAX_LOADSTRING); MyRegisterClass.. 더보기
MFC 클래스 계층도(hierarchy chart) MFC 클래스 계층도는 Visual Studio 2008 Feature Pack과 함께 더욱 방대해졌습니다.MFC의 대부분의 클래스는 CObject를 상속받습니다.CObject를 상속받지 않는 클래스도 일부 존재합니다.MFC 클래스 계층도는 다음과 같습니다.윈도우 컨트롤들은 CWnd를 상속받아서 작성되는 클래스로 되어 있습니다. 더보기