如何定制一款12306抢票浏览器――用户界面(一)

2014-11-24 08:18:49 · 作者: · 浏览: 4
界面如下
我观察了下12306的页面,它预留了5个乘客信息,所以我也就预留了5个乘客信息。因为我不会写HTML和java script,我就从12306中copy出相应的页面元素,并加以修改。在此感谢下12306 网页设计同学,帮我完成了不少我不会的东西。
一般来说,我们可能一次性不会购买5个人的票。所以在上面的界面中,你想填多少人信息就填多少人信息,我会在代码中读取这些人的信息。当我们填完乘客信息后,我们要输入车次信息。然后我们要点击一下确定,我会在代码中捕获点击确定的操作,并将已经填写的信息读入内存。在之后的抢票过程中,我们将使用到这些信息。最后,我们就要点击最下面那个超链接,跳转到12306这个页面,开始我们真正的抢票工作。
我们来看一下源代码。首先是界面的,我列一个人的信息代码出来:
[cpp]
第1位
因为我并不知道用户选择的车次有什么类型的座位,所以我将所有的座位都列了出来。
[cpp]
这儿要特别注意下所有option的value字段,这些值不是我乱取的。而是我检查了12306页面的很多火车信息后收集到的。我们会在之后记录用户所选席别时,记录这些值,因为这些值将在操作12306页面时派上用场。
其他元素应该没什么可以解释的,只是要注意所有Select下的Option的Value值和12306上对应的元素的Value值一致。
我们保存单个用户的结构体是
[cpp]
struct StSinglePassengerInfo{
ListCString ListSeat;
CString cstrTicket;
CString cstrName;
CString cstrCardtype;
CString cstrCardNo;
CString cstrMobileNo;
};
注意一下ListSeat这个字段,这个字段保存的一个CString的队列。它记录着一系列席别代码。在我最开始设计这个软件时,我是希望用户可以选择一系列可以接受的席别,同时是按优先级关系排列。这样可以最大程度上满足用户的需求。但是我已无心把这个功能继续做下去,所以设计界面时,只能让用户选择一个席别。
还有一个需要我们关注的是“确定”超链接的代码
[ html]
我们点击“确定”按钮后,页面理论上要跳转到“http://settingok”这个页面。而实际上,我们只是利用“跳转”这个操作,让我们的C++代码中捕获到用户已经设置OK了。我们并不希望页面真的发生跳转。所以我们对BeforeNavigate2消息映射函数做了处理,让跳转到“http://settingok”的请求终止,并读取用户设置的乘客信息和车次信息。
[cpp]
void CBrowserHost::BeforeNavigate2(IDispatch *pDisp, VARIANT *url,
VARIANT *Flags, VARIANT *TargetFrameName, VARIANT *PostData,
VARIANT *Headers, VARIANT_BOOL *Cancel)
{
do {
if ( NULL != url ) {
CString cstrUrl((LPWSTR)(url->bstrVal));
if ( 0 == cstrUrl.CompareNoCase(SETTINGOK) ) {
*Cancel = VARIANT_TRUE;
CComPtr spWeb;
HRESULT hr = pDisp->QueryInterface(IID_IWebBrowser2, (LPVOID*)&spWeb);
CHECKHRPOINTER(hr, spWeb);
CComPtr dispDoc;
hr = spWeb->get_Document(&dispDoc);
CHECKHRPOINTER(hr, dispDoc);
CComPtr spDoc;
hr = dispDoc->QueryInterface( IID_IHTMLDocument2, (LPVOID*)&spDoc);
CHECKHRPOINTER(hr, spDoc);
StTrainNoPassengerInfo stTrainPassenger;
hr = m_dealSettingPage.GetTrainNoPassengersInSettingPage(spDoc, stTrainPassenger);
hr = m_AutoMan.SetTrainNoPassengers(stTrainPassenger);
}
……
}
……
} while (0);
}
上面代码中m_dealSettingPage是我处理页面的类CDeal12306WebPage的对象。GetTrainNoPassengersInSettingPage将解析网页保存乘客和车次信息。m_AutoMan是我们之前说的“人”线程,此时我们将告诉该线程所有信息,让它准备开始工作。
[cpp]
HR