728x90
반응형

Program Language 197

[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..

[MFC] MDI 자식창 모두 닫기

작업을 위해서 띄어 놓은 다수의 창을 한꺼번에 닫는 일은 종종 발생한다. 모든 창을 한꺼번에 닫는 것은 자식 창을 모두 검색해야 할 것 같지만 MFC는 해당 기능을 지원한다. App Class에는 CloseAllDocument()라는 함수가 있다. 간단한 호출로도 모든 자식 창을 닫을 수 있다. theApp.CloseAllDocument(); 다양한 형태의 Document를 사용하고 있다면, 분명 CDocTemplate를 종류 별로 멤버 변수로 등록하고 사용하고 있을 것이다. 그럴 경우에는 멤버 변수 별로 호출하면 각각의 자식 창을 모두 닫을 수 있다. CDocTemplate* pTemplateDoc = theApp.m_pDocTemplate; pTemplateDoc->CloseAllDocuments(F..

[MFC] MDI에서 자식 창을 맨 앞으로 가져오기

MDI에서 ChildFrame을 관리하는 것은 생각보다 번거로운 일이다. CMainFrame에서 CChildFrame을 찾고 해야 한다. MDI에서 새로운 창을 만들 때에 가끔 동일 창을 호출하는 경우가 있다. 그럴 경우에는 창을 새롭게 만들 것이 아니라 만들어진 창을 맨 앞으로 끄집어 와야 한다. 보통 CChildFrame을 컨트롤할 때는 아래와 같이 한다. // CMainFrame 에서 라면, CWnd* pWnd = FindWindow(NULL, /*ChildWnd Name*/); pWnd->BringWindowToTop(); // 해당 창을 맨 앞으로 가져온다. 하지만 Caption의 이름이 바뀔 수도 있고, 관리하기도 쉽지 않다. 그래서 CMainFrame에 CChildFrame을 관리할 수 있는..

[MFC] MDI에서 시작 시 새 창 방지 코드

MFC에서 MDI로 프로젝트를 만들면, 실행 후 항상 새 창 하나가 나타난다. 이것을 방지하기 위해서는 App 파일의 InitInstance() 함수에 아래와 같은 코드를 집어넣어주면 된다. // Parse command line for standard shell commands, DDE, file open CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo); // 새창 열기 금지 if (cmdInfo.m_nShellCommand == CCommandLineInfo::FileNew) cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing; 함수가 끝나가기 직전에 위치하고 있다.

[MFC] MDI에서 새창 열기

CDocTemplate* pTemplateDoc = theApp.m_pDocTemplate; // App에서 멤버 포인터를 가져온다. pTemplateDoc->OpenDocumentFile(NULL); // 새창에 연다.​ m_pDocTemplate = new CMultiDocTemplate(IDR_DBAppTYPE, RUNTIME_CLASS(CDBAppDoc), RUNTIME_CLASS(CChildFrame), // custom MDI child frame RUNTIME_CLASS(CDBAppListView)); if (!m_pDocTemplate) return FALSE; AddDocTemplate(m_pDocTemplate); MDI에서 새창을 여는 것은 App에 선언된 메시지를 이용하는 방법이 가..

[MFC] 다이얼로그 캡션 변경

MFC에서 윈도우 창의 캡션을 변경하려면, 첫 번째로는 CMainFrame::PreCreateWindow에서 CREATESTRUCT를 변경하는 방법이 있다. BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !CFrameWnd::PreCreateWindow(cs) ) return FALSE; cs.style &= ~(FWS_ADDTOTITLE); // 캡션이 파일 읽어오기 등으로 바뀌지 않도록 변경 cs.lpszName = _T("MY APPLICATION"); // 원하는 캡션 작성 return TRUE; } 두 번째는 그냥 CMainFrame에서 SetWindowText(캡션명)을 호출하면 된다. CMainFrame이 아니라 다른 곳에서 변경하고 싶..

[MFC] MFC 컨트롤 서브클래싱 하기

MFC에서 컨트롤을 커스터마이징 하려면 서브 클래싱을 기본적으로 사용할 수 있어야 한다. 앞으로 여러 컨트롤을 커스터마이징 하는 방법을 포스팅할 예정이기 때문에 우선 서브 클래싱 하여 클래스를 만드는 방법부터 알아보자. 사실 익숙해지면 그냥 코드 상에서 수정하는 편이 더 편하다. 1. 프로젝트 (우클릭) > 추가 (우클릭) > 클래스 를 누르면 아래와 같은 창이 뜬다. MFC 콘트롤을 서브 클래싱 할 예정이므로 MFC Class를 선택한다. 2. Class Name은 새롭게 만들 클래스 이름이며, Base Class는 서브 클래싱 할 클래스 이름이다. 3. 생성된 클래스는 Base class를 상속한 형태로 만들어진다. 예로 CEdit를 Base Class로 하는 CMxEdit를 만들어 보았다. // C..

[MFC] CDockingPane Class 사용하기

예전에 그냥 쓰던 DockingPane을 사용하려고 하니 계속 Error가 발생했다. 여기저기 찾아봐도 그냥 사용하는 법만 있고 어떻게 사용해야 되는지는 생략되어 있었다. ( 그만큼 기본적이라는 건가.. ) 그래서 MFC의 CDockingPane을 적용하는 법을 정리해 둔다. Window : 유리들이 창틀에 끼여 집합된 창 Pane : 그냥 유리 한 장 Floating Pane : 떠다니는 유리 한 장 ( 어느 Window에도 끼어넣을 수 있는.. ) CDockingPane class를 MainFrame에 사용하려면 기존의 상속된 CFrameWnd(혹은 CMDIFrameWnd)를 사용할 수 없다. 상속받는 class를 CFrameWndEx(혹은 CMDIFrameWndEx)로 변경해야 한다. class C..

[MFC] Control 깜빡임 방지 코드

MFC에서 Control을 Update 하다 보면 깜빡임이 발생한다. 그럴 경우에 Update를 하고자 하는 기능 사이에 다음 함수를 추가하면 깜빡임을 해결할 수 있다. LockWindowUpdate(); - Control Update 중지 UnlockWindowUpdate(); - Contorl Update 중지 해제 아래와 같이 대량의 업데이트가 필요할 경우 깜빡임을 제거할 수 있다. LockWindowUpdate(); for (unsigned int row = 0; row < mcData.size(); row++) { InsertItem(row, CString(mcData[row].machID), 0); SetItemText(row, 1, CString(mcData[row].submachID)); ..

[C++] Implicit Linking/Explicit Linking 장단점

1. Implicit Linking (묵시적 링크) Implicit Linking은 정확하게 표현하면 Implicit Load Time Linking 이라 할 수 있는데 이는 해당 프로그램에서 사용될 DLL 정보를 프로그램에 내장하는 방법이다. 이렇게 하면 프로그램을 실행할 때 어떤 DLL이 필요한지 알려주어 프로그램이 착오 없이 실행된다. Implicit Linking으로 사용하고자 할 때는 해당 LIB 파일을 링크 옵션에 더해준 뒤 헤더 파일을 소스코드에 포함시키고 원하는 함수를 사용하면 되므로 간단하다. 2. Explicit Linking (명시적 링크) Explicit Linking은 Implicit Linking에 비해 그 사용이 까다롭지만 원하는 시점에 마음대로 올리고 내릴 수 있다는 점에서 ..

[C++] 타입추론 decltype(auto)

auto를 이용하면 표현식의 타입이 자동으로 연역된다. 만약 const 한정자가 붙어 있다면 const 속성을 없애버린다. decltype은 이런 효과가 없기 때문에 중복된 코드를 만들게 된다. C++14에서는 이 문제를 해결하기 위해 decltype(auto)를 도입했다. const string message = "Test"; const string& foo() { return message; } // foo()를 호출해서 그 리턴 값을 auto 변수에 담을 수 있다. auto f1 = foo(); 그런데 auto는 함수 foo()의 리턴 값이 가진 const 속성을 없애버리기 때문에 f1은 string 타입이 되며 복제본이 만들어진다. 만약 f1이 const 참조형을 유지하길 원한다면 아래처럼 명시적..

[C++] 가상 파괴자(Virtual Destructor)의 필요성

일반적으로 파괴자에서 처리해야 할 작업이 없으면 정의 자체를 안 하는 경우가 많다. 할당을 진행한 경우에는 파괴자를 정의하고 처리를 해줘야 하는게 정상이다. 파괴자가 필요할 때는 아래와 같다. - Base, Abstract class에서 파괴자 정의를 한 경우 (필요로 할 때) - Upcasting 될 여지가 있는 경우 #include using namespace std; class Person { public: ~Person() { cout

728x90
반응형