⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ccontactslistdlg.cpp

📁 这个基于嵌入式平台SMART PHONE电子邮件收发管理系统(MAIL MAN是一个电子邮件客户端软件。它以很小的体积
💻 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 + -