Przeglądaj źródła

改完了页面切换,准备开始做资源文件打包进exe

张洋 4 lat temu
rodzic
commit
dcc993a689

+ 2 - 2
bin/Win32/Debug/zhipuzi_pos_windows/skin/baobiao_page.xml

@@ -29,8 +29,8 @@
 				</VerticalLayout>
 			</HorizontalLayout>
 
-			<HorizontalLayout name="data_layout" visible="false">
-				<VerticalLayout>
+			<HorizontalLayout>
+				<VerticalLayout name="data_layout" visible="false">
 					<Label text="营业概况" font="2" padding="20,20,0,0"></Label>
 					
 					<HorizontalLayout>					

+ 2 - 2
bin/Win32/Debug/zhipuzi_pos_windows/skin/setting_page.xml

@@ -26,7 +26,7 @@
 					<Control height="1" bkcolor="#FFD1D1D1"></Control>
 
 					<Control></Control>
-					<Button name="setting_logout" padding="20,30,20,0" height="69" text="退出登陆" textcolor="#FFFFFFFF" normalimage="file='Btn_Red.png' corner='5,5,5,5'" hotimage="file='Btn_Red_Hover.png' corner='5,5,5,5'" pushedimage="file='white_bkg.png'" />
+					<Button name="setting_logout" padding="20,30,20,0" height="52" text="退出登陆" textcolor="#FFFFFFFF" normalimage="file='Btn_Red.png' corner='5,5,5,5'" hotimage="file='Btn_Red_Hover.png' corner='5,5,5,5'" pushedimage="file='white_bkg.png'" />
 				</VerticalLayout>
 			</HorizontalLayout>
 
@@ -69,7 +69,7 @@
 
 				<VerticalLayout bkcolor="#FFFFFFFF" inset="15,15,15,15">
 					<Control height="300" />
-					<Label text="智铺子接单软件" align="center">
+					<Label text="智铺子收银系统" align="center">
 					</Label>
 					<Label name="setting_version" text="版本号:1.0.0.1" align="center">
 					</Label>

BIN
res/skin.zip


+ 6 - 0
zhipuzi_pos_windows/helper/define.h

@@ -31,3 +31,9 @@
 #define WM_CHENGZHONG_SUCCESS 10301
 #define WM_CHENGZHONG_FAIL 10302
 
+//报表相关的
+#define WM_BAOBIAO_REFRESH 10401
+
+//交班相关的
+#define WM_JIAOBAN_REFRESH 10501
+

+ 20 - 2
zhipuzi_pos_windows/page/CBaobiaoPageUI.cpp

@@ -82,6 +82,18 @@ void CBaobiaoPageUI::HandleTextCapture(std::string content)
 	}
 }
 
+bool CBaobiaoPageUI::HandleCustomMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+	if (uMsg == WM_BAOBIAO_REFRESH)
+	{
+		DoRefresh();
+
+		return true;
+	}
+
+	return false;
+}
+
 void CBaobiaoPageUI::ShowJintian()
 {
 	//先处理顶部按钮状态变化
@@ -241,7 +253,6 @@ void CBaobiaoPageUI::HandleRefresh()
 {
 	std::string url = "/analysis/index/statistics/index";
 
-
 	//请求外卖的未处理订单,直接用当前的page值去请求
 	std::map<string, string> params;
 	params["begin_time"] = m_init_time;
@@ -250,8 +261,15 @@ void CBaobiaoPageUI::HandleRefresh()
 
 	CZhipuziHttpClient::RequestNew(url.c_str(), params, response);
 
+	m_response = response;
+
+	::PostMessage(m_pManager->GetPaintWindow(), WM_BAOBIAO_REFRESH, 0, 0);
+}
+
+void CBaobiaoPageUI::DoRefresh()
+{
 	rapidjson::Document document;
-	document.Parse(response.c_str());
+	document.Parse(m_response.c_str());
 
 	if (document.HasParseError())
 	{

+ 3 - 5
zhipuzi_pos_windows/page/CBaobiaoPageUI.h

@@ -31,10 +31,7 @@ public:
 	void HandleTextCapture(std::string content);
 
 	//处理自定义消息,各个页面处理各个页面自己的(是自己处理的消息返回true,不是自己处理的消息返回false)
-	bool HandleCustomMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
-	{
-		return false;
-	}
+	bool HandleCustomMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
 
 	void ShowJintian();
 	void ShowZuotian();
@@ -43,6 +40,7 @@ public:
 
 	void Refresh();
 	void HandleRefresh();
+	void DoRefresh();
 
 private:
 	
@@ -58,5 +56,5 @@ private:
 	std::string m_init_time;
 	std::string m_end_time;
 
-
+	std::string m_response;
 };

+ 20 - 1
zhipuzi_pos_windows/page/CJiaobanPageUI.cpp

@@ -83,6 +83,18 @@ void CJiaobanPageUI::HandleTextCapture(std::string content)
 	}
 }
 
+bool CJiaobanPageUI::HandleCustomMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+	if (uMsg == WM_JIAOBAN_REFRESH)
+	{
+		DoRefresh();
+
+		return true;
+	}
+
+	return false;
+}
+
 void CJiaobanPageUI::InitJiaobanShijian()
 {
 	CContainerUI* pOrderListLayout = static_cast<CContainerUI*>(this->FindSubControl(_T("data_layout")));
@@ -189,8 +201,15 @@ void CJiaobanPageUI::HandleRefresh()
 
 	CZhipuziHttpClient::RequestNew(url.c_str(), params, response);
 
+	m_response = response;
+
+	::PostMessage(m_pManager->GetPaintWindow(), WM_JIAOBAN_REFRESH, 0, 0);
+}
+
+void CJiaobanPageUI::DoRefresh()
+{
 	rapidjson::Document document;
-	document.Parse(response.c_str());
+	document.Parse(m_response.c_str());
 
 	if (document.HasParseError())
 	{

+ 4 - 4
zhipuzi_pos_windows/page/CJiaobanPageUI.h

@@ -31,10 +31,7 @@ public:
 	void HandleTextCapture(std::string content);
 
 	//处理自定义消息,各个页面处理各个页面自己的(是自己处理的消息返回true,不是自己处理的消息返回false)
-	bool HandleCustomMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
-	{
-		return false;
-	}
+	bool HandleCustomMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
 
 	//初始化上班时间的展示
 	void InitJiaobanShijian();
@@ -42,6 +39,7 @@ public:
 
 	void Refresh();
 	void HandleRefresh();
+	void DoRefresh();
 
 	void StartJiaoban();
 
@@ -76,4 +74,6 @@ private:
 	std::string m_diannei_xianjin_zengzhang;
 
 	std::vector<std::string> m_shangban_times;
+
+	std::string m_response;
 };

+ 125 - 51
zhipuzi_pos_windows/wnd/CMainWnd.cpp

@@ -26,6 +26,9 @@ void CMainWnd::Init()
 	//启动消息推送
 	CMessagePushWorker::GetInstance()->Start();
 
+	//初始化所有页面,先创建页面对象,避免切换页面的时候被释放了
+	CreatePages();
+
 	//默认选择点单页面
 	m_curOptionName = L"main_diandan";
 	m_curOption = static_cast<CControlUI*>(m_pm.FindControl(_T("main_diandan")));
@@ -44,6 +47,12 @@ void CMainWnd::Init()
 	std::thread(&CMainWnd::UpdateFoodImage, this).detach();
 }
 
+void CMainWnd::End()
+{
+	//停止消息推送
+	CMessagePushWorker::GetInstance()->Stop();
+}
+
 void CMainWnd::UpdateFoodImage()
 {
 	//先判断并创建临时目录
@@ -129,66 +138,33 @@ void CMainWnd::SwitchPage(MainPageName name)
 
 	//先删除现在的子对象
 	CContainerUI* pMainContentLayout = static_cast<CContainerUI*>(m_pm.FindControl(_T("main_content_layout")));
-	pMainContentLayout->RemoveAll();
+	if (m_curPageName != NOPAGE)
+	{
+		//这个是之前已经有一个页面了,切换页面,不能销毁之前的页面,否则容易崩溃
+		pMainContentLayout->Remove(m_curPageUI, true);
+	}
 
-	//再创建一个对象
-	CDialogBuilder builder;
-	CDialogBuilderCallbackEx cb;
+	CBasePageUI* pChildContainer = m_pages[name];
 
-	CBasePageUI* pChildContainer = NULL;
+	pChildContainer->SetMainWnd(this);
+	pMainContentLayout->Add(pChildContainer);
 
-	//注意事项:所有的子页面中的option不能带有selected="true"属性,如果带有这个属性,在下面的Create调用的时候就直接会生成一个selectchanged事件,但是这个时候
-	//页面才刚刚Create,还没加入到窗口中,相关的变量对应关系也还没设置成功,会导致事件处理对象出现问题
-	if (name == DIANDAN)
-	{
-		pChildContainer = static_cast<CBasePageUI*>(builder.Create(_T("diandan_page.xml"), (UINT)0, &cb, &m_pm));		
-	}
-	else if (name == DINGDAN)
-	{
-		pChildContainer = static_cast<CBasePageUI*>(builder.Create(_T("waimaiorder_list_page.xml"), (UINT)0, &cb, &m_pm));
-	}
-	else if (name == SHEZHI)
-	{
-		pChildContainer = static_cast<CBasePageUI*>(builder.Create(_T("setting_page.xml"), (UINT)0, &cb, &m_pm));
-	}
-	else if (name == HUIYUAN)
-	{
-		pChildContainer = static_cast<CBasePageUI*>(builder.Create(_T("huiyuan_page.xml"), (UINT)0, &cb, &m_pm));
-	}
-	else if (name == WAIMAIINFO)
-	{
-		pChildContainer = static_cast<CBasePageUI*>(builder.Create(_T("waimaiorder_info_page.xml"), (UINT)0, &cb, &m_pm));
+	m_curPageName = name;
+	m_curPageUI = pChildContainer;
 
+	//对一些参数进行初始化
+	if (name == WAIMAIINFO)
+	{
 		CWaimaiOrderInfoPageUI* pInfoPage = static_cast<CWaimaiOrderInfoPageUI*>(pChildContainer);
 		pInfoPage->m_order_id = m_infopage_waimaiorder_id;
 		pInfoPage->m_order_no = m_infopage_waimaiorder_no;
 	}
-	else if (name == DIANNEIDINGDAN)
-	{
-		pChildContainer = static_cast<CBasePageUI*>(builder.Create(_T("dianneiorder_list_page.xml"), (UINT)0, &cb, &m_pm));
-	}
 	else if (name == DIANNEIINFO)
 	{
-		pChildContainer = static_cast<CBasePageUI*>(builder.Create(_T("dianneiorder_info_page.xml"), (UINT)0, &cb, &m_pm));
-
 		CDianneiOrderInfoPageUI* pInfoPage = static_cast<CDianneiOrderInfoPageUI*>(pChildContainer);
 		pInfoPage->m_order_id = m_infopage_dianneiorder_id;
 	}
-	else if (name == BAOBIAO)
-	{
-		pChildContainer = static_cast<CBasePageUI*>(builder.Create(_T("baobiao_page.xml"), (UINT)0, &cb, &m_pm));
-	}
-	else if (name == JIAOBAN)
-	{
-		pChildContainer = static_cast<CBasePageUI*>(builder.Create(_T("jiaoban_page.xml"), (UINT)0, &cb, &m_pm));
-	}
 
-	pChildContainer->SetMainWnd(this);
-	pMainContentLayout->Add(pChildContainer);
-
-	m_curPageName = name;
-	m_curPageUI = pChildContainer;
-	
 	pChildContainer->InitShow();
 }
 
@@ -340,8 +316,11 @@ void CMainWnd::HandleSelectChangeMsg(TNotifyUI& msg)
 	}
 	else
 	{
-		//除了主界面固定区域的事件,其他的事件全部分发给子页面
-		this->m_curPageUI->HandleSelectChangeMsg(msg);
+		if (this->m_curPageUI != NULL)
+		{
+			//除了主界面固定区域的事件,其他的事件全部分发给子页面
+			this->m_curPageUI->HandleSelectChangeMsg(msg);
+		}
 	}
 }
 
@@ -575,14 +554,21 @@ LRESULT CMainWnd::OnClose(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandle
     return 0;
 }
 
+void CMainWnd::OnFinalMessage(HWND /*hWnd*/)
+{
+	//执行一些销毁操作
+	this->End();
+
+	m_pm.RemovePreMessageFilter(this);
+
+	delete this;
+};
+
 /*
  *这个是窗口被销毁的时候调用的
  **/
 LRESULT CMainWnd::OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
 {
-	//停止消息推送
-	CMessagePushWorker::GetInstance()->Stop();
-
     bHandled = FALSE;
     return 0;
 }
@@ -1008,3 +994,91 @@ void CMainWnd::RegKeyboardRawInput()
 		printf("RegisterRawInputDevices failed");
 	}
 }
+
+void CMainWnd::CreatePages()
+{
+	m_pages.clear();
+
+	CBasePageUI* pChildContainer = NULL;
+
+	{
+		CDialogBuilder builder;
+		CDialogBuilderCallbackEx cb;
+		pChildContainer = static_cast<CBasePageUI*>(builder.Create(_T("diandan_page.xml"), (UINT)0, &cb, &m_pm));
+		m_pages[DIANDAN] = pChildContainer;
+	}
+
+	{
+		CDialogBuilder builder;
+		CDialogBuilderCallbackEx cb;
+		pChildContainer = static_cast<CBasePageUI*>(builder.Create(_T("waimaiorder_list_page.xml"), (UINT)0, &cb, &m_pm));
+		m_pages[DINGDAN] = pChildContainer;
+	}	
+
+	{
+		CDialogBuilder builder;
+		CDialogBuilderCallbackEx cb;
+		pChildContainer = static_cast<CBasePageUI*>(builder.Create(_T("setting_page.xml"), (UINT)0, &cb, &m_pm));
+		m_pages[SHEZHI] = pChildContainer;
+	}	
+
+	{
+		CDialogBuilder builder;
+		CDialogBuilderCallbackEx cb;
+		pChildContainer = static_cast<CBasePageUI*>(builder.Create(_T("huiyuan_page.xml"), (UINT)0, &cb, &m_pm));
+		m_pages[HUIYUAN] = pChildContainer;
+	}	
+
+	{
+		CDialogBuilder builder;
+		CDialogBuilderCallbackEx cb;
+		pChildContainer = static_cast<CBasePageUI*>(builder.Create(_T("waimaiorder_info_page.xml"), (UINT)0, &cb, &m_pm));
+		m_pages[WAIMAIINFO] = pChildContainer;
+	}	
+
+	{
+		CDialogBuilder builder;
+		CDialogBuilderCallbackEx cb;
+		pChildContainer = static_cast<CBasePageUI*>(builder.Create(_T("dianneiorder_list_page.xml"), (UINT)0, &cb, &m_pm));
+		m_pages[DIANNEIDINGDAN] = pChildContainer;
+	}	
+
+	{
+		CDialogBuilder builder;
+		CDialogBuilderCallbackEx cb;
+		pChildContainer = static_cast<CBasePageUI*>(builder.Create(_T("dianneiorder_info_page.xml"), (UINT)0, &cb, &m_pm));
+		m_pages[DIANNEIINFO] = pChildContainer;
+	}	
+
+	{
+		CDialogBuilder builder;
+		CDialogBuilderCallbackEx cb;
+		pChildContainer = static_cast<CBasePageUI*>(builder.Create(_T("baobiao_page.xml"), (UINT)0, &cb, &m_pm));
+		m_pages[BAOBIAO] = pChildContainer;
+	}	
+
+	{
+		CDialogBuilder builder;
+		CDialogBuilderCallbackEx cb;
+		pChildContainer = static_cast<CBasePageUI*>(builder.Create(_T("jiaoban_page.xml"), (UINT)0, &cb, &m_pm));
+		m_pages[JIAOBAN] = pChildContainer;
+	}	
+
+	//这里纯粹只是创建对象,不做任何初始化等处理
+}
+
+void CMainWnd::DestoryPages()
+{
+	//先把当前页面对象移出来,不销毁
+	CContainerUI* pMainContentLayout = static_cast<CContainerUI*>(m_pm.FindControl(_T("main_content_layout")));
+	if (m_curPageName != NOPAGE)
+	{
+		pMainContentLayout->Remove(m_curPageUI, true);
+	}
+
+	//销毁所有页面对象
+	for (std::map<int, CBasePageUI*>::iterator it = m_pages.begin(); it != m_pages.end(); it++)
+	{
+		delete it->second;
+	}
+}

+ 14 - 6
zhipuzi_pos_windows/wnd/CMainWnd.h

@@ -39,15 +39,13 @@ public:
         return CS_DBLCLKS;
     };
 
-    void OnFinalMessage(HWND /*hWnd*/)
-    {
-		m_pm.RemovePreMessageFilter(this);
-        delete this;
-    };
+	void OnFinalMessage(HWND /*hWnd*/);
 
+	//刚刚登录成功展现窗口的时候调用,做一些初始化
     void Init();
 
-	void UpdateFoodImage();
+	//退出登陆,或者直接关闭程序,窗口销毁的时候使用
+	void End();
 	
 	void SwitchPage(MainPageName name);
 
@@ -107,9 +105,17 @@ public:
 	//展示toast
 	void ShowToast(std::wstring toast_value);
 
+private:
+	void UpdateFoodImage();
+
 	//开启键盘输入监听
 	void RegKeyboardRawInput();
 
+	//创建所有将会用到的Page
+	void CreatePages();
+
+	void DestoryPages();
+
 public:
     CPaintManagerUI m_pm;
 
@@ -147,4 +153,6 @@ private:
 
 	//表示下一个抓取字符是否大写字母
 	bool m_is_next_daxie;
+
+	std::map<int, CBasePageUI*> m_pages;
 };

+ 6 - 0
zhipuzi_pos_windows/worker/CMessagePushWorker.cpp

@@ -26,6 +26,12 @@ void CMessagePushWorker::Stop()
 	m_is_work = false;
 
 	socket_.close();
+
+	//等到线程完全退出,程序才退出,否则会报错
+	while (m_nStopNum < 2)
+	{
+		Sleep(100);
+	}
 }
 
 void CMessagePushWorker::KeepAlive()