SendDlg.cpp
上传用户:weimei12
上传日期:2022-08-11
资源大小:185k
文件大小:6k
源码类别:

Email客户端

开发平台:

Visual C++

  1. // SendDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "SimpleMail.h"
  5. #include "ExpandEditCtrl.h"
  6. #include "SendDlg.h"
  7. #include "ImageDataObject.h"
  8. // CSendDlg dialog
  9. IMPLEMENT_DYNAMIC(CSendDlg, CDialog)
  10. CSendDlg::CSendDlg(CWnd* pParent /*=NULL*/)
  11. : CDialog(CSendDlg::IDD, pParent)
  12. , m_strRcps(_T(""))
  13. , m_strTopic(_T(""))
  14. , m_strContent(_T(""))
  15. , m_strCCRcps(_T(""))
  16. , m_strBCCRcps(_T(""))
  17. , m_pEditAttach(NULL)
  18. , m_pRichEditOle(NULL)
  19. {
  20. }
  21. CSendDlg::~CSendDlg()
  22. {
  23. if (NULL != m_pRichEditOle)
  24. {
  25. //m_pRichEditOle->Release();
  26. }
  27. if (NULL != m_pEditAttach)
  28. {
  29. delete m_pEditAttach;
  30. m_pEditAttach = NULL;
  31. }
  32. }
  33. void CSendDlg::DoDataExchange(CDataExchange* pDX)
  34. {
  35. CDialog::DoDataExchange(pDX);
  36. DDX_Text(pDX, IDC_EDIT_RCP, m_strRcps);
  37. DDX_Text(pDX, IDC_EDIT_TOPIC, m_strTopic);
  38. DDX_Text(pDX, IDC_CONTENT, m_strContent);
  39. DDX_Text(pDX, IDC_EDIT_CC, m_strCCRcps);
  40. DDX_Text(pDX, IDC_EDIT_BCC, m_strBCCRcps);
  41. }
  42. BEGIN_MESSAGE_MAP(CSendDlg, CDialog)
  43. ON_BN_CLICKED(IDC_BTN_SEND, &CSendDlg::OnBnClickedBtnSend)
  44. ON_BN_CLICKED(IDC_BTN_ACCESSORY, &CSendDlg::OnBnClickedBtnAccessory)
  45. ON_WM_DROPFILES()
  46. ON_MESSAGE(WM_DEL_FILE, &CSendDlg::DeleteAttachFile)
  47. END_MESSAGE_MAP()
  48. // CSendDlg message handlers
  49. void CSendDlg::OnBnClickedBtnSend()
  50. {
  51. // TODO: Add your control notification handler code here
  52. CDialog::OnOK();
  53. }
  54. void CSendDlg::OnBnClickedBtnAccessory()
  55. {
  56. char szFilters[]=
  57. "All Files (*.*)|*.*||";
  58. CFileDialog fileDlg(TRUE, NULL, NULL, OFN_FILEMUSTEXIST, szFilters);
  59. if(fileDlg.DoModal() == IDOK)
  60. {
  61. CString strPathName = fileDlg.GetPathName();
  62. m_arrAttachFiles.Add(strPathName);
  63. //create a edit to display the file attached
  64. if (NULL == m_pEditAttach)
  65. {
  66. CreateEdit();
  67. }
  68. UpdateEditContent(strPathName);
  69. }
  70. }
  71. BOOL CSendDlg::OnInitDialog()
  72. {
  73. CDialog::OnInitDialog();
  74. // TODO:  Add extra initialization here
  75. DragAcceptFiles();
  76. return TRUE;  // return TRUE unless you set the focus to a control
  77. // EXCEPTION: OCX Property Pages should return FALSE
  78. }
  79. void CSendDlg::OnDropFiles(HDROP hDropInfo)
  80. {
  81. //obtain the path
  82. TCHAR szFile[MAX_PATH] = {0};   
  83. DragQueryFile(hDropInfo, 0, szFile, MAX_PATH);   
  84. m_arrAttachFiles.Add(szFile);
  85. DragFinish(hDropInfo);
  86. //create a edit to display the file attached
  87. if (NULL == m_pEditAttach)
  88. {
  89. CreateEdit();
  90. }
  91. UpdateEditContent(szFile);
  92. CDialog::OnDropFiles(hDropInfo);
  93. }
  94. ///<summary>
  95. ///   delete the specified file
  96. ///</summary>
  97. LRESULT CSendDlg::DeleteAttachFile(WPARAM wParam, LPARAM lParam)
  98. {
  99. ASSERT((wParam >= 0) && (wParam <= (UINT)m_arrAttachFiles.GetUpperBound()));
  100. m_arrAttachFiles.RemoveAt(wParam);
  101. return HRESULT_SUCCESS;
  102. }
  103. ///<summary>
  104. ///   create the edit for the accessory
  105. ///</summary>
  106. void CSendDlg::CreateEdit()
  107. {
  108. //reduce the origin edit
  109. CRect contentRect;
  110. GetDlgItem(IDC_CONTENT)->GetWindowRect(&contentRect);
  111. ScreenToClient(&contentRect);
  112. GetDlgItem(IDC_CONTENT)->SetWindowPos(&wndTop, contentRect.left, contentRect.top,
  113.   contentRect.Size().cx, contentRect.Size().cy * 2 / 3, SWP_SHOWWINDOW);
  114. CRect attachRect(contentRect.left, contentRect.bottom - contentRect.Height() / 3,
  115. contentRect.right, contentRect.bottom);
  116. m_pEditAttach = new CExpandEditCtrl;
  117. m_pEditAttach->Create(ES_MULTILINE | WS_CHILD | WS_VISIBLE 
  118.   | WS_TABSTOP | WS_BORDER | WS_VSCROLL, 
  119.   attachRect, this, IDC_ATTACH);
  120. ::RevokeDragDrop(m_pEditAttach->m_hWnd);
  121. if (NULL == m_pRichEditOle)
  122. {
  123. m_pRichEditOle = m_pEditAttach->GetIRichEditOle();
  124. ASSERT(m_pRichEditOle != NULL);
  125. if (NULL == m_pRichEditOle)
  126. {
  127. return;
  128. }
  129. }
  130. }
  131. ///<summary>
  132. ///   update the edit of the accessory
  133. ///</summary>
  134. void CSendDlg::UpdateEditContent(LPCTSTR pszPath)
  135. {
  136. ASSERT(pszPath != NULL);
  137. if (NULL == pszPath)
  138. {
  139. return;
  140. }
  141.     //get the file name
  142. SHFILEINFO stFileInfo;
  143. memset(&stFileInfo, 0, sizeof(stFileInfo));
  144. if (SHGetFileInfo(pszPath, 0 , &stFileInfo, sizeof(stFileInfo), SHGFI_DISPLAYNAME) == 0)
  145. {
  146. ASSERT(FALSE);
  147. return;
  148. }
  149. //get the file size
  150. WIN32_FIND_DATA fileInfo; 
  151. HANDLE hFind = NULL; 
  152. int nFileSize = 0; 
  153. hFind = FindFirstFile(pszPath, &fileInfo); 
  154. if(hFind != INVALID_HANDLE_VALUE)
  155. {
  156. nFileSize = fileInfo.nFileSizeLow / 1024 + 1;
  157. }
  158. else
  159. {
  160. ASSERT(FALSE);
  161. return;
  162. }
  163. FindClose(hFind);
  164. //Draw the file icon with the file name and the file size
  165. CString strName;
  166. strName.Format("%s (%dK)rn", stFileInfo.szDisplayName, nFileSize);
  167. DrawFileIcon(pszPath, strName);
  168. }
  169. ///<summary>
  170. ///   format the image with the file infomation
  171. ///</summary>
  172. HBITMAP CSendDlg::FormatImage(CImageList& list, const int num, LPCTSTR pszName)
  173. {
  174. //Get the image infomation to decide the size
  175. IMAGEINFO ii;
  176. list.GetImageInfo(num, &ii);
  177. int nWidth = ii.rcImage.right - ii.rcImage.left;
  178. int nHeight = ii.rcImage.bottom - ii.rcImage.top;
  179. //Draw the bmp in the memory
  180. CBitmap dist;
  181. CClientDC dc(NULL);
  182. CDC memDC;
  183. memDC.CreateCompatibleDC(&dc);
  184. CFont Font;
  185. Font.CreatePointFont(80, "Microsoft Sans Serif");
  186. CFont* pFont = memDC.SelectObject(&Font);
  187. pFont->DeleteObject();
  188. CSize sizeName = memDC.GetTextExtent(pszName);
  189. dist.CreateCompatibleBitmap(&dc, sizeName.cx + nWidth * 3, nHeight);//nWidth * 3 is used to insert some blanks
  190. CBitmap* pOldBitmap = memDC.SelectObject(&dist);
  191. memDC.FillSolidRect(0, 0, sizeName.cx + nWidth * 3, nHeight, 
  192. m_pEditAttach->SetBackgroundColor(TRUE, 0));
  193. list.Draw(&memDC, num, CPoint(0, 0), ILD_NORMAL);
  194. memDC.DrawText(pszName, CRect(nWidth + 1, 0, sizeName.cx, nHeight), DT_NOCLIP);
  195. memDC.SelectObject(pOldBitmap);
  196. return (HBITMAP)dist.Detach();
  197. }
  198. ///<summary>
  199. ///   Draw the file icon with the file name and the file size
  200. ///</summary>
  201. void CSendDlg::DrawFileIcon(LPCTSTR pszPath, LPCTSTR pszName)
  202. {
  203. m_pEditAttach->PostMessage(WM_VSCROLL, SB_BOTTOM, 0);
  204. //extract the file icon
  205. SHFILEINFO stFileInfo;
  206. memset(&stFileInfo, 0, sizeof(stFileInfo));
  207. HIMAGELIST s_himl = NULL;
  208. s_himl = (HIMAGELIST)SHGetFileInfo(pszPath, 0, &stFileInfo, 
  209. sizeof(stFileInfo), SHGFI_SYSICONINDEX| SHGFI_SMALLICON);
  210. if (NULL == s_himl)
  211. {
  212. return;
  213. }
  214. //draw the icon
  215. CImageList tmpList;
  216. tmpList.Attach(s_himl);
  217. HBITMAP hBmp = NULL;
  218. hBmp = FormatImage(tmpList, stFileInfo.iIcon, pszName);
  219. if (hBmp)
  220. {
  221. CImageDataObject::InsertBitmap(m_pRichEditOle, hBmp);
  222. }
  223. tmpList.Detach();
  224. }