728x90
반응형

Program Language/API | MFC 26

[MFC] Control의 Style 비교하기

MFC에서 Control들의 기능을 변경하기 위해서 CustomDraw를 하다 보면 Control을 속성을 확인해야 할 때가 있다. 그중에서도 특히 Style에 대한 비교가 필요한데 GetStyle()로 받을 수 있는 Style 옵션은 GetStyle()에서 Return 받은 값으로 바로 비교가 불가능하다. 스타일을 비교하려면 아래와 같은 작업이 필요하다. UINT nButtonStyle = GetWindowLong(m_hWnd, GWL_STYLE) & 0x0000000F; if (nButtonStyle == BS_GROUPBOX) { ... } } MFC에서 사용하는 스타일은 아래와 같다. 자신이 필요한 스타일을 비교하여 Control을 Customizing 하는 데 사용할 수 있다. MFC에서 사용하..

[MFC] Frame Caption 고정하기

Single/Multi Document 에서 상단 Caption은 보통 '제목없음 - 프로젝트 이름'으로 나타난다. 이를 해결하기 위해서는 Frame의 Style 설정에서 TITLE을 변경하면 된다. BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !CFrameWnd::PreCreateWindow(cs) ) return FALSE; // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs cs.style &= ~(FWS_ADDTOTITLE); cs.lpszName = L"User Application"; return TRUE; } Frame Style에서 FW..

[MFC] CString ↔ BSTR

BSTR은 여간해서 쓸 일이 잘 없는데, ATL을 쓰다 보면 종종 써야 해서 정리한다. BSTR은 Visual Basic 개발팀에 의해 만들어졌는데, Visual Basic이 포인터를 지원하지 못했기 때문이다. 그래서 IDispatch 인터페이스를 만들었다. Visual Basic과 COM 객체가 원활히 통신하기 위해서 COM에서 Visual Basic 문자열 타입을 지원하게 되는 결과로 만들어진 것이 바로 BSTR(Basic String)이다. BSTR은 COM에서 유니코드 문자열을 나타내는데 자주 사용된다. // BSTR -> CString BSTR bstr = ::AllocSysString(L"ABCD"); CString str = (CString) bstr; // CString -> BSTR CS..

[ATL/MFC] 32Bit Software를 64Bit Software에서 사용하기

C++에서 x86, x64 프로그램은 서로 호환해서 사용할 수 없어서 별도로 만들어 사용해야 한다. 모든 프로그램을 자신 혹은 팀이 만들어 나간다면 아무런 문제가 없다. 하지만 외부로부터 제공되는 라이브러리나 개발이 종료된 라이브러리의 경우 32bit만 존재하는 경우가 종종 있다. 이럴 경우 두 프로그램의 통신을 이용하여 사용할 수 있다. 32bit 프로그램을 ATL로 둘러싸서 서버를 만든 후 64Bit 프로그램에서 해당 서버와 통신을 하게 된다. 서버 만들기 (ATL Project) Visual Studio에서는 ATL을 이용하여 서버 프로그램을 간단히 만들 수 있다. C++ 프로젝트에서 ATL/ATL Project를 선택한 뒤, Service(EXE)를 선택한 후 프로젝트를 생성한다. ServerX8..

[MFC] Control 보여주고 숨기기 (확인하기)

MFC에서 GUI를 구성할 때 사용하는 Control은 조건에 따라서 보여주거나 숨겨야 한다. 이때 사용하는 함수가 ShowWindow()이다. 편법으로는 MoveWindow()를 이용하여 Size를 0으로 만들어주면 되기도 한다. CEdit m_edit; // 라고 선언했다면, m_edit.ShowWindow(SW_SHOW); // 보여주기 m_edit.ShowWindow(SW_HIDE); // 숨기기 이때, SHOW/HIDE 상태를 확인하기 위해서는 IsWindowVisible() 함수를 사용할 수 있다. 물론 CEdit를 Subclassing 하여 OnShowWindow() 이벤트 내에서 선언된 변수에 정보를 저장하여 알 수도 있다. if (!m_edit.IsWindowVisible()) // SW..

[MFC] 따라하기 06. 순차적으로 원 그리기

1. 프로젝트 예제에 사용되는 내용 구동하는 시스템 제어하기 순차적으로 구동하는 시스템 만들기 [MFC] 따라하기 05. 여러 개의 원 그리기 1. 프로젝트 예제에 사용되는 내용 구동하는 시스템 제어하기 여러 시스템 구동하기 [MFC] 따라하기 04. 원이 그려지는 동작 만들기 1. 프로젝트 예제에 사용되는 내용 원을 이루는 함수 구하기 Clie stormpy.tistory.com 2. flag로 동작 구현하기 기존에 Timer의 동작으로 구동하던 방법을 bool 변수를 사용하여 그리기/멈추기를 구현해 보자. 3개의 start_flag를 배열로 만들어서 그리기 동작을 제어할 수 있다. 하나가 작업이 끝나면 다음 작업이 실시될 수 있도록 만들자. BOOL CDrawCircleDlg::OnInitDialog..

[MFC] TreeCtrl Node 모두 확장하기

CTreeCtrl을 사용하여 아이템을 추가한 경우, 모두 닫혀 있게 되는데 매번 모두 여는 작업은 귀찮을 수 있다. 이를 위해서 한꺼번에 확장하는 함수를 만들어서 사용하게 된다. 우선 ITEM의 확장을 위해서는 간단하게 아래와 같이 만들 수 있다. ( 예는 Subclassing 한 경우다.) void CMxTreeCtrl::ExpandTree(HTREEITEM hItem) { if (this->ItemHasChildren(hItem)) { Expand(hItem, TVE_EXPAND); HTREEITEM hChild = GetChildItem(hItem); if (hChild) { do { ExpandTree(hChild); } while (hChild = GetNextSiblingItem(hChild)..

[MFC] ID_FILE_OPEN 재정의

Frame이 있는 프로젝트를 실행할 때, 기본적으로 제공하는 ID_FILE_OPEN의 경우, 이벤트를 실행하면 파일 다이얼로그가 열리고 해당 경로는 Document의 OpenDocumentFile를 호출하게 된다. 이때 읽을 파일의 확장자나 기능으로 추가하기 위해서는 재정의를 할 필요가 있다. BEGIN_MESSAGE_MAP(CTaskViewApp, CWinAppEx) ON_COMMAND(ID_APP_ABOUT, &CTaskViewApp::OnAppAbout) // Standard file based document commands ON_COMMAND(ID_FILE_NEW, &CWinAppEx::OnFileNew) ON_COMMAND(ID_FILE_OPEN, &CWinAppEx::OnFileOpen) E..

[MFC] App 혹은 Dll에서 콘솔 사용하기

DEBUG 모드에서 콘솔을 사용하면 LOG를 실시간으로 확인할 수 있기 때문에 편리하다. Dll이나 Application에서 콘솔을 사용하는 방법은 두 가지다. 첫 번째는 서브시스템으로 콘솔을 링크를 하는 것이다. #pragma comment(linker, "/subsystem:console") 해당 코드를 기입하면 콘솔 프로그램에서 사용할 수 있는 cout 등을 이용할 수 있다. 두 번째는 AllocConsole() 함수를 이용하는 것이다. AllocConsole() 함수를 실행한 후에는 WriteConsole() 함수로 콘솔에 텍스트를 적을 수 있다. 편리하게 사용하기 위해서 sprintf처럼 만들어 사용할 수 있다. #define dp(fmt,...) topeng::dbg_print( fmt, __..

[MFC] 시스템 메뉴 삭제

Application에서 시스템 메뉴를 삭제하는 방법은 가장 쉽게는 아래와 같다. BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !CFrameWnd::PreCreateWindow(cs) ) return FALSE; // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs cs.style &= ~WS_SYSMENU; // 시스템 메뉴 삭제 return TRUE; } 윈도우 스타일에서 SYSMENU를 제거하는 방법이다. 이것은 메뉴 및 버튼 그리고 아이콘까지 모두 삭제하기 때문에 디자인 면에서 좋지 않다. GetSystemMenu(FALSE)->EnableMen..

[MFC] Frame 크기 고정하기

MFC에서 Frame 크기를 고정하기 위해서는 CMainFrame 클래스의 ON_WM_GETMINMAXINFO 메시지를 사용해야 한다. ON_WM_GETMINMAXINFO메시지를 추가하면 OnGetMinMaxInfo 함수가 생성된다. void CMainFrame::OnGetMinMaxInfo(MINMAXINFO* lpMMI) { lpMMI->ptMinTrackSize.x = 프레임 너비; lpMMI->ptMinTrackSize.y = 프레임 높이; lpMMI->ptMaxSize.x = 프레임 너비; lpMMI->ptMaxSize.y = 프레임 높이; CFrameWnd::OnGetMinMaxInfo(lpMMI); } 과 같이 작성하면 된다. 프레임을 화면 크기로 유지하려면 PreCreateWindow()에..

[Win32] <xmllite.h> 사용 시 redefinition Error 발생 시

XML 파일을 읽어오는 프로그램을 작성하다가 이전 프로젝트에서는 문제가 없었는데, 새로 만들려고 하는 프로젝트에서 계속 redifintion 관련 에러가 마구 쏟아져서 열받고 있었는데.. 가 필요한 것을 알게 되었다. 이것은 CString을 사용하게 해주는 헤드 파일인데.. 가 CString을 사용하는 것 같다. 우선 클리어.

[MFC] CTreeCtrl에서 Icon 삽입하기

CTreeCtrl에 Icon을 넣으면 시인성을 높일 수 있다. 그리고 Drag & Drop을 하려면 Icon이 필요하다. 아이콘을 만들려면 resource에 bmp 파일을 만들어 두어야 한다. 요렇게 만들자. 사용하려고 하는 동일 크기의 사이즈만큼 연속해서 붙이자. ID는 IDB_TREE_NODE라고 정했다. // 서브클래싱 상태로 코딩한다고 가정한다. // 컨트롤러를 선언해서 한다면 앞에 선언한 변수를 포함시키면 된다. CBitmap bmp; bmp.LoadBitmap(IDB_TOOLBAR_NODE); // BITMAP ID는 IDB_TOOLBAR_NODE라고 정했다. m_imageList.DeleteImageList // 멤버 변수로 CImageList를 m_imageList라고 선언해 두었다. //..

[MFC] 스크롤바 유무확인

UI에서 Autolayout을 구현하다 보면, 창의 크기에 따라서 스크롤바가 나타났다가 사라졌다가 한다. 스크롤바에 가려지는 콘텐츠가 없도록 하려면 스크롤바의 굵기만큼 조절해 줘야 한다. 처음에는 창의 크기와 콘텐츠들의 크기를 비교해가면서 Layout을 맞췄지만, 가로, 세로 스크롤바가 생성되는 부분에서 계산이 제대로 되지 않았다. 그래서 스크롤바 유무를 확인해서 방법을 알아보니 다음과 같이 하면 되었다. if (GetStyle() & WS_VSCROLL) { SCROLLINFO scrollInfo; GetScrollInfo(SB_VERT, &scrollInfo, SIF_ALL); widthColumn += scrollInfo.fMask; } 혹시 안되게 되면 스크롤바가 어느 UI에서 생기는 것인지도 알..

[MFC] MDI에서 자식창 크기 조절하기

MDI 프로그램을 하고 있는데, CChildFrame의 크기를 조절해야 해서 MoveWindow를 사용하려고 하니 Frame 좌측 상단 좌측을 정확하게 찾을 수가 없었다. 그래서 여러 가지 조합을 사용했는데 미세하게 오차가 나서 고민하는 차에 SetWindowPos를 하면 되나 싶어서 사용하니 쉽게 된다. SetWindowPos(NULL, 0, 0, frameRect.Width(), frameRect.Height(), SWP_NOMOVE); 몇 시간을 Layout 잡는데 허비했다. 주의할 점은 꼭 Frame을 핸들로 잡고해야 한다는 것이다.

[MFC] SendMessage로 문자 보내기

SendMessage의 WPARAM과 LPARAM에 정수형 데이터를 실어 나르기는 어렵지 않다. 그렇다면 String들은 어떻게 전달할 수 있을까? 포인트를 이용하면 쉽게 전달할 수 있다. // 보내는 쪽 CString cellText; cellText = GetItemText(m_nItem, m_nSubItem); GetParent()->SendMessage(WM_MX_EDITCHANGED, (WPARAM)&cellText, NULL); // (WPARAM)&cellText 참조자에 WPARAM을 캐스팅하여 전달한다. 받을 때에는 CString으로 캐스팅하면 된다. LRESULT CDBAppListView::OnEditChanged(WPARAM wParam, LPARAM lParam) { CString..

728x90
반응형