void CMainFrame::OnMenuSchoolAdd()
{
 // TODO: Add your command handler code here
 CSchoolAdd CSA;
 CSA.DoModal();
}

void CMainFrame::OnMenuSchoolList()
{
 // TODO: Add your command handler code here
 SchoolList SL;
 SL.DoModal();
}

void CMainFrame::OnTrash()
{
 // TODO: Add your command handler code here
 CTrash TR;
 TR.DoModal();
}

모달창 - Multi dialog 상태에서 현재 뜬 창을 제외하고 다른 창으로 이동이 불가능한것
모달리스창 - Multi dialog 상태에서 현재 뜬 창과 다른 창들을 번갈아 가며 사용할 수 있는것


common.h에 선언했던 내용

define과 enum도 그대로 복사했음

#ifndef _GLOBAL_DEFINE_
#define _GLOBAL_DEFINE_

#define SCHOOL_MAX_NUM 100
#define SCHOOL_NAME_LENGTH 10
#define A_KIND 4

enum {MAN = 0, WOMAN};
enum {ES = 0, MS, HS};
enum {_NONE = -1, _ERROR = 0, _SUCCESS};

typedef struct tagSchool
{
 int index;
 int sex;
 int level;
 CString school_name;
}SCHOOL;

typedef struct tagITEM
{
 int index;
 int s85[A_KIND];
 int s90[A_KIND];
 int s95[A_KIND];
 int s100[A_KIND];
}ITEM;

typedef struct tagHuman
{
 //int num;
 CString name;
 CString school_name;
 CString address;
 CString callme;
 int Js, Jn;
 int Vs, Vn;
 int Ss, Sn;
 int Bs, Bn;
}HUMAN;

#endif


선언된 구조체 또는 변수를 초기화 하고 싶은 경우
해당 다이얼로그(클래스) 생성자에서 초기화를 수행하면 된다

Document.h 에서 선언된 구조체를 Document.cpp에서 초기화 하는 예제
CIvyClubDoc::CIvyClubDoc()
{
 // TODO: add one-time construction code here
 Counter = 0;
 
 //----ITEM 구조체 초기화
 memset(strITEM, 0, sizeof(strITEM));
 HeadCounter = 0;
}

위의 방식으로 초기화시 구조체에 CString이 있으면 에러가 발생함


common.h
typedef struct tagITEM
{
 int index;
 int s85[A_KIND];
 int s90[A_KIND];
 int s95[A_KIND];
 int s100[A_KIND];
}ITEM;


 CIvyClubDoc* pDoc = GetDocument();


예제
 CIvyClubDoc* pDoc = GetDocument();
 pDoc->SetHUMAN(name, school_name, address, callme, Js, Jn, Vs, Vn, Ss, Sn, Bs, Bn);
 f_print();

 ITEM* pITEM = pDoc->GetITEM();
 SCHOOL* pSCHOOL = pDoc->GetValue();

 //pSCHOOL 뱅뱅 돌리면서 현재 받은 학교값과 같은 경우의 index를 추출
 //뭐 그럼 만사 ok
 int check_index = 0;
 int cnt = pDoc->GetCounter();
 for(int i=0;i<cnt;i++)
 {
  if(strcmp(pSCHOOL[i].school_name, school_name)==0)
  {
   //school index == item index
   //해당 index번호의 item에서 사이즈에 맞게 개수차감
   //J, V, S, B
   if(Js == 85 && pITEM[i].s85[0] >= Jn)
    pITEM[i].s85[0] = pITEM[i].s85[0] - Jn;
   if(Js == 90 && pITEM[i].s90[0] >= Jn)
    pITEM[i].s90[0] = pITEM[i].s90[0] - Jn;
   if(Js == 95 && pITEM[i].s95[0] >= Jn)
    pITEM[i].s95[0] = pITEM[i].s95[0] - Jn;
   if(Js == 100 && pITEM[i].s100[0] >= Jn)
    pITEM[i].s100[0] = pITEM[i].s100[0] - Jn;
   }
  }


Document.h MFC룰에 따라 Document의 헤더에 저장한다

 CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd(); //AfxGetMainWnd() -> MainWnd의 주소값을 가져옴
 CIvyClubDoc *pDoc = (CIvyClubDoc *)pFrame->GetActiveDocument(); //GetActiveDocument() AfxGetMainWnd로 가져온 MainFrame에서 활성화된 Document의 주소를 가져오는 함수. 이 주소를 가져다가 pDoc에 넣어주면 결국 활성화된 Doc의 주소를 가져올 수 있고 이것을 이용하여 호출


예제
void CTrash::f_Print()
{
 CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd();
 CIvyClubDoc *pDoc = (CIvyClubDoc *)pFrame->GetActiveDocument();
 
 ITEM *pITEM = pDoc->GetITEM();
 
 int counter = pDoc->GetCounter();
 int i = m_combo_SN.GetCurSel();
 
 CString val;
 
 m_Trash.DeleteAllItems();
 
 m_Trash.InsertItem(0, "85", 0);
 val.Format("%d", pITEM[i].s85[0]);
 m_Trash.SetItemText(0, 1, val);
 val.Format("%d", pITEM[i].s85[1]);
 m_Trash.SetItemText(0, 2, val);
 val.Format("%d", pITEM[i].s85[2]);
 m_Trash.SetItemText(0, 3, val);
 val.Format("%d", pITEM[i].s85[3]);
 m_Trash.SetItemText(0, 4, val);
 
 m_Trash.InsertItem(1, "90", 0);
 val.Format("%d", pITEM[i].s90[0]);
 m_Trash.SetItemText(1, 1, val);
 val.Format("%d", pITEM[i].s90[1]);
 m_Trash.SetItemText(1, 2, val);
 val.Format("%d", pITEM[i].s90[2]);
 m_Trash.SetItemText(1, 3, val);
 val.Format("%d", pITEM[i].s90[3]);
 m_Trash.SetItemText(1, 4, val);
 
 m_Trash.InsertItem(2, "95", 0);
 val.Format("%d", pITEM[i].s95[0]);
 m_Trash.SetItemText(2, 1, val);
 val.Format("%d", pITEM[i].s95[1]);
 m_Trash.SetItemText(2, 2, val);
 val.Format("%d", pITEM[i].s95[2]);
 m_Trash.SetItemText(2, 3, val);
 val.Format("%d", pITEM[i].s95[3]);
 m_Trash.SetItemText(2, 4, val);
 
 m_Trash.InsertItem(3, "100", 0);
 val.Format("%d", pITEM[i].s100[0]);
 m_Trash.SetItemText(3, 1, val);
 val.Format("%d", pITEM[i].s100[1]);
 m_Trash.SetItemText(3, 2, val);
 val.Format("%d", pITEM[i].s100[2]);
 m_Trash.SetItemText(3, 3, val);
 val.Format("%d", pITEM[i].s100[3]);
 m_Trash.SetItemText(3, 4, val);
}

MFC 4대 구조(클래스)

- Document
- View
- Application
- MainFrame

MFC는 위의 4대 클래스를 기본 골격으로 한다(반드시 따를 필요는 없으며 그냥 C++처럼 짜도 그만이나 규약을 따르면 코드 가독성이나 공유성이 좋아진다)

일반적으로
Document에는 자료처리에 필요한 자료형, 구조체 등이 기술된다
View는 보여지는 부분으로 버튼을 그리거나 텍스트박스등을 그려넣고 눈에 보이는 부분이다
Application은 전면에 나오지 않고 각종 자료의 처리를 수행하는 부분이다
MainFrame은 메뉴나 화면의 조절(확대, 최소, 닫기, 스크롤바등)을 담당하며 4대 클래스를 제외한 클래스(또는 다이얼로그)등에서 Document의 데이터를 접근하기 위해서 먼저 접근하게 되는 클래스이다

+ Recent posts