728x90
반응형

Program Language/API | MFC 28

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

728x90
반응형