MFC通讯录类

头文件contact.h:

#pragma once
#include "Resource.h"
#include
#include
#include
#include

#include "../sqlite3_lib/sqlite3.h"

using namespace std;

class CCRow
{
public:
CStringArray * _row;
public:
CCRow(CStringArray * row);
int getColumnCount(void);
CString getColumn(int i);
};

class CCSheet
{
public:
CTypedPtrArray _rows;
public:
CCSheet(void);
~CCSheet(void);
int loadFrom(ifstream & in);
void addRow(char *);
int getRowCount(void);
CCRow getRow(int i);
void delRow(int);
void delAll();
};

// Contact 对话框

class Contact : public CDialog
{
DECLARE_DYNAMIC(Contact)

public:
Contact(CWnd* pParent = NULL); // 标准构造函数
virtual ~Contact();

CTreeCtrl *myTreeCtrl;
CCSheet sheet;

CString selectNum;
HTREEITEM selectItem;
int selectRowIndex;


void save();
int downloadFile(CString Url);

int callNameLookup(char *, char *);


// 对话框数据
enum { IDD = IDD_D_contact };

protected:
virtual BOOL OnInitDialog();
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持

void OnCancel()
{
this->ShowWindow(SW_HIDE);
}


DECLARE_MESSAGE_MAP()
public:
afx_msg void Oncontactdel();
afx_msg void OnNMRClickTreecontact(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg void Oncontactedit();
afx_msg void Onconeditgroup();
afx_msg void Oncondelgroup();
afx_msg void Onconaddone();
afx_msg void Onconaddgroup();
};

cpp文件contact.cpp":

// ontact.cpp : 实现文件
//
#include "StdAfx.h"
#include "contact.h"
#include "ContactEdit.h"

#include
#include
#include

#define MAXBLOCKSIZE 1024

CCRow::CCRow(CStringArray * row)
{
_row = row;
}

int CCRow::getColumnCount(void)
{
return _row->GetCount();
}

CString CCRow::getColumn(int i)
{
return _row->GetAt(i);
}


CCSheet::CCSheet()
{
}

CCSheet::~CCSheet()
{
for(int i = 0; i < _rows.GetCount(); i++)
{
delete _rows.GetAt(i);
}
}

int CCSheet::loadFrom(ifstream & in)
{
int lines = 0;

while(!in.eof())
{
//读取其中的一行
char line[256] = {0};
in.getline(line, 255);

addRow(line);
lines++;
}

return lines;
}

void CCSheet::addRow(char *item)
{
CString s = item;

//空白行,跳过
if(s.IsEmpty())
return;

//#为注释标记,跳过
if(s[0] == '#')
return;

CStringArray *pRow = new CStringArray();
int i = 0;
CString token = s.Tokenize(_T(",/t"), i);
while (token != _T(""))
{
pRow->Add(token);
token = s.Tokenize(_T(",/t"), i);
}

_rows.Add(pRow);

}

int CCSheet::getRowCount(void)
{
return _rows.GetCount();
}

CCRow CCSheet::getRow(int i)
{
return CCRow(_rows.GetAt(i));
}
void CCSheet::delRow(int index)
{
_rows.RemoveAt(index);
}

void CCSheet::delAll()
{
_rows.RemoveAll();
}


// Contact 对话框

IMPLEMENT_DYNAMIC(Contact, CDialog)

Contact::Contact(CWnd* pParent /*=NULL*/)
: CDialog(Contact::IDD, pParent)
{
}

Contact::~Contact()
{
}

BOOL Contact::OnInitDialog()
{
CDialog::OnInitDialog();

if(!downloadFile("http://192.168.18.249/contacts.csv "))
DEBUG_INFO("contacts.csv download sucess!");
else
DEBUG_INFO("contacts.csv download fail!");


myTreeCtrl = (CTreeCtrl *)GetDlgItem(IDC_TREE_contact);
myTreeCtrl->ModifyStyle(0,TVS_HASBUTTONS | TVS_LINESATROOT | TVS_HASLINES | TVS_SHOWSELALWAYS);


HTREEITEM root,sRoot;
TV_ITEM tvItem; // 指定或接收树形视项的属性
TV_INSERTSTRUCT tvInsert; //包含添加新项到树形视控件所使用的信息
tvItem.mask = TVIF_TEXT | TVIF_PARAM;

//打开csv文件
ifstream ini( GetFilePath()+"contacts.csv");
//加载至CSheet
sheet.loadFrom(ini);

ini.close();

for(int i = 1; i < sheet.getRowCount(); i++)
{
//获取指定行
CCRow row = sheet.getRow(i);

CString type;
type=(LPCTSTR)row.getColumn(1); //第一列
if(!type.Compare("group")){
//DEBUG_INFO("add a group");

CString tt;
tt = row.getColumn(2)+"["+row.getColumn(3)+"]";
tvItem.pszText = tt.GetBuffer(tt.GetLength());//在根目录中添加
tvItem.cchTextMax = 2; // pszText成员指定缓冲的大小,以字符为单位
tvInsert.hParent = TVI_ROOT; //作为一个根项添加
tvInsert.hInsertAfter = TVI_LAST; //在列表的最后插入项,在其例中一直都是这个值

tvInsert.item = tvItem; //包含关于项添加的信息
root = myTreeCtrl->InsertItem(&tvInsert);
myTreeCtrl->SetItemData(root, atoi(row.getColumn(0)) );//设置id
}

else{
//DEBUG_INFO("add a exten");

CString tt;
tt = row.getColumn(2)+"["+row.getColumn(3)+"]";
tvItem.pszText = tt.GetBuffer(tt.GetLength());;//在group目录中添加
tvItem.cchTextMax = 2;
tvInsert.hParent = root;
tvInsert.item = tvItem;
sRoot=myTreeCtrl->InsertItem(&tvInsert); //InsertItem如果成功则返回新项的句柄,此时sRoot代表市场策划部
myTreeCtrl->SetItemData(sRoot, atoi(row.getColumn(0)) );
}
}


return true;
}

void Contact::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}


BEGIN_MESSAGE_MAP(Contact, CDialog)
ON_COMMAND(ID_contactDel, &Contact::Oncontactdel)
ON_NOTIFY(NM_RCLICK, IDC_TREE_contact, &Contact::OnNMRClickTreecontact)
ON_COMMAND(ID_contactEdit, &Contact::Oncontactedit)
ON_COMMAND(ID_conEditGroup, &Contact::Onconeditgroup)
ON_COMMAND(ID_conDelGroup, &Contact::Oncondelgroup)
ON_COMMAND(ID_conAddOne, &Contact::Onconaddone)
ON_COMMAND(ID_conAddGroup, &Contact::Onconaddgroup)
END_MESSAGE_MAP()


// Contact 消息处理程序


int Contact::downloadFile(CString Url)
{
HINTERNET hSession = InternetOpen( " RookIE/1.0 " , INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0 );
if (hSession != NULL)
{
HINTERNET handle2 = InternetOpenUrl(hSession, Url, NULL, 0 , INTERNET_FLAG_DONT_CACHE, 0 );
if (handle2 != NULL)
{
printf( " %s/n " ,Url);
byte Temp[MAXBLOCKSIZE];
ULONG Number = 1 ;

FILE * stream;
if ( (stream = fopen( GetFilePath()+"contacts.csv" , " wb " )) != NULL ) // 这里只是个测试,因此写了个死的文件路径
{
while (Number != 0 )
{
InternetReadFile(handle2, Temp, MAXBLOCKSIZE - 1 , & Number);
// fprintf(stream, (const char*)Temp);
fwrite(Temp, sizeof ( char ), Number , stream);
}
fclose( stream );
}
else
return -1;

InternetCloseHandle(handle2);
handle2 = NULL;
}
else
return -1;
InternetCloseHandle(hSession);
hSession = NULL;
}
return 0;
}

void Contact::save()
{
CStdioFile SetFile;
CFileException e;
if(!SetFile.Open(GetFilePath()+"contacts.csv", CFile::modeCreate|CFile::modeWrite, &e)){
e.ReportError();
}

for(int i = 0; i < sheet.getRowCount(); i++)
{
//获取指定行
CCRow row = sheet.getRow(i);

CString delId=row.getColumn(0);
if(!delId.Compare("-1")){
sheet.delRow(i);//删除标记行
i--;
}
}

CString s;

for(int i = 0; i < sheet.getRowCount(); i++)
{
//获取指定行
CCRow row = sheet.getRow(i);

CString str;
str.Format("%d",i);
SetFile.WriteString(str);

for(int j =1; j < row.getColumnCount(); j++)
{
//获取指定列
s = row.getColumn(j);
SetFile.WriteString(",");
SetFile.WriteString(s);//写数据
}
SetFile.WriteString("/n");
}
DEBUG_INFO("save contacts.csv");

}

void Contact::OnNMRClickTreecontact(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: 在此添加控件通知处理程序代码

//DWORD dwPos = ::GetMessagePos();
//CPoint pt( LOWORD(dwPos), HIWORD(dwPos) );

CPoint pt;
GetCursorPos(&pt);

UINT uFlags;
myTreeCtrl->ScreenToClient(&pt); //转换成客户区坐标
selectItem = myTreeCtrl->HitTest(pt,&uFlags);//获取选中的Item的句柄


if(selectItem){
myTreeCtrl->Select(selectItem,TVGN_CARET);

//CString S1 = myTreeCtrl->GetItemText(selectItem);
int id = myTreeCtrl->GetItemData(selectItem);

for(int i=1; i
CCRow row = sheet.getRow(i);
if(atoi(row.getColumn(0)) == id){
selectRowIndex=i;//查询出对应Row的index
//DEBUG_INFO("%d", selectRowIndex);
break;
}
}

CCRow row = sheet.getRow(selectRowIndex);

selectNum = row.getColumn(3);
//DEBUG_INFO("You have selected ID:%s NUM:%s %s",row.getColumn(0),selectNum, selectItem);


myTreeCtrl->ClientToScreen(&pt);//转换回桌面坐标
CMenu menu, *pSubMenu;

CString type = row.getColumn(1);
if(!type.Compare("group"))
menu.LoadMenu(IDR_MENU5);
else
menu.LoadMenu(IDR_MENU4);
pSubMenu = menu.GetSubMenu(0);
pSubMenu->TrackPopupMenu(TPM_LEFTALIGN, pt.x, pt.y, this);
}

*pResult = 0;
}

void Contact::Oncontactdel()
{
// TODO: 在此添加命令处理程序代码
if(!selectItem)
return;

CCRow row = sheet.getRow(selectRowIndex);
int id = atoi(row.getColumn(0));

CString type = row.getColumn(1);
if(!type.Compare("exten"))
row._row->SetAt(0, "-1");//标记删除exten

//DEBUG_INFO("address is id:%d, %s", id, selectItem);
myTreeCtrl->DeleteItem(selectItem);
selectItem=NULL;

//HTREEITEM groupItem= myTreeCtrl->GetParentItem(selectItem);//得到父结点。
//myTreeCtrl->DeleteItem(groupItem);

// DebugString("delete id:"+ row.getColumn(0));
}

void Contact::Oncontactedit()
{
// TODO: 在此添加命令处理程序代码

CCRow row = sheet.getRow(selectRowIndex);

CContactEdit myDlg(&row);
if(myDlg.DoModal()==IDOK){
CString tt = row.getColumn(2)+"["+row.getColumn(3)+"]";
myTreeCtrl->SetItemText(selectItem,tt);//重置显示字符
}

delete myDlg;
}


void Contact::Onconeditgroup()
{
// TODO: 在此添加命令处理程序代码
CCRow row = sheet.getRow(selectRowIndex);

CContactEdit myDlg(&row);
if(myDlg.DoModal()==IDOK){
CString tt = row.getColumn(2)+"["+row.getColumn(3)+"]";
myTreeCtrl->SetItemText(selectItem,tt);//重置显示字符
}

delete myDlg;
}

void Contact::Oncondelgroup()
{
// TODO: 在此添加命令处理程序代码
if(!selectItem)
return;

CCRow row = sheet.getRow(selectRowIndex);
int id = atoi(row.getColumn(0));

int i=selectRowIndex;
CString type = row.getColumn(1);
if(!type.Compare("group")){
row._row->SetAt(0, "-1");//标记删除group
i++;

for(;i
CCRow rrow = sheet.getRow(i);
if(!rrow.getColumn(1).Compare("group"))
break;
else
rrow._row->SetAt(0, "-1");//标记删除group中exten
}
}
myTreeCtrl->DeleteItem(selectItem);
selectItem=NULL;
}

void Contact::Onconaddone()
{
// TODO: 在此添加命令处理程序代码

CString Cid;
Cid.Format("%d",sheet.getRowCount());

CStringArray *pRow = new CStringArray();

pRow->Add(Cid);
pRow->Add("addExten");
pRow->Add("null");
pRow->Add("null");
pRow->Add("null");

CCRow row(pRow);

CContactEdit myDlg(&row);
if(myDlg.DoModal()==IDOK){
int i=selectRowIndex+1;
for(;i
CCRow rrow = sheet.getRow(i);
if(!rrow.getColumn(1).Compare("group"))
break;
}
sheet._rows.InsertAt(i, row._row, 1);//sheet中填入exten数据

HTREEITEM sRoot;//myTreeCtrl中填入数据

CString tt;
tt = row.getColumn(2)+"["+row.getColumn(3)+"]";

sRoot = myTreeCtrl->InsertItem(tt, selectItem, TVI_LAST);
myTreeCtrl->SetItemData(sRoot, atoi(row.getColumn(0)) );//设置id

}

delete myDlg;


}

void Contact::Onconaddgroup()
{
// TODO: 在此添加命令处理程序代码

CString Cid;
Cid.Format("%d",sheet.getRowCount());

CStringArray *pRow = new CStringArray();

pRow->Add(Cid);
pRow->Add("addGroup");
pRow->Add("null");
pRow->Add("null");
pRow->Add("null");

CCRow row(pRow);

//CStringArray * row = new CStringArray;
/*char newGroup[50];
sprintf_s(newGroup,"%d,addGroup,,,",sheet.getRowCount());
DEBUG_INFO(newGroup);
sheet.addRow(newGroup);

CCRow row = sheet.getRow(sheet.getRowCount()-1);*/
CContactEdit myDlg(&row);
if(myDlg.DoModal()==IDOK){
sheet._rows.Add(row._row);//sheet中填入group数据

HTREEITEM root;//myTreeCtrl中填入数据
TV_ITEM tvItem; // 指定或接收树形视项的属性
TV_INSERTSTRUCT tvInsert; //包含添加新项到树形视控件所使用的信息
tvItem.mask = TVIF_TEXT | TVIF_PARAM;
CString tt;
tt = row.getColumn(2)+"["+row.getColumn(3)+"]";
tvItem.pszText = tt.GetBuffer(tt.GetLength());//在根目录中添加
tvItem.cchTextMax = 2; // pszText成员指定缓冲的大小,以字符为单位
tvInsert.hParent = TVI_ROOT; //作为一个根项添加
tvInsert.hInsertAfter = TVI_LAST; //在列表的最后插入项,在其例中一直都是这个值

tvInsert.item = tvItem; //包含关于项添加的信息
root = myTreeCtrl->InsertItem(&tvInsert);
myTreeCtrl->SetItemData(root, atoi(row.getColumn(0)) );//设置id
}

delete myDlg;
}


int Contact::callNameLookup(char *name, char *num)
{
for(int i = 1; i < sheet.getRowCount(); i++)
{
//获取指定行
CCRow row = sheet.getRow(i);

CString callnum;
callnum=(LPCTSTR)row.getColumn(3); //第一列
if(!callnum.Compare(num)){
CString callName =(LPCTSTR)row.getColumn(2);
strcpy(name ,callName);
//char *ch = callName.GetBuffer(callName.GetLength() + 1);
return 0;
}
}

strcpy(name ,num);

return -1;
}

头文件ContactEdit.h:

#pragma once
#include "contact.h"

// CContactEdit 对话框

class CContactEdit : public CDialog
{
DECLARE_DYNAMIC(CContactEdit)

public:
CContactEdit(CCRow *row,CWnd* pParent = NULL); // 标准构造函数
virtual ~CContactEdit();

// 对话框数据
enum { IDD = IDD_contactEdit };

CCRow *myRow;

protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
virtual BOOL OnInitDialog();

DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedOk();
};

cpp文件ContactEdit.cpp:

// ContactEdit.cpp : 实现文件
//

#include "stdafx.h"
#include "mySIPhone.h"
#include "ContactEdit.h"


// CContactEdit 对话框

IMPLEMENT_DYNAMIC(CContactEdit, CDialog)

CContactEdit::CContactEdit(CCRow *row, CWnd* pParent /*=NULL*/)
: CDialog(CContactEdit::IDD, pParent)
{
myRow = row;

}

CContactEdit::~CContactEdit()
{
}

BOOL CContactEdit::OnInitDialog()
{
CString type = myRow->getColumn(1);

if(!type.Compare("group"))
::SetWindowText( this->m_hWnd,"联系组信息");
else if(!type.Compare("exten"))
::SetWindowText(this->m_hWnd, "联系人信息");
else if(!type.Compare("addGroup")){
::SetWindowText( this->m_hWnd,"添加联系组");
return true;
}
else if(!type.Compare("addExten")){
::SetWindowText( this->m_hWnd,"添加联系人");
return true;
}
else
return true;

CString name = myRow->getColumn(2).GetBuffer(myRow->getColumn(2).GetLength());
CString exten = myRow->getColumn(3).GetBuffer(myRow->getColumn(3).GetLength());
CString info = myRow->getColumn(4).GetBuffer(myRow->getColumn(4).GetLength());


GetDlgItem(IDC_contactName)->SetWindowText(name);
GetDlgItem(IDC_contactExten)->SetWindowText(exten);
GetDlgItem(IDC_contactInfo)->SetWindowText(info);

return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
void CContactEdit::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}


BEGIN_MESSAGE_MAP(CContactEdit, CDialog)
ON_BN_CLICKED(IDOK, &CContactEdit::OnBnClickedOk)
END_MESSAGE_MAP()


// CContactEdit 消息处理程序

void CContactEdit::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码

CString name;
CString num;
CString info;
GetDlgItem(IDC_contactName)->GetWindowText(name);
GetDlgItem(IDC_contactExten)->GetWindowText(num);
GetDlgItem(IDC_contactInfo)->GetWindowText(info);

myRow->_row->SetAt(2, name);//修改name
myRow->_row->SetAt(3, num);//修改num
myRow->_row->SetAt(4, info);//修改info*/

if(!myRow->getColumn(1).Compare("addGroup"))
myRow->_row->SetAt(1, "group");//修改type*/
else if(!myRow->getColumn(1).Compare("addExten"))
myRow->_row->SetAt(1, "exten");//修改type*/

//DEBUG_INFO("add new one: "+myRow->getColumn(0)+","+myRow->getColumn(1)+","+name+","+num+","+info);

OnOK();
}

Powered by Zoundry Raven

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值