📄 ccontactslistdlg.cpp
字号:
// CContactsListDlg.cpp: implementation of the CContactsListDlg class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "CContactsListDlg.h"
#include "resource.h"
#include "CNewContactDlg.h"
#include "ContactsManager.h"
#include "CSearchContactDlg.h"
#include "CMailEditDlg.h"
extern CMailEditDlg g_maileditdlg;
extern CContactsManager g_contactmanager;
extern HINSTANCE g_hInst;
extern CNewContactDlg g_newcontactdlg;
extern TCHAR g_group[GROUP_NUMBER][16];
extern CSearchContactDlg g_searchcontactdlg;
// global CContactsListDlg variable pointer
CContactsListDlg g_contactlistdlg;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CContactsListDlg::CContactsListDlg()
{
m_parent = NULL;
}
CContactsListDlg::~CContactsListDlg()
{
}
BOOL CALLBACK ContactsListDialogProc(const HWND hDlg, const UINT uiMessage, const WPARAM wParam, const LPARAM lParam)
{
BOOL bProcessedMsg = TRUE;
switch(uiMessage)
{
case WM_INITDIALOG:
if(!g_contactlistdlg.InitialDlg(hDlg))
{
g_contactlistdlg.DestroyDlg(hDlg);
}
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case ID_MENUITEM_CONTACTSLISTEXIT:
memset(g_contactlistdlg.m_resaddress,0,sizeof(g_contactlistdlg.m_resaddress));
g_contactlistdlg.DestroyDlg(hDlg);
break;
case ID_MENUITEM_NEWCONTACT:
g_newcontactdlg.m_addcontact = TRUE;
memset(g_newcontactdlg.m_address,0,sizeof(g_newcontactdlg.m_address));
g_newcontactdlg.CreateDlg(hDlg,g_hInst);
g_contactlistdlg.UpDatePage(0);
break;
case ID_MENUITEM_ADDRESS:
g_contactlistdlg.DisplayAddress(hDlg);
break;
case ID_MENUITEM_NAME:
g_contactlistdlg.DisplayName(hDlg);
break;
case ID_MENUITEM_SBYNAME:
g_contactmanager.OpenDataBase(ID_NAME);
g_contactlistdlg.UpDatePage(0);
InvalidateRect(g_contactlistdlg.m_view,NULL,TRUE);
break;
case ID_MENUITEM_SBYADDRESS:
g_contactmanager.OpenDataBase(ID_MAILADDRESS);
g_contactlistdlg.UpDatePage(0);
InvalidateRect(g_contactlistdlg.m_view,NULL,TRUE);
break;
case ID_MENUITEM_SBYGROUP:
g_contactmanager.OpenDataBase(ID_GROUP);
g_contactlistdlg.UpDatePage(0);
InvalidateRect(g_contactlistdlg.m_view,NULL,TRUE);
break;
case ID_MENUITEM_SEARCHADDRESS:
CSearchContactDlg::DlgBox(g_searchcontactdlg,hDlg,g_hInst,SEARCH_BY_ADDRESS);
if(!g_searchcontactdlg.m_ok)
break;
g_contactlistdlg.SearchByAddress(hDlg);
break;
case ID_MENUITEM_SEARCHNAME:
CSearchContactDlg::DlgBox(g_searchcontactdlg,hDlg,g_hInst,SEARCH_BY_NAME);
if(!g_searchcontactdlg.m_ok)
break;
g_contactlistdlg.SearchByName(hDlg);
break;
case ID_MENUITEM_SEARCHGROUP:
CSearchContactDlg::DlgBox(g_searchcontactdlg,hDlg,g_hInst,SEARCH_BY_GROUP);
if(!g_searchcontactdlg.m_ok)
break;
g_contactlistdlg.SearchByGroup(hDlg,g_searchcontactdlg.m_group);
break;
case ID_MENUITEM_NONE:
g_contactlistdlg.NoSearch(hDlg);
break;
case ID_MENUITEM_DELETECONTACT:
g_contactlistdlg.DeleteContact(hDlg);
break;
case ID_MENUITEM_SENDMAIL:
{
int index = g_contactlistdlg.GetCurIndex();
if(index < 0)
break;
lstrcpy(g_contactlistdlg.m_resaddress,g_contactlistdlg.m_pcontacts[index].m_mailaddress);
HWND parent = GetParent(hDlg);
g_contactlistdlg.DestroyDlg(hDlg);
g_maileditdlg.m_havecontactflag = TRUE;
g_maileditdlg.m_pmail = NULL;
CMailEditDlg::DlgBox(g_maileditdlg,parent,g_hInst);
break;
}
default:
g_contactlistdlg.OnActive(hDlg);
break;
}
break;
case WM_NOTIFY:
if(IDC_LIST_CONTACTLISTVIEW == wParam)
{
g_contactlistdlg.OnListViewNotify(hDlg,lParam);
}
else
bProcessedMsg = FALSE;
break;
case WM_CLOSE:
g_contactlistdlg.DestroyDlg(hDlg);
break;
case WM_HOTKEY:
if(VK_TBACK == HIWORD(lParam))
{
}
else
bProcessedMsg = FALSE;
break;
case WM_INITMENUPOPUP:
g_contactlistdlg.OnMenuPopup(hDlg,wParam);
break;
case WM_ACTIVATE:
{
DWORD dwFlags = LOWORD(wParam);
if(dwFlags != WA_INACTIVE)
{
SetFocus(g_contactlistdlg.m_view);
}
else
bProcessedMsg = FALSE;
break;
}
default:
bProcessedMsg = FALSE;
break;
}
return bProcessedMsg;
}
BOOL CContactsListDlg::CreateDlg(HWND parent, HINSTANCE hInstance)
{
m_ceproval.propid = 0;
m_parent = parent;
g_contactmanager.OpenDataBase(ID_MAILADDRESS);
m_result = DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG_CONTACTLISTDLG), parent, (DLGPROC)ContactsListDialogProc);
if(m_result == -1)
return FALSE;
return TRUE;
}
BOOL CContactsListDlg::InitialDlg(const HWND hDlg)
{
TCHAR lpszSubTitle[30];
// Specify that the dialog box should stretch full screen
SHINITDLGINFO shidi;
ZeroMemory(&shidi, sizeof(shidi));
shidi.dwMask = SHIDIM_FLAGS;
shidi.dwFlags = SHIDIF_SIZEDLGFULLSCREEN;
shidi.hDlg = hDlg;
// Set up the menu bar
SHMENUBARINFO shmbi;
ZeroMemory(&shmbi, sizeof(shmbi));
shmbi.cbSize = sizeof(shmbi);
shmbi.hwndParent = hDlg;
shmbi.nToolBarId = IDR_MENUBAR_CONTACTLIST;
shmbi.hInstRes = g_hInst;
// If we could not initialize the dialog box, return an error
if (!(SHInitDialog(&shidi) && SHCreateMenuBar(&shmbi)))
{
return FALSE;
}
// set the title bar
LoadString(g_hInst, IDS_STRING_CONTACTLISTTITLE, lpszSubTitle, 30);
if (lpszSubTitle)
SetWindowText(hDlg, lpszSubTitle);
//initial the list view
RECT rc;
GetClientRect(hDlg,&rc);
m_view = CreateWindow(WC_LISTVIEW,NULL,WS_CHILD|WS_VISIBLE|LVS_REPORT|LVS_NOCOLUMNHEADER|LVS_OWNERDATA|WS_BORDER|LVS_NOSCROLL,
rc.left,rc.top,rc.right - rc.left,rc.bottom - rc.top,hDlg,(HMENU)IDC_LIST_CONTACTLISTVIEW,g_hInst,NULL);
if(m_view == NULL)
return FALSE;
ListView_SetExtendedListViewStyle(m_view,
ListView_GetExtendedListViewStyle(m_view) | LVS_EX_FULLROWSELECT);
//添加列
int w1 = (rc.right - rc.left);
LV_COLUMN lvColumn;
lvColumn.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_WIDTH;
lvColumn.fmt = LVCFMT_LEFT;
lvColumn.cx = w1;
if(-1 == ListView_InsertColumn(m_view,0, &lvColumn))
{
return FALSE;
}
//计算一页最大的行数
m_maxcountperpage = ListView_GetCountPerPage(m_view);
//
//inital m_pcontacts
m_curpage = 0;
UpDatePage(0);
if(m_countperpage != 0)
{
ListView_SetItemState(m_view,0,LVIS_SELECTED|LVIS_FOCUSED,LVIS_SELECTED|LVIS_FOCUSED);
}
//Overriding Back button functionality
(void)SendMessage(shmbi.hwndMB, SHCMBM_OVERRIDEKEY, VK_TBACK,
MAKELPARAM(SHMBOF_NODEFAULT | SHMBOF_NOTIFY,
SHMBOF_NODEFAULT | SHMBOF_NOTIFY));
//初始化m_display_kind
m_display_kind = DISPLAY_ADDRESS;
EnableWindow(GetDlgItem(hDlg,ID_MENUITEM_NAME),TRUE);
EnableWindow(GetDlgItem(hDlg,ID_MENUITEM_ADDRESS),FALSE);
#ifdef ADDCONTACT
CContacts c[26];
TCHAR m[26][4] = {_T("a"),_T("b"),_T("c"),_T("d"),_T("e"),_T("f"),_T("g"),
_T("h"),_T("i"),_T("j"),_T("k"),_T("l"),_T("m"),_T("n"),
_T("o"),_T("p"),_T("q"),_T("r"),_T("s"),_T("t"),_T("u"),
_T("v"),_T("w"),_T("x"),_T("y"),_T("z")};
for(int i = 0;i < 26;++i)
{
c[i].m_oidRecord = 0;
lstrcpy(c[i].m_name,_T("name"));
lstrcpy(c[i].m_des,_T("des"));
c[i].m_group = 0;
lstrcpy(c[i].m_mailaddress,m[i]);
g_contactmanager.EditContact(c[i]);
}
#endif
return TRUE;
}
BOOL CContactsListDlg::DestroyDlg(const HWND hDlg)
{
if(!EndDialog(hDlg,m_result))
return FALSE;
return TRUE;
}
LRESULT CContactsListDlg::OnListViewNotify(const HWND hDlg,LPARAM lParam)
{
NMHDR* pnmh = (NMHDR*) lParam;
LV_DISPINFO* pdi;
LPNMLVKEYDOWN pnkd;
switch(pnmh->code)
{
case LVN_GETDISPINFO:
pdi = (LV_DISPINFO*)lParam;
if(0 == pdi->item.iSubItem)
{
if(pdi->item.mask & LVIF_TEXT)
{
ASSERT(pdi->item.iItem >= 0&& pdi->item.iItem < m_maxcountperpage);
if(m_display_kind == DISPLAY_ADDRESS)
{
swprintf(pdi->item.pszText,L"%s",m_pcontacts[pdi->item.iItem].m_mailaddress);
}
else
{
swprintf(pdi->item.pszText,L"%s",m_pcontacts[pdi->item.iItem].m_name);
}
}
if(pdi->item.mask & LVIF_IMAGE)
{
pdi->item.iImage = 0;
}
}
break;
case LVN_KEYDOWN:
pnkd = (LV_KEYDOWN FAR *)lParam;
if(pnkd->wVKey == VK_UP)
{
if(ListView_GetItemState(m_view,0,LVIS_SELECTED))
{
ListView_SetItemState(m_view,0,0,LVIS_SELECTED|LVIS_FOCUSED);
if(m_curpage - 1 >= 0)
{
UpDatePage(m_curpage-1);
}
else
{
int max = GetLastPage();
UpDatePage(max);
}
ListView_SetItemState(m_view,m_countperpage,LVIS_SELECTED|LVIS_FOCUSED,LVIS_SELECTED|LVIS_FOCUSED);
}
}
if(pnkd->wVKey == VK_DOWN)
{
if(ListView_GetItemState(m_view,m_countperpage-1,LVIS_SELECTED))
{
ListView_SetItemState(m_view,m_countperpage-1,0,LVIS_SELECTED|LVIS_FOCUSED);
int max = GetLastPage();
if(m_curpage + 1 <= max)
UpDatePage(m_curpage + 1);
else
UpDatePage(0);
ListView_SetItemState(m_view,-1,LVIS_SELECTED|LVIS_FOCUSED,LVIS_SELECTED|LVIS_FOCUSED);
}
}
break;
}
return 0;
}
BOOL CContactsListDlg::UpDatePage(int curpage)
{
int total = g_contactmanager.GetNumDisplay(&m_ceproval,1);
m_curpage = curpage;
if(total <= 0)
{
m_curpage = 0;
ListView_SetItemCount(m_view,0);
m_countperpage = 0;
}
else if((m_curpage+1)*m_maxcountperpage > total)
{
int n = total - total/m_maxcountperpage*m_maxcountperpage;
ListView_SetItemCount(m_view,n);
m_countperpage = n;
}
else
{
m_countperpage = m_maxcountperpage;
ListView_SetItemCount(m_view,m_countperpage);
}
int begin = m_curpage*m_maxcountperpage;
int index,end = (m_curpage+1)*m_maxcountperpage;
end = end < total?end:total;
for(index = begin;index < end;++index)
{
g_contactmanager.SeekToPos(index,m_pcontacts[index-begin],&m_ceproval,1);
g_contactmanager.ReadContactRecord(m_pcontacts[index-begin]);
}
return TRUE;
}
BOOL CContactsListDlg::IsLastPage(int page)
{
int total = g_contactmanager.GetNumDisplay(&m_ceproval,1);
if((page+1)*m_maxcountperpage >= total)
return TRUE;
return FALSE;
}
int CContactsListDlg::GetLastPage()
{
int total = g_contactmanager.GetNumDisplay(&m_ceproval,1);
if(total == 0)
return 0;
return (total - 1) / m_maxcountperpage;
}
BOOL CContactsListDlg::OnActive(HWND hwnd)
{
int index = GetCurIndex();
if(index < 0)
return FALSE;
if(!m_selectflag)
{
lstrcpy(g_newcontactdlg.m_contacts.m_mailaddress,m_pcontacts[index].m_mailaddress);
lstrcpy(g_newcontactdlg.m_contacts.m_des,m_pcontacts[index].m_des);
g_newcontactdlg.m_contacts.m_group = m_pcontacts[index].m_group;
lstrcpy(g_newcontactdlg.m_contacts.m_name,m_pcontacts[index].m_name);
g_newcontactdlg.m_contacts.m_oidRecord = m_pcontacts[index].m_oidRecord;
g_newcontactdlg.m_addcontact = FALSE;
g_newcontactdlg.CreateDlg(hwnd,g_hInst);
UpDatePage(0);
}
else
{
lstrcpy(m_resaddress,m_pcontacts[index].m_mailaddress);
DestroyDlg(hwnd);
}
return TRUE;
}
int CContactsListDlg::GetCurIndex()
{
int i;
for(i = 0;i < m_countperpage;++i)
{
if(ListView_GetItemState(m_view,i,LVIS_SELECTED))
return i;
}
return -1;
}
void CContactsListDlg::DisplayAddress(HWND hDlg)
{
EnableWindow(GetDlgItem(hDlg,ID_MENUITEM_ADDRESS),FALSE);
EnableWindow(GetDlgItem(hDlg,ID_MENUITEM_NAME),TRUE);
m_display_kind = DISPLAY_ADDRESS;
InvalidateRect(m_view,NULL,FALSE);
}
void CContactsListDlg::DisplayName(HWND hDlg)
{
EnableWindow(GetDlgItem(hDlg,ID_MENUITEM_ADDRESS),TRUE);
EnableWindow(GetDlgItem(hDlg,ID_MENUITEM_NAME),FALSE);
m_display_kind = DISPLAY_NAME;
InvalidateRect(m_view,NULL,FALSE);
}
void CContactsListDlg::SearchByName(HWND hDlg)
{
g_contactmanager.OpenDataBase(ID_NAME);
m_ceproval.propid = ID_NAME;
m_ceproval.wFlags = 0;
m_ceproval.wLenData = 0;
m_ceproval.val.lpwstr = m_buffer;
UpDatePage(0);
InvalidateRect(m_view,NULL,FALSE);
}
void CContactsListDlg::SearchByAddress(HWND hdlg)
{
g_contactmanager.OpenDataBase(ID_MAILADDRESS);
m_ceproval.propid = ID_MAILADDRESS;
m_ceproval.wFlags = 0;
m_ceproval.wLenData = 0;
m_ceproval.val.lpwstr = m_buffer;
UpDatePage(0);
InvalidateRect(m_view,NULL,FALSE);
}
void CContactsListDlg::SearchByGroup(HWND hdlg, int group)
{
g_contactmanager.OpenDataBase(ID_GROUP);
m_ceproval.propid = ID_GROUP;
m_ceproval.wFlags = 0;
m_ceproval.wLenData = 0;
m_ceproval.val.lVal = group;
UpDatePage(0);
InvalidateRect(m_view,NULL,FALSE);
}
void CContactsListDlg::NoSearch(HWND hwnd)
{
g_contactmanager.OpenDataBase(ID_MAILADDRESS);
m_ceproval.propid = 0;
m_ceproval.wFlags = 0;
m_ceproval.wLenData = 0;
m_ceproval.val.lVal = 0;
UpDatePage(0);
InvalidateRect(m_view,NULL,FALSE);
}
void CContactsListDlg::DeleteContact(HWND hDlg)
{
int index = GetCurIndex();
if(index < 0)
return ;
g_contactmanager.DeleteRecord(m_pcontacts[index]);
UpDatePage(0);
InvalidateRect(m_view,NULL,FALSE);
}
BOOL CContactsListDlg::OnMenuPopup(HWND hDlg, WPARAM wp)
{
if(!m_selectflag)
{
EnableMenuItem((HMENU)wp, ID_MENUITEM_SENDMAIL, MF_BYCOMMAND | MF_ENABLED);
}
else
{
EnableMenuItem((HMENU)wp, ID_MENUITEM_SENDMAIL, MF_BYCOMMAND | MF_GRAYED);
}
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -