본문 바로가기
뚝딱쓰

카카오톡 특정 인물 대화 내역 보기 - 개발 #2

by 트럼프 2022. 2. 12.

이전 과정

https://push-back.tistory.com/10?category=1004907 

 

 

메인 다이얼로그 SKP

 

 

KakaoTalk_FindChatDlg.cpp

메인 UI 컨트롤

값을 보내고 전시만 하며 데이터 처리는 하지 않는다.

 

 

멤버변수 생성

IDC_EDIT_WHO, IDC_EDIT_FILE_PATH, IDC_LIST_SHOW에 멤버 변수를 생성한다.

CKakaoTalkFindChatDlg::CKakaoTalkFindChatDlg(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_KAKAOTALK_FINDCHAT_DIALOG, pParent)
	, m_FilePath(_T(""))
	, m_Imposter(_T(""))
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CKakaoTalkFindChatDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_LIST_SHOW, m_lstShow);
	DDX_Text(pDX, IDC_EDIT_FILE_PATH, m_FilePath);
	DDX_Text(pDX, IDC_EDIT_WHO, m_Imposter);
}

 

 

OnInitialDialog()

다이얼로그 처음 수행 시

리스트 컨트롤 초기화 및 칼럼 생성을 하고

큐를 비운다.

BOOL CKakaoTalkFindChatDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 시스템 메뉴에 "정보..." 메뉴 항목을 추가합니다.

	// IDM_ABOUTBOX는 시스템 명령 범위에 있어야 합니다.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != nullptr)
	{
		BOOL bNameValid;
		CString strAboutMenu;
		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
		ASSERT(bNameValid);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// 이 대화 상자의 아이콘을 설정합니다.  응용 프로그램의 주 창이 대화 상자가 아닐 경우에는
	//  프레임워크가 이 작업을 자동으로 수행합니다.
	SetIcon(m_hIcon, TRUE);			// 큰 아이콘을 설정합니다.
	SetIcon(m_hIcon, FALSE);		// 작은 아이콘을 설정합니다.

	// TODO: 여기에 추가 초기화 작업을 추가합니다.

	// 리스트 컨트롤(LIST_SHOW) 초기화
	CRect rt;	// 리스트 컨트롤 크기
	m_lstShow.GetWindowRect(&rt);
	m_lstShow.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);	// 리스트 컨트롤에 선 표시
	m_lstShow.InsertColumn(0, TEXT("날짜"), LVCFMT_LEFT, rt.Width() * 0.2);	// 첫번째 행
	m_lstShow.InsertColumn(1, TEXT("뭐래했냐믄"), LVCFMT_LEFT, rt.Width() * 1-0.2);	// 두번째 행

	qData_Imposter_all.empty();

	return TRUE;  // 포커스를 컨트롤에 설정하지 않으면 TRUE를 반환합니다.
}

 

 

BEGIN_MESSAGE_MAP

1. IDC_BUTTON_UPLOAD_FILE 눌렀을 때 이벤트

2. IDC_BUTTON_SHOW 눌렀을 때 이벤트

BEGIN_MESSAGE_MAP(CKakaoTalkFindChatDlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON_UPLOAD_FILE, &CKakaoTalkFindChatDlg::OnBnClickedButtonUploadFile)
	ON_BN_CLICKED(IDC_BUTTON_SHOW, &CKakaoTalkFindChatDlg::OnBnClickedButtonShow)
//	ON_NOTIFY(NM_CUSTOMDRAW, IDC_LIST_SHOW, OnCustomdrawList)
END_MESSAGE_MAP()

 

 

OnBnClickedButtonUploadFile()

1. IDC_BUTTON_UPLOAD_FILE 눌렀을 때 이벤트

파일 검색기를 띄운다. 선택 가능 확장자는 .txt 외 모든 파일 가능

// 'UPLOAD' 버튼 클릭 이벤트
// 파일을 업로드 할 수 있도록 다이얼로그 띄어준다.
void CKakaoTalkFindChatDlg::OnBnClickedButtonUploadFile()
{
	static TCHAR BASED_CODE szFilter[] = _T(".txt 파일(*.txt) | *.txt;|모든파일(*.*)|*.*||");
	CFileDialog dlg(TRUE, _T("*.txt"), _T("txt"), OFN_HIDEREADONLY, szFilter);

	if (IDOK == dlg.DoModal())
	{
		CString pathName = dlg.GetPathName();

		SetDlgItemText(IDC_EDIT_FILE_PATH, pathName);
	}
}

 

 

OnBnClickedButtonShow()

2. IDC_BUTTON_SHOW 눌렀을 때 이벤트

CFind 함수를 불러와 데이터 추출을 하고

임포스터가 실존하면 큐에 담아 ShowList()로 리스트 컨트롤에 뿌린다.

void CKakaoTalkFindChatDlg::OnBnClickedButtonShow()
{
	// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
	CString strFilePath;	// 파일 경로
	CString strImposter;	// 임포스터 이름

	GetDlgItemText(IDC_EDIT_FILE_PATH, strFilePath);
	GetDlgItemText(IDC_EDIT_WHO, strImposter);

	CFind FindImposter;
	FindImposter.SetFile(strFilePath, strImposter);

	if (FindImposter.IsExist)
	{
		m_lstShow.DeleteAllItems();
		qData_Imposter_all = FindImposter.qData_Imposter;
		ShowList();
	}
	else
	{
		MessageBox(_T("존재 하지 않는 임포스터"));
	}
}

 

 

ShowList()

리스트 컨트롤에 데이터를 뿌리는 함수

큐에서 데이터를 꺼내 날짜, 채팅을 전시한다.

 

같은 날짜에서 채팅이 여러 개인 경우, 최초 날짜만 표기한다.

TYPE_IN, TYPE_OUT, TYPE_KICK인 경우, 무조건 날짜를 표기한다.

 

else는 나중에 타입이 추가될 때를 대비하여 남겨둠

void CKakaoTalkFindChatDlg::ShowList()
{
	stImposterInfo ImposterInfo;
	int nQSize = qData_Imposter_all.size();
	int DateSave = 0;
	int nCount = 0;
	for (int i = 0; i < nQSize; i++)
	{
		ImposterInfo = qData_Imposter_all.front();
		qData_Imposter_all.pop();

		CString strChat, strDate;
		strChat = ImposterInfo.cTalk;
		int nDate = ImposterInfo.nDate;
		strDate.Format(_T("%d-%d-%d"), nDate/10000, (nDate-((nDate/10000)*10000))/100, nDate-((nDate/100)*100));

		// 타입에 따라
		if ((ImposterInfo.nType == TYPE_IN)||(ImposterInfo.nType == TYPE_OUT)||(ImposterInfo.nType == TYPE_KICK))
		{
			m_lstShow.InsertItem(nCount, strDate);
			m_lstShow.SetItemText(nCount, 1, strChat);
			nCount++;
			DateSave = nDate;
		}
		else if (ImposterInfo.nType == TYPE_CHAT)
		{
			(DateSave == nDate) ? m_lstShow.InsertItem(nCount, _T("")) : m_lstShow.InsertItem(nCount, strDate);
			m_lstShow.SetItemText(nCount, 1, strChat);
			nCount++;
			DateSave = nDate;
		}
		else
		{
			// Type : Date, Else...
		}
	}
}

 

 

다음 과정

https://push-back.tistory.com/12?category=1004907 

 

댓글