第4章 感受(二)——4.4. Hello Internet

來源:互聯網
上載者:User
[回到目錄]白話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> 。

  • 函數:FromGB2312

請在剛才雙擊“問候”按鈕所產生的“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

最後我們完成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++

[回到目錄]
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.