일단 win32console로 짜둔 linkedlist가 있습니다..
이것을 MFC로 옮겨서 구현하고자 하는데요..
MFC를 잘 몰라서..질문드립니다..
먼저 linkedlist 입니다
#include "BookLL.h"
void BookLL::BookLLInit() //도서 초기화
{
BookHead = new BookSt;
BookTail = BookHead;
BookHead->next=0;
strcpy(BookHead->BookID, ""); //NULL로 초기화
}
void BookLL::BookLLAdd() //도서 추가
{
BookSt *p;
p = new BookSt;
char *book;
book=new char[strlen(p->BookID)+1]; //book의 동적할당
cout << "추가할 책을 입력하세요"<<endl;
gets(book);
strcpy(p->BookID, book);
p->next=0;
BookTail->next = p;
BookTail=p;
delete []book; //동적할당 삭제
}
BookSt *BookLL::BookLLLocationOf(char* BookID)
{
BookSt *p;
for(p=BookHead->next;p!=0;p=p->next) {
if (strcmp(p->BookID, BookID)==0) //(*p).BookID와 BookID가 같을 경우
return p; // p를 리턴
}
return 0;
}
BookSt *BookLL::BookLLLocationBefore(BookSt *q)
{
BookSt *p;
for(p=BookHead;p!=0;p=p->next){
if (p->next==q)
return p;
}
return 0;
}
void BookLL::BookLLDelete() //도서 삭제
{
BookSt *p;
p=new BookSt;
char *book;
book=new char[strlen(p->BookID)+1]; //book의 동적할당
strcpy(book,p->BookID);
cout << "삭제할 책을 입력하세요"<<endl;
gets(book);
BookSt *q;
q=BookLLLocationOf(book);
if (q==0){
cout << "책이 없습니다."<<endl;
return;
}
BookSt *prev;
prev=BookLLLocationBefore(q);
prev->next=q->next;
if (q==BookTail)
BookTail=prev;
delete q;
delete []book; //동적할당 삭제
}
void BookLL::BookLLShow() //도서리스트 출력
{
BookSt *p;
cout << "------------Book List------------" << endl;
for(p=BookHead->next;p!=0;p=p->next)
cout<<"책제목 : " << p->BookID << endl;
cout << endl;
}
다음 MFC 코드입니다..
//MyDlg.cpp
#include "stdafx.h"
#include "My.h"
#include "MyDlg.h"
#include "BAddDlg.h"
#include "BDelDlg.h"
CMyDlg::CMyDlg() : CDialog(IDD_BOOK) // Constructor
{
}
void CMyDlg::BAddHandler() // Book_Add Handler
{
CBAddDlg BAdd;
BAdd.DoModal();
}
void CMyDlg::BDelHandler() // Book_Del Handler
{
CBDelDlg BDel;
BDel.DoModal();
}
void CMyDlg::DoDataExchange(CDataExchange *pDX) {
DDX_Text(pDX,IDC_EDIT1,BShowTitle);
}
void CMyDlg::BShowHandler() // Book_Show Handler
{
BShowTitle=""; //BShowTitle is private member of CMyDlg
for(int i=0;i<20;i++) {
if(BTitle[i]!="") // If BTitle(global variable) is not Null then BShowTitle
BShowTitle=BShowTitle+BTitle[i]+"\r\n"; // BTitle is global variable
}
UpdateData(FALSE);
}
BEGIN_MESSAGE_MAP(CMyDlg,CDialog) // Handler linked
ON_BN_CLICKED(IDBAdd,BAddHandler)
ON_BN_CLICKED(IDBDel,BDelHandler)
ON_BN_CLICKED(IDBShow,BShowHandler)
END_MESSAGE_MAP()
//BAddDlg.cpp
#include "stdafx.h"
#include "My.h"
#include "MyDlg.h"
#include "BAddDlg.h"
CBAddDlg::CBAddDlg() : CDialog(IDD_BAddDlg) // Constructor
{
}
void CBAddDlg::DoDataExchange(CDataExchange *pDX) {
DDX_Text(pDX,IDC_EDIT2,BAddTitle);
}
void CBAddDlg::OnOK() // handler for OK button
{
UpdateData(TRUE);
for(int i=0;i<20;i++) {
if(BTitle[i]=="") { // If BTitle(global variable) is NULL then BTitle is BAddTitle(local variable)
BTitle[i]=BAddTitle; // BTitle is global variable & BAddTitle is private member of CBAddDlg.
break;
}
}
CDialog::OnOK();
}
BEGIN_MESSAGE_MAP(CBAddDlg,CDialog) // Handler linked
ON_BN_CLICKED(IDOK,OnOK)
END_MESSAGE_MAP()
도서대여 프로그램이구요
linkedlist 코드는 도서 부분만,..
MFC 코드는 도서추가 부분 다이얼로그 입니다.
음... 일단 MFC에서 새로운 파일 만들어서 linkedlist클래스를 넣었고..
다른 파일에 include 시켰습니다.
BAddDlg 에서 OK 누르면 도서 제목이 입력되서 linkedlist에 저장되게 하려는 거구요..
MFC를 처음 접하다 보니 어떻게 이둘을 연결해야할지 막막해서요..
cout 같은 건 AfxMessageBox 로 바꿔주면 되겠지요??
OK 버튼을 누르면 UpdateData 되니까 변수로 전달되는 걸
linkedlist 에 연결해야하는데..
다이얼로그의 OK 버튼하고..
linkedlist의 BookLL::BookLLAdd() 하고 어떻게 연결을 해주어야 할까요?ㅠ
위자드 같은 건.. 안쓰는 방향으로 답변 좀 부탁드릴께요..
생성자에서 인스턴스 만들어 주시고
자식 윈도에서는 GetParent()를 써서 부모 윈도의 포인터를 받아오면 됩니다.
CMyDlg.h를 자식 윈도에 include 해주시고
CMyDlg* pParent = (CMyDlg*) GetParent(); 혹은
CMyDlg* pParent = (CMyDlg*) AfxGetMainWnd(); 해주시면
(둘의 차이는 이름만으로도 알 수 있습니다...)
pParent->m_pListBook식으로 접근할 수 있겠죠. 이 멤버 변수가 꼭 포인터일 필요는 없을 것 같고요.
BookLL에 값을 추가하고 삭제하는 부분은 BookLL의 멤버함수에서 직접 입출력하는 게 아니라,
void BookLL::BookLLAdd(CString strBook) 같은 식으로 해야겠죠.
정확하진 않지만 비슷할 겁니다. 한참동안 MFC를 안 써서...
잘 돌아가면 CLinkedList 같은 클래스도 써보세요.
PS. 사실은 별로 안 좋은 방법으로 알고 있습니다.
디자인에 관해서는 저도 잘 모르는데다가 실력도 형편 없어서...