📄 csendmaildlg.cpp
字号:
// CSendMailDlg.cpp: implementation of the CSendMailDlg class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "CSendMailDlg.h"
#include "CMailEditDlg.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CSendMailDlg g_sendmaildlg;
extern HBITMAP g_mailsendmap;
extern HBITMAP g_mailnotsendmap;
extern CSendMailDB g_sendmaildb;
extern TCHAR g_username[ADDRESS_LENTH];
extern CMailEditDlg g_maileditdlg;
CSendMailDlg::CSendMailDlg()
{
}
CSendMailDlg::~CSendMailDlg()
{
}
BOOL CALLBACK CSendMailDlgProc(const HWND hDlg, const UINT uiMessage, const WPARAM wParam, const LPARAM lParam)
{
BOOL bProcessedMsg = TRUE;
switch(uiMessage)
{
case WM_INITDIALOG:
CSendMailDlg::InitialDlg(g_sendmaildlg,hDlg);
break;
case WM_MEASUREITEM: //Set the item height to 36 pixels
{
LPMEASUREITEMSTRUCT lpmi;
lpmi = (LPMEASUREITEMSTRUCT)lParam;
if(lpmi->CtlType == ODT_LISTVIEW)
{
lpmi->itemHeight = 30;
}
break;
}
case WM_DRAWITEM: //custom drawing code for owner-draw listview control
CSendMailDlg::DrawItem(g_sendmaildlg,hDlg,lParam);
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case ID_MENUITEM_EXIT:
CSendMailDlg::DestroyDlg(g_sendmaildlg,hDlg);
break;
case ID_MENUITEM_DELETE:
{
int index = ListView_GetNextItem(g_sendmaildlg.m_view,-1,LVNI_SELECTED);
if(index == -1)
break;
CSMailImf mail;
g_sendmaildb.SeekToPos(index,mail,&g_sendmaildlg.m_curcep,1);
g_sendmaildb.ReadRecord(mail);
TCHAR imf[50];
LoadString(g_hInst,IDS_STRING_READLLYDELETEMAIL,imf,50);
int res = MessageBox(hDlg,imf,NULL,MB_OKCANCEL|MB_ICONQUESTION);
if(res == IDOK)
{
CSendMailDlg::DeleteMail(g_sendmaildlg,hDlg,mail);
ListView_SetItemCount(g_sendmaildlg.m_view, g_sendmaildb.GetNumDisplay(g_username,0,NULL));
InvalidateRect(g_sendmaildlg.m_view,NULL,FALSE);
}
break;
}
case ID_MENUITEM_CLEARALL:
{
TCHAR imf[50];
LoadString(g_hInst,IDS_STRING_REALLYCLEAR,imf,50);
int res = MessageBox(hDlg,imf,NULL,MB_OKCANCEL|MB_ICONQUESTION);
if(res == IDOK)
{
CSendMailDlg::ClearMailBox(g_sendmaildlg,hDlg);
ListView_SetItemCount(g_sendmaildlg.m_view, g_sendmaildb.GetNumDisplay(g_username,0,NULL));
InvalidateRect(g_sendmaildlg.m_view,NULL,FALSE);
}
break;
}
case ID_MENUITEM_SD:
{
g_sendmaildb.OpenDataBase(ID_TIME,g_username);
InvalidateRect(g_sendmaildlg.m_view,NULL,FALSE);
break;
}
case ID_MENUITEM_SS:
{
g_sendmaildb.OpenDataBase(ID_SIZE,g_username);
InvalidateRect(g_sendmaildlg.m_view,NULL,FALSE);
break;
}
case ID_MENUITEM_SA:
{
g_sendmaildb.OpenDataBase(ID_ADDRESS,g_username);
InvalidateRect(g_sendmaildlg.m_view,NULL,FALSE);
break;
}
case ID_MENUITEM_SENDED:
{
g_sendmaildb.OpenDataBase(ID_SENDFLAG,g_username);
g_sendmaildlg.m_curcep.propid = ID_SENDFLAG;
g_sendmaildlg.m_curcep.wLenData = g_sendmaildlg.m_curcep.wFlags = 0;
g_sendmaildlg.m_curcep.val.iVal = MAIL_SENDED;
ListView_SetItemCount(g_sendmaildlg.m_view, g_sendmaildb.GetNumDisplay(g_username,&g_sendmaildlg.m_curcep,1));
InvalidateRect(g_sendmaildlg.m_view,NULL,FALSE);
break;
}
case ID_MENUITEM_NONE:
{
g_sendmaildb.OpenDataBase(ID_TIME,g_username);
g_sendmaildlg.m_curcep.propid = 0;
ListView_SetItemCount(g_sendmaildlg.m_view, g_sendmaildb.GetNumDisplay(g_username,&g_sendmaildlg.m_curcep,1));
InvalidateRect(g_sendmaildlg.m_view,NULL,FALSE);
break;
}
default:
if(BN_CLICKED == HIWORD(wParam))
{
int index = ListView_GetNextItem(g_sendmaildlg.m_view,-1,LVNI_SELECTED);
if(index == -1)
break;
CSMailImf mail;
g_sendmaildb.SeekToPos(index,mail,&g_sendmaildlg.m_curcep,1);
g_sendmaildb.ReadRecord(mail);
g_maileditdlg.m_pmail = &mail;
g_maileditdlg.m_havecontactflag = FALSE;
CMailEditDlg::DlgBox(g_maileditdlg,hDlg,g_hInst);
}
break;
}
break;
case WM_CLOSE:
break;
case WM_HOTKEY:
if(VK_TBACK == HIWORD(lParam))
{
}
else
bProcessedMsg = FALSE;
break;
case WM_ACTIVATE:
{
DWORD dwFlags = LOWORD(wParam);
if(dwFlags != WA_INACTIVE)
{
SetFocus(g_sendmaildlg.m_view);
}
}
break;
case WM_NOTIFY:
if(IDC_LIST_MAIL == wParam)
{
CSendMailDlg::OnListViewNotify(g_sendmaildlg,hDlg,lParam);
}
else
{
bProcessedMsg = FALSE;
}
break;
default:
bProcessedMsg = FALSE;
break;
}
return bProcessedMsg;
}
BOOL CSendMailDlg::DlgBox(CSendMailDlg &dlg, HINSTANCE hinst, HWND parent)
{
dlg.m_result = DialogBox(hinst,MAKEINTRESOURCE(IDD_DIALOG_SENDMAILDLAG),parent,(DLGPROC)CSendMailDlgProc);
if(dlg.m_result == -1)
return FALSE;
return TRUE;
}
BOOL CSendMailDlg::InitialDlg(CSendMailDlg &dlg, HWND hDlg)
{
TCHAR lpszSubTitle[30];
TCHAR headertitle[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_SENDMAILBOX;
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_SENDMAILBOX,lpszSubTitle,ARRAYSIZE(lpszSubTitle));
if (lpszSubTitle)
SetWindowText(hDlg,lpszSubTitle);
RECT rc;
GetClientRect(hDlg,&rc);
dlg.m_view = CreateWindow(WC_LISTVIEW, NULL,
WS_CHILD | WS_VISIBLE | LVS_REPORT | LVS_OWNERDATA |LVS_OWNERDRAWFIXED | WS_BORDER,
rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top,
hDlg, (HMENU)IDC_LIST_MAILBOXLISTVIEW, g_hInst,NULL);
ListView_SetExtendedListViewStyle(dlg.m_view,
ListView_GetExtendedListViewStyle(dlg.m_view) | LVS_EX_FULLROWSELECT);
//添加列
dlg.m_columwidth[0] = (rc.right-rc.left)*3/5;
LV_COLUMN lvColumn;
lvColumn.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_WIDTH |LVCF_TEXT;
lvColumn.fmt = LVCFMT_LEFT;
lvColumn.cx = dlg.m_columwidth[0];
LoadString(g_hInst,IDS_STRING_TOADDRESS,headertitle,30);
lvColumn.pszText = headertitle;
if(-1 == ListView_InsertColumn(dlg.m_view,0, &lvColumn))
{
return FALSE;
}
dlg.m_columwidth[1] = (rc.right - rc.left)*3/5;
lvColumn.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_WIDTH |LVCF_TEXT;
lvColumn.fmt = LVCFMT_LEFT;
lvColumn.cx = dlg.m_columwidth[1];
LoadString(g_hInst,IDS_STRING_MAILSUBJECT,headertitle,30);
lvColumn.pszText = headertitle;
if(-1 == ListView_InsertColumn(dlg.m_view,1, &lvColumn))
{
return FALSE;
}
dlg.m_columwidth[2] = (rc.right - rc.left)*2/5+4;
lvColumn.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_WIDTH |LVCF_TEXT;
lvColumn.fmt = LVCFMT_LEFT;
lvColumn.cx = dlg.m_columwidth[2];
LoadString(g_hInst,IDS_STRING_SENDTIME,headertitle,30);
lvColumn.pszText = headertitle;
if(-1 == ListView_InsertColumn(dlg.m_view,2, &lvColumn))
{
return FALSE;
}
dlg.m_columwidth[3] = (rc.right - rc.left)/4+5;
lvColumn.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_WIDTH |LVCF_TEXT;
lvColumn.fmt = LVCFMT_LEFT;
lvColumn.cx = dlg.m_columwidth[3];
LoadString(g_hInst,IDS_STRING_MAILSIZE,headertitle,30);
lvColumn.pszText = headertitle;
if(-1 == ListView_InsertColumn(dlg.m_view,3, &lvColumn))
{
return FALSE;
}
//Overriding Back button functionality
(void)SendMessage(shmbi.hwndMB, SHCMBM_OVERRIDEKEY, VK_TBACK,
MAKELPARAM(SHMBOF_NODEFAULT | SHMBOF_NOTIFY,
SHMBOF_NODEFAULT | SHMBOF_NOTIFY));
//open db
if(g_sendmaildb.OpenDataBase(ID_TIME,g_username) == FALSE)
{
if(g_sendmaildb.CreateDataBase(g_username) == FALSE)
{
return FALSE;
}
g_sendmaildb.OpenDataBase(ID_TIME,g_username);
}
ListView_SetItemCount(dlg.m_view, g_sendmaildb.GetNumDisplay(g_username,0,NULL));
return TRUE;
}
BOOL CSendMailDlg::DestroyDlg(CSendMailDlg &dlg, HWND hDlg)
{
if(!EndDialog(hDlg,dlg.m_result))
return FALSE;
return TRUE;
}
LRESULT CSendMailDlg::OnListViewNotify(CSendMailDlg &dlg, HWND hDlg, LPARAM lParam)
{
NMHDR* pnmh = (NMHDR*) lParam;
LRESULT lResult = 0;
switch(pnmh->code)
{
case LVN_GETDISPINFO:
break;
case LVN_ITEMACTIVATE:
break;
case LVN_ODFINDITEM:
break;
}
return(lResult);
}
BOOL CSendMailDlg::DrawItem(CSendMailDlg &dlg, HWND hDlg, LPARAM lParam)
{
CSMailImf mail;
LPDRAWITEMSTRUCT lpdis;
lpdis = (LPDRAWITEMSTRUCT)lParam;
HDC hdc;
int index;
DWORD linelen;
if(lpdis->CtlType != ODT_LISTVIEW)
return TRUE;
LPCTSTR lpszText = (LPCTSTR) lpdis->itemData;
index = lpdis->itemID;
g_sendmaildb.SeekToPos(index,mail,&dlg.m_curcep,1);
g_sendmaildb.ReadRecord(mail);
hdc = lpdis->hDC;
//draw the back ground
COLORREF crOldTextColor = GetTextColor(hdc);
COLORREF crOldBkColor = GetBkColor(hdc);
HBRUSH hbrBkColor = CreateSolidBrush (crOldBkColor);
HBRUSH hbrSEL = CreateSolidBrush (GetSysColor(COLOR_HIGHLIGHT));
if ((lpdis->itemAction | ODA_SELECT) && (lpdis->itemState & ODS_SELECTED))
{
SetTextColor(hdc, GetSysColor(COLOR_HIGHLIGHTTEXT));
FillRect(hdc, &lpdis->rcItem,hbrSEL);
}
else
FillRect(hdc, &lpdis->rcItem,hbrBkColor);
DeleteObject (hbrSEL);
DeleteObject (hbrBkColor);
if(mail.m_sendflag == MAIL_SENDED)
{
HDC hdcTemp = CreateCompatibleDC(hdc);
SelectObject(hdcTemp, g_mailsendmap);
BITMAP bm;
GetObject(g_mailsendmap, sizeof(BITMAP), &bm);
BOOL res = BitBlt(hdc,lpdis->rcItem.left+2,(lpdis->rcItem.top+5), bm.bmWidth, bm.bmHeight, hdcTemp, 0, 0, SRCCOPY);
DeleteDC(hdcTemp);
}
else
{
HDC hdcTemp = CreateCompatibleDC(hdc);
SelectObject(hdcTemp, g_mailnotsendmap);
BITMAP bm;
GetObject(g_mailnotsendmap, sizeof(BITMAP), &bm);
BOOL res = TransparentImage(hdc,lpdis->rcItem.left+2,(lpdis->rcItem.top+5), bm.bmWidth, bm.bmHeight, hdcTemp,0,0,bm.bmWidth, bm.bmHeight,RGB(255,255,255));
DeleteDC(hdcTemp);
}
RECT textrc;
TCHAR buffer[80];
TCHAR text[80];
//draw address
textrc.bottom = lpdis->rcItem.bottom;
textrc.top = lpdis->rcItem.top;
textrc.right = lpdis->rcItem.left + dlg.m_columwidth[0];
textrc.left = lpdis->rcItem.left+20;
lstrcpy(buffer,mail.m_address);
if(mail.m_numaddress > 1)
lstrcat(buffer,L"\n...");
linelen = 13;
if(lstrlen(buffer) > linelen)
{
wcsncpy(text,buffer,linelen);
text[linelen] = TCHAR('\n');
lstrcpy(text+linelen+1,buffer+linelen);
}
else
lstrcpy(text,buffer);
DrawText(hdc,text,-1,&textrc,DT_WORDBREAK);
//draw sub
textrc.left = lpdis->rcItem.left + dlg.m_columwidth[0]+6;
textrc.right = lpdis->rcItem.left + dlg.m_columwidth[0] + dlg.m_columwidth[1];
linelen = 16;
if(lstrlen(mail.m_mailsubject) > linelen)
{
wcsncpy(text,mail.m_mailsubject,linelen);
text[linelen] = TCHAR('\n');
lstrcpy(text+linelen+1,mail.m_mailsubject+linelen);
}
else
lstrcpy(text,mail.m_mailsubject);
DrawText(hdc,text,-1,&textrc,DT_WORDBREAK);
// Reset the background color and the text color back to their
// original values.
// draw time
SYSTEMTIME systime;
FileTimeToSystemTime(&mail.m_time,&systime);
if(mail.m_sendflag == !MAIL_NOTSEND)
{
wsprintf(buffer,L"%04d.%02d.%02d\n%02d : %02d ",systime.wYear,systime.wMonth,systime.wDay,systime.wHour,systime.wMinute);
}
else
{
wsprintf(buffer,L"----.--.-- ",systime.wYear,systime.wMonth,systime.wDay,systime.wHour,systime.wMinute);
}
textrc.left = lpdis->rcItem.left + dlg.m_columwidth[0] + dlg.m_columwidth[1]+6;
textrc.right = lpdis->rcItem.left + dlg.m_columwidth[0] + dlg.m_columwidth[1] + dlg.m_columwidth[2];
DrawText(hdc,buffer,-1,&textrc,DT_WORDBREAK);
//draw size;
textrc.left = lpdis->rcItem.left + dlg.m_columwidth[0] + dlg.m_columwidth[1]+ dlg.m_columwidth[2]+6;
textrc.right = lpdis->rcItem.left + dlg.m_columwidth[0] + dlg.m_columwidth[1] + dlg.m_columwidth[2]+ dlg.m_columwidth[3];
if(mail.m_size < 1024)
{
wsprintf(buffer,L"%d B",mail.m_size);
}
else
{
wsprintf(buffer,L"%.2f KB",mail.m_size / 1024.0);
}
DrawText(hdc,buffer,-1,&textrc,DT_WORDBREAK);
SetTextColor(hdc, crOldTextColor);
SetBkColor(hdc, crOldBkColor);
ReleaseDC (dlg.m_view, hdc);
return TRUE;
}
BOOL CSendMailDlg::DeleteMail(CSendMailDlg &dlg, HWND hDlg, CSMailImf &mail)
{
BOOL res = DeleteFile(mail.m_file);
res = g_sendmaildb.DeleteRecord(mail);
return TRUE;
}
BOOL CSendMailDlg::ClearMailBox(CSendMailDlg &dlg, HWND hDlg)
{
BOOL res1 = g_sendmaildb.ClearRecord(g_username);
CSendMailManager m;
BOOL res2 = m.ClearMailFile(g_username);
return res1&&res2;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -