[wxWidgets]二、配置運行環境和第一個自己的程序

打開vs2017,新建一個空項目

1、在vc++目錄->包含目錄添加(也可以用相對地址)

D:\wxWidgetsTest\wxWidgets-3.1.3\wxWidgets-3.1.3\include

D:\wxWidgetsTest\wxWidgets-3.1.3\wxWidgets-3.1.3\lib\vc_lib\mswud

 

2、在鏈接器-》常規-》附加庫目錄添加

D:\wxWidgetsTest\wxWidgets-3.1.3\wxWidgets-3.1.3\lib\vc_li

 

3、在鏈接器-》輸入-》附加依賴項添加

wxbase31ud_net.lib

wxmsw31ud_html.lib

wxbase31ud_xml.lib

wxmsw31ud_adv.lib

wxmsw31ud_aui.lib

wxmsw31ud_gl.lib

wxmsw31ud_media.lib

wxmsw31ud_propgrid.lib

wxmsw31ud_qa.lib

wxmsw31ud_ribbon.lib

wxmsw31ud_richtext.lib

wxmsw31ud_stc.lib

wxmsw31ud_xrc.lib

wxscintillad.lib

wxmsw31ud_core.lib

wxbase31ud.lib

wxtiffd.lib

wxjpegd.lib

wxpngd.lib

wxzlibd.lib

wxexpatd.lib

winmm.lib

comctl32.lib

rpcrt4.lib

wsock32.lib

odbc32.lib

 

4、由於我們生成一個控制檯空程序的時候,默認入口是main(),但是wx把main進行了分裝,所以會提示找不到的錯誤。

error LNK2019: 無法解析的外部符號 _main該符號在函數

解決:在鏈接器-系統-子系統下控制檯改爲窗口。

5、新建一個main.cpp輸入以下的內容,運行

	#include <wx/wx.h>
	class Simple : public wxFrame//繼承自wxframe
	{
	public:
		Simple(const wxString& title);//4進入構造函數
	};
	
	Simple::Simple(const wxString& title)
		: wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(250, 150))
	{
		Centre();
	}
	
	class MyApp : public wxApp//2進入這裏,再次只需要實現oninit就可以
	{
	public:
		virtual bool OnInit();
	};
	
	IMPLEMENT_APP(MyApp)//調用wxIMPLEMENT_WXWIN_MAIN,程序入口
	
	bool MyApp::OnInit()//3
	{
		Simple *simple = new Simple(wxT("Simple"));//創建窗口
		simple->Show(true);//顯示窗口
		return true;
}

6、以上就是運行的窗口,什麼都沒有,但是已經是一個框架了。

7程序解釋:    

1、程序由IMPLEMENT_APP(MyApp)進入

2、然後進入MyApp類的構造函數,這裏是默認的構造,所以接着進入父類wxApp的構造函數

3、在wxApp的構造函數裏面多態調用OnInit()方法,這裏運行“

        Simple *simple = new Simple(wxT("Simple"));實例化窗口類

4、Simple 的構造函數調用Centre(),對對話框進行居中,其他的沒有做,正常情況下可以在這裏設置菜單、工具欄等操作。

5、返回調用 simple->Show(true);//顯示窗口

6、ok,也可以將這個分拆成.h.cpp等文件,記得添加頭文件#include <wx/wx.h>

 

7、將Simple 的構造函數修改如下,添加菜單

Simple::Simple(const wxString& title)
    : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(250, 150))
{
    wxMenuBar *mbar = new wxMenuBar;
    wxMenu *menu = new wxMenu();
    wxMenuItem *mitem1 = new wxMenuItem(nullptr, wxID_ANY,"open");
    wxMenuItem *mitem2 = new wxMenuItem(nullptr, wxID_ANY, "close");
    menu->Append(mitem1);
    menu->Append(mitem2);
    mbar->Append(menu, "file");
    SetMenuBar(mbar);
    Centre();
}

 

8、添加一個按鈕和一個顯示控件,就在    SetMenuBar(mbar);和    Centre();之間

    wxButton *btn = new wxButton(this, wxID_ANY, "button",wxPoint(0,0),wxSize(50,20));
    wxTextCtrl *tcl = new wxTextCtrl(this, wxID_ANY, "",wxPoint(100, 0), wxSize(50, 20));

9、點擊一下按鈕,顯示控件顯示helloworld。

將上面的wxTextCtrl *tcl修改一下,定義成成員變量。

定義一個響應函數,修改Simple類如下

class Simple : public wxFrame//繼承自wxframe
{
public:
    wxTextCtrl *tcl;//成員變量
    void hello(wxCommandEvent &e);//響應函數
    Simple(const wxString& title);//4進入構造函數
};

定義hello函數

void Simple::hello(wxCommandEvent &e) {
    tcl->SetValue("Hello World!");
}

在8的兩行代碼之後添加消息綁定函數    Bind(wxEVT_BUTTON, &Simple::hello,this);

運行結果。

如果提示有tcl或者hello沒有定義,是因爲編譯順序,可以將將代碼分成h和cpp兩個文件,也可以改變一下書寫順序。

發佈了36 篇原創文章 · 獲贊 16 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章