[回到目錄]白話C++
4.4.Hello Internet
(配套光碟片中提供本節教程的動畫版)
本節我們將使用wxWidgets庫的網路功能,訪問www.d2school.com 提供的網路資源。過程是:在視窗的編輯框內輸入姓名,點擊既定按鈕,程式通過wxWidgets提供的組件,訪問“第二學堂”預設的網路連結,獲得一句來自互連網的問候語。
請將您的電腦連上網際網路。做一個小測試:開啟瀏覽器,在地址欄輸入以下內容:
http://www.d2school.com/hello.php?name=丁小明
斷行符號後,正確的情況是,您將在瀏覽器看到:
“Hello 丁小明! welcome to d2school……”。
4.4.1.建立項目
首先需要建立一個wxWidgets的架構,和4.1小節的常式相似,除了項目名稱改為“HelloInternet”之外,最大的不同在於“wxWidgets projects”項目嚮導中最後一步,我們需要選中三個附加庫模組:
圖 84 Hello Internet 需要wxNet模組
4.4.2.介面設計
完成嚮導後,Code::Blocks同樣會開啟預設產生的對話方塊設計頁面。檔案名稱為:“HelloInternetdialog.wxs”。我們將對預設的介面進行改造。
最終改造結果為:
圖 85 Hello Internet 最終設計效果
請讀者根據前面兩小節的內容,自行設計出該介面。以下是幾點提示。
第一、“關於”和“退出”按鈕,同樣分別來自“About”和“Quit”按鈕;
第二、“Welcome to wxWidgets”標籤的“Proportion”為1,而其左邊和右邊的兩個“BoxSizer” “Proportion”均為0。
第三、“Welcome to wxWidgets”標籤的字型(Font)屬性被修改了(“宋體”、字元集為“CHINESE_GB2312”、大小為“四號”)。控制項的長和寬,都故意被拉大一些。
第四、對話方塊的“Title”屬性為“Hello Internet”。
4.4.3.編寫代碼
雙
擊設計介面上的“問候”按鈕,Code::Blocks將自動為該按鈕產生其“OnClick”的事件函數;並且自動切換到代碼位
置:HelloInternetMain.cpp檔案的底部,不過,請先將位置移到該檔案的頂部,我們首先加入本次編寫代碼需要用到的標頭檔。
#include "HelloInternetMain.h"
#include <wx/msgdlg.h>
013 #include <wx/protocol/http.h>
014 #include <wx/mstream.h>
//(*InternalHeaders(HelloInternetDialog)
<wx/protocol/http.h> 用於引入wxHTTP控制項,該檔案可以方便地訪問一個http協議的網路資源。wxWidgets提供更為簡單的wxURL控制項,但和wxHTTP相比,它不支援對url中的漢字自動進行必要的編碼處理。
〖小提示〗:URL對漢字的轉碼
開啟瀏覽器,重複做一次本節開始提到的小測試。這一次,在輸入url並斷行符號之後,看一眼瀏覽器的地址欄,它的內容是:
http://www.d2school.com/hello.php?name=%B6%A1%D0%A1%C3%F7
後面的一串%字元,就是對漢字“丁小明”的一種轉碼。
為了更好的理解本節內容,建議讀者學習http協議的基礎知識。
從
第二學堂上述url所得到的回複,同樣含有漢字,並且採用的是非UNICODE編碼的“gb2312”字元集,必須將其轉換成UNICODE編碼,才有可
能顯示在“UNICODE版本的”wxWidgets的圖形介面之上,在轉換過程中,我們需要用到“wxMemoryOutputStream”,它來自
標頭檔:<wx/mstream.h> 。
請在剛才雙擊“問候”按鈕所產生的“OnButton3Click”函數之前,加入一個用於將gb2312轉換到UNICODE。
#117 wxString FromGB2312(wxStreamBuffer const * buf)
{
return wxString ((char const *)buf->GetBufferStart()
, wxCSConv(wxT("gb2312"))
, buf->GetBufferSize());
}
通過wxWidgets,可以非常方便地轉換gb2312字元集的字串至UNICODE編碼。代碼的具體含義,本章從略。
〖小提示〗:wxWidgets對漢字的支援
表面上看,wxString僅支援對“gb2312”的漢字(上述代碼,若將"gb2312"成"gbk",運行時將出現異常),但事實上本常式可以支援一些”gb2312”所不包含的偏僻漢字,比如“鎔、旻”等。
最後我們完成OnButton3Click的函數:
#124 void HelloInternetDialog::OnButton3Click(wxCommandEvent& event)
{
wxHTTP http;
//嘗試串連網站:
if (!http.Connect(_T("www.d2school.com")))
{
wxMessageBox(_T("串連不上第二學堂!"));
return;
}
//拼裝出URL:/hello.php?name=丁小明
wxString url = _T("/hello.php?name=");
url += this->TextCtrl1->GetValue();
//一個HTTP的“輸入資料流”,是指它的從網站返回的內容。
wxInputStream* in = http.GetInputStream(url);
if (!in)
{
wxMessageBox(_T("無法獲得指定網址的輸入資料流!"));
return;
}
//將該HTTP返回的內容讀入到一個“記憶體流”中
wxMemoryOutputStream mem;
in->Read(mem);
//讀完以後,輸入資料流就可以釋放了
delete in;
//將記憶體流中的內容,轉換為UNICODE編碼
wxString result = FromGB2312(mem.GetOutputStreamBuffer());
//顯示
StaticText1->SetLabel(result);
}
請儲存項目。然後編譯、運行程式,以下是運行結果:
圖 86 Hello Internet 運行結果
由於本項目仍然採用“靜態庫”,因此,如果您有興趣,同樣可以編譯一個Release版,然後“發布”到你的朋友的機器上跑跑看。
白話C++
[回到目錄]