이번에도 MFC 프로그램을 다루면서 진행하게된 내용입니다. 🥶 정렬을 다시 해주어야하는데 단순히 숫자나 문자비교가 아니라 자기만의 기준으로 정렬을 해야할 때가 있을 수 있습니다. 그 방법을 공유해보록 하겠습니다. #include 먼저 벡터정렬을 해주기 위해 algorithm을 포함시켜 줍니다. // 사용할 벡터의 자료형 예시 typedef struct __ReindexData { int vsIndex; int row; int col; int orderNum; int realIndex; int orderIndex; } ReindexData; // 비교에 사용할 함수 정의 예시 bool compare(ReindexData a, ReindexData b) { if (a.col == b.col) { return..
MFC프로그램을 다루던 중에 파일을 다루어야 하는 일이 생겼습니다. 🥶 이 글에서 다룰 파일은 단순히 txt 파일로 되어있고 복잡한 바이트 단위로 저장돼있는 파일이 아니라 단순한 문자열을 다루고 있는 파일입니다. 예를 들면 위와 같은 파일입니다. 😮 추측을 한다면 첫 번째 줄의 3은 아래에 나올 데이터 개수인 것을 쉽게 알 수 있습니다. 그 아래 데이터를 보면 맨 앞에는 모두 0인 것을 보아하니 그냥 구분을 위해 0을 쓴 것 같습니다. 이후에는 연도 월 일 순으로 되어있고 뒤에도 어딘가에서 필요한 데이터라고 생각하면 되겠습니다. 문제는 위처럼 되어있는 텍스트 파일을 읽어와서 우리가 필요한 정보를 빼내야 한다는 것입니다. 😨 그럼 지금부터 방법을 설명해드리도록 하겠습니다. CStdioFile 이용해 보기 ..
190719-3 객체 : 정적인 상태 = 프로퍼티 기능 = 기능 [생산성] 재사용 확장성 유연성 수정성 유지보수 : trade off 캡슐화 상속 다형성 객체를 만드는 2가지 방법 #include using namespace std; class Point { }; int main() { Point p1; Point* p = new Point; } virtual 함수가 아닌것은 컴파일 시간대 그 함수가 정해진다. 어떤 함수를 호출할지 결정된다. virtual 함수는 컴파일 타임에 결정되지 않고. 다음에 virtual 함수 테이블을 검색해서 호출하라고 결정된다. 함수가 virtual 테이블에 저장되고 참조하여 사용하게된다. (좀더 느리다 그래서) class Point { int x; int y; public..
190718-2 MDI SDI 1.CWinApp 2.CFrameWnd 3.CDocument 4.CView MDI 1. CWinApp 2-1. CMDIFrameWnd 2-2. CMDIChildWnd 3. CDocument 4. CView Document Template : 데이터에 따라서 틀이 만들어 지더라. 데이터에 따라서 뷰가 결정되고 외관의 틀이 결정되고 리소스가 결정되고... BOOL CMDIApp::InitInstance() // 애플리케이션의 문서 템플릿을 등록합니다. 문서 템플릿은 // 문서, 프레임 창 및 뷰 사이의 연결 역할을 합니다. CMultiDocTemplate* pDocTemplate; pDocTemplate = new CMultiDocTemplate(IDR_MDITYPE, RUNT..
190718-1 생성(실행)순서 1. App객체의 생성자 2. Doc생성자 3. Frame생성자 4. View생성자 닫기 버튼 클릭! 5. View 소멸 6. Frame 소멸 7. Doc 소멸 8. (App 객체 소멸) OnCreate에서 자식윈도우를 선택 앱의 생성자 CSDIApp::InitInstance Doc생성자 Frame생성자 Frame::onCreate() View생성자 CSDIDoc::OnNewDocument CSDIView::OnInitialUpdate() m_pMainWnd->ShowWindow(SW_SHOW); CSDIApp::Run() 닫기 버튼 CSDIView::~CSDIView() CMainFrame::~CMainFrame() CSDIDoc::~CSDIDoc() (내부적으로 APP..
190717 - 4 사각 정보 이동 다이얼로그 만들기 이벤트 처리기를 Doc에 생성 출처링크 프레임은 어디서든지 메인프레임을 얻을 수 있다. #include "MainFrm.h" CMainFrame* pFrame = (CMainFrame*)AfxGetMainWnd(); void CCBDoc::OnRectmove() { CMoveDlg dlg; if (IDOK == dlg.DoModal()) { // TODO: 정보 변경 하는 코드 추가 POSITION pos = m_rtList.GetHeadPosition(); while (pos) { CRect& rt = m_rtList.GetNext(pos); rt.OffsetRect(dlg.m_nX, dlg.m_nY); } //방법1 pos = this->GetFi..
190717-3 스크롤은 별도의 커맨드 메세지가 발생되지 않는다. void CScrollDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { switch (nSBCode) { case SB_LINELEFT: m_nR = max(0, m_nR - 1); // 구간설정 시 팁 max,min을 사용한다. break; case SB_LINERIGHT: m_nR = min(255, m_nR + 1); break; case SB_PAGELEFT: m_nR -= max(0, m_nR - 5); break; case SB_PAGERIGHT: m_nR += min(255, m_nR + 5); break; case SB_THUMBTRACK://잡고 드래그 m..
190717-2 모달리스 다이얼로그 메인 프레임에 모달리스 다이얼로그를 만들어보자. 클래스 선언 void CMainFrame::OnModalless() { // if 이미 객체가 있다면 포커스 else 없다면 생성 if (m_pDlg == NULL){ m_pDlg = new CScrollDlg; m_pDlg->Create(IDD_DIALOG2, this); // this : parent setting m_pDlg->ShowWindow(SW_SHOW); } else { m_pDlg->SetFocus(); } } - 생성 및 포커스 주기 이후에 종료처리도 해주어야한다. X버튼 클릭시 화면에서 사라지지만 완전히 지워진건 아니다. [WM_CLOSE] x버튼 클릭시 발생하는 핸들러 추가 [PostNcDestroy..
190717-1 컨트롤 베이스 리소스의 클래스를 만들어야한다.(자동) 다이얼로그 리소스 생성 -> 오른쪽 마우스 클래스 생성 (모달 다이얼로그를 띄우는 코드) 이벤트 처리기 추가 -> 헤더 include후 사용. void CCBDoc::OnModal() { CTestDlg dlg; // 객체 생성 if (dlg.DoModal() == IDOK) AfxMessageBox(_T("OK 누름")); else AfxMessageBox(_T("CANCEL 누름")); } - 버튼 클릭시 처리하기 - 모달리스 다이얼로그 : 모달 다이얼로그 보다는 복잡하다. (이는 잠시후에 해보겠다.) - 안에 있는 텍스트박스, 버튼의 부모는 다이얼로그다. 버튼 두번 클릭시 자동으로 가장 많이 사용되는 Clicked 처리기가 추가된..
190716-2 - 내일은 컨트롤과 윈도우 - 뷰는 Paint() 에서 그린다. Paint()에서는 document를 참고하여 그린다. 하나라도 수정이 된다면 SetModifiedFlag(true)를 하면된다. - 새로운 문서(ctrl+n 등)를 했을 때 1. 'DeleteContents()' 2. 'OnInitialUpdate()' -직렬화 객체 포메터 스트림(파일스트림, 네트워크스트림 등) IO 장치에 입출력을 한다. 프로그램을 껏다가 켯을 때 필요한 객체들(객체집합)만 복원하면된다. 복원할 때 어떤 데이터인지를 알려면 해당 정보를 모두 저장해야한다. (모든 정보가 필요하다) 그리고 복원시에 포멧을 보고 알아내어 데이터를 복원해야한다. 시리얼라이즈(직렬화) -> 저장을 할 때는 복원가능한 바이트배열로..