CGuadanWnd.cpp 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. #include "pch.h"
  2. #include "CGuadanWnd.h"
  3. #include "../page/CDiandanPageUI.h"
  4. #include "../page/CSaomashouyinPageUI.h"
  5. LRESULT CGuadanWnd::OnNcHitTest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  6. {
  7. POINT pt;
  8. pt.x = GET_X_LPARAM(lParam);
  9. pt.y = GET_Y_LPARAM(lParam);
  10. ::ScreenToClient(*this, &pt);
  11. RECT rcClient;
  12. ::GetClientRect(*this, &rcClient);
  13. RECT rcCaption = m_pm.GetCaptionRect();
  14. if (pt.x >= rcClient.left + rcCaption.left && pt.x < rcClient.right - rcCaption.right \
  15. && pt.y >= rcCaption.top && pt.y < rcCaption.bottom)
  16. {
  17. CControlUI* pControl = static_cast<CControlUI*>(m_pm.FindControl(pt));
  18. if (pControl && _tcscmp(pControl->GetClass(), L"ButtonUI") != 0)
  19. {
  20. return HTCAPTION;
  21. }
  22. }
  23. return HTCLIENT;
  24. }
  25. LRESULT CGuadanWnd::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  26. {
  27. SIZE szRoundCorner = m_pm.GetRoundCorner();
  28. if (!::IsIconic(*this) && (szRoundCorner.cx != 0 || szRoundCorner.cy != 0))
  29. {
  30. CDuiRect rcWnd;
  31. ::GetWindowRect(*this, &rcWnd);
  32. rcWnd.Offset(-rcWnd.left, -rcWnd.top);
  33. rcWnd.right++;
  34. rcWnd.bottom++;
  35. HRGN hRgn = ::CreateRoundRectRgn(rcWnd.left, rcWnd.top, rcWnd.right, rcWnd.bottom, szRoundCorner.cx, szRoundCorner.cy);
  36. ::SetWindowRgn(*this, hRgn, TRUE);
  37. ::DeleteObject(hRgn);
  38. }
  39. bHandled = FALSE;
  40. return 0;
  41. }
  42. LRESULT CGuadanWnd::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
  43. {
  44. LRESULT lRes = 0;
  45. BOOL bHandled = TRUE;
  46. switch (uMsg)
  47. {
  48. case WM_CREATE:
  49. lRes = OnCreate(uMsg, wParam, lParam, bHandled);
  50. break;
  51. case WM_NCACTIVATE:
  52. lRes = OnNcActivate(uMsg, wParam, lParam, bHandled);
  53. break;
  54. case WM_NCCALCSIZE:
  55. lRes = OnNcCalcSize(uMsg, wParam, lParam, bHandled);
  56. break;
  57. case WM_NCPAINT:
  58. lRes = OnNcPaint(uMsg, wParam, lParam, bHandled);
  59. break;
  60. case WM_NCHITTEST:
  61. lRes = OnNcHitTest(uMsg, wParam, lParam, bHandled);
  62. break;
  63. case WM_SIZE:
  64. lRes = OnSize(uMsg, wParam, lParam, bHandled);
  65. break;
  66. default:
  67. bHandled = FALSE;
  68. }
  69. if (bHandled)
  70. {
  71. return lRes;
  72. }
  73. if (m_pm.MessageHandler(uMsg, wParam, lParam, lRes))
  74. {
  75. return lRes;
  76. }
  77. return CWindowWnd::HandleMessage(uMsg, wParam, lParam);
  78. }
  79. LRESULT CGuadanWnd::MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, bool& bHandled)
  80. {
  81. if (uMsg == WM_KEYDOWN)
  82. {
  83. if (wParam == VK_RETURN)
  84. {
  85. return true;
  86. }
  87. else if (wParam == VK_ESCAPE)
  88. {
  89. Close(IDCANCEL);
  90. return true;
  91. }
  92. }
  93. return false;
  94. }
  95. LRESULT CGuadanWnd::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  96. {
  97. LONG styleValue = ::GetWindowLong(*this, GWL_STYLE);
  98. styleValue &= ~WS_CAPTION;
  99. ::SetWindowLong(*this, GWL_STYLE, styleValue | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
  100. // 把自己的窗口句柄与窗口绘制管理器挂接在一起
  101. m_pm.Init(m_hWnd);
  102. m_pm.AddPreMessageFilter(this);
  103. CDialogBuilder builder;
  104. CControlUI* pRoot = builder.Create(_T("guadan_wnd.xml"), (UINT)0, NULL, &m_pm);
  105. ASSERT(pRoot && "Failed to parse XML");
  106. // 把这些控件绘制到本窗口上
  107. m_pm.AttachDialog(pRoot);
  108. // 把自己加入到CPaintManagerUI的m_aNotifiers数组中,用于处理Notify函数
  109. m_pm.AddNotifier(this);
  110. Init();
  111. return 0;
  112. }
  113. void CGuadanWnd::Notify(TNotifyUI& msg)
  114. {
  115. if (msg.sType == _T("click"))
  116. {
  117. DuiLib::CDuiString senderName = msg.pSender->GetName();
  118. if (senderName == _T("closebtn"))
  119. {
  120. Close(IDCANCEL);
  121. return;
  122. }
  123. else if (senderName == _T("save"))
  124. {
  125. }
  126. else if (senderName == _T("guadan_order_delete"))
  127. {
  128. std::wstring ws_order_num = msg.pSender->GetCustomAttribute(L"order_num");
  129. int order_num = atoi(CLewaimaiString::UnicodeToUTF8(ws_order_num).c_str());
  130. //把这个删掉
  131. m_guadan_orders->erase(m_guadan_orders->begin() + order_num);
  132. RefreshOrder();
  133. if (m_nPageType == 0)
  134. {
  135. static_cast<CDiandanPageUI*>(m_pageUI)->RefreshGuadanNum();
  136. }
  137. else
  138. {
  139. static_cast<CSaomashouyinPageUI*>(m_pageUI)->RefreshGuadanNum();
  140. }
  141. }
  142. else if (senderName == _T("guadan_order_queren"))
  143. {
  144. std::wstring ws_order_num = msg.pSender->GetCustomAttribute(L"order_num");
  145. m_nQudanNum = atoi(CLewaimaiString::UnicodeToUTF8(ws_order_num).c_str());
  146. Close(IDOK);
  147. }
  148. }
  149. else if (msg.sType == _T("textchanged"))
  150. {
  151. }
  152. }
  153. void CGuadanWnd::Init()
  154. {
  155. RefreshOrder();
  156. }
  157. void CGuadanWnd::RefreshOrder()
  158. {
  159. //这个是用来展示所有订单的区域
  160. CVerticalLayoutUI* pOrderLayout = static_cast<CVerticalLayoutUI*>(m_pm.FindControl(_T("guadan_wnd_layout")));
  161. pOrderLayout->RemoveAll();
  162. int order_num = 0;
  163. for (std::vector<CDiandanOrder>::iterator it = m_guadan_orders->begin(); it != m_guadan_orders->end(); it++)
  164. {
  165. CDiandanOrder curOrder = *it;
  166. CDialogBuilder builder;
  167. //一个pEle就是一个订单的区域
  168. CHorizontalLayoutUI* pEle = static_cast<CHorizontalLayoutUI*>(builder.Create(_T("guadan_wnd_order_item.xml"), (UINT)0, NULL, &m_pm));
  169. pOrderLayout->Add(pEle);
  170. //这个是订单内部的展示商品的区域
  171. CVerticalLayoutUI* pFoodLayout = static_cast<CVerticalLayoutUI*>(pEle->FindSubControl(_T("guadan_foodlist_layout")));
  172. //C1:明细行高 36(与 guadan_wnd_food_item.xml 的 height 一致)
  173. pFoodLayout->SetFixedHeight(curOrder.getItemNum() * 36);
  174. //C1:44(头部) + 30(列名条) + N*36(明细) + 1(分隔) + 64(底部) = N*36 + 139,留 1px 余量
  175. pEle->SetFixedHeight(curOrder.getItemNum() * 36 + 140);
  176. for (int i = 0; i < curOrder.getItemNum(); i++)
  177. {
  178. CDiandanOrderItem curItem = curOrder.m_items[i];
  179. CDialogBuilder builder1;
  180. //这个是某一行商品
  181. CHorizontalLayoutUI* pFoodEle = static_cast<CHorizontalLayoutUI*>(builder1.Create(_T("guadan_wnd_food_item.xml"), (UINT)0, NULL, &m_pm));
  182. pFoodLayout->Add(pFoodEle);
  183. std::string nameShow = curItem.getNameShow();
  184. pFoodEle->FindSubControl(L"food_name")->SetText(CLewaimaiString::UTF8ToUnicode(nameShow).c_str());
  185. pFoodEle->FindSubControl(L"food_num")->SetText(CLewaimaiString::UTF8ToUnicode(curItem.num).c_str());
  186. pFoodEle->FindSubControl(L"food_price")->SetText(CLewaimaiString::UTF8ToUnicode(curItem.show_price).c_str());
  187. }
  188. CLabelUI* pPrice = static_cast<CLabelUI*>(pEle->FindSubControl(_T("guandan_order_zongjia")));
  189. //v98:金额用 16px 粗体 + 深绿并带「元」(mini-html,XML 需 showhtml="true")
  190. pPrice->SetText((L"商品总价:<f 116><c #2E9B5C>" + CLewaimaiString::UTF8ToUnicode(curOrder.getTotalPriceShow()) + L" 元</c>").c_str());
  191. pPrice->SetFont(pPrice->GetFont()); //清 mini-html 文本缓存
  192. CLabelUI* pNum = static_cast<CLabelUI*>(pEle->FindSubControl(_T("guadan_order_num")));
  193. pNum->SetText((L"#" + std::to_wstring(order_num + 1)).c_str());
  194. CLabelUI* pTime = static_cast<CLabelUI*>(pEle->FindSubControl(_T("guadan_order_time")));
  195. pTime->SetText(CLewaimaiString::UTF8ToUnicode(curOrder.m_guadan_time).c_str());
  196. //C1:头部右侧件数药丸
  197. CLabelUI* pCount = static_cast<CLabelUI*>(pEle->FindSubControl(_T("guadan_order_count")));
  198. if (pCount != NULL)
  199. {
  200. pCount->SetText((L"共" + std::to_wstring(curOrder.getTotalNum()) + L"件").c_str());
  201. }
  202. //给按钮加属性,点击的时候好判断并且处理
  203. CButtonUI* pDelete = static_cast<CButtonUI*>(pEle->FindSubControl(_T("guadan_order_delete")));
  204. pDelete->AddCustomAttribute(L"order_num", std::to_wstring(order_num).c_str());
  205. CButtonUI* pQueren = static_cast<CButtonUI*>(pEle->FindSubControl(_T("guadan_order_queren")));
  206. pQueren->AddCustomAttribute(L"order_num", std::to_wstring(order_num).c_str());
  207. order_num++;
  208. }
  209. }
  210. std::string CGuadanWnd::getContent()
  211. {
  212. return m_content;
  213. }
  214. void CGuadanWnd::SetTitle(std::wstring title)
  215. {
  216. CLabelUI* pLabel = static_cast<CLabelUI*>(m_pm.FindControl(_T("memo_dlg_title")));
  217. pLabel->SetText(title.c_str());
  218. }