[wxWidgets]_[初级]_[简单应用看wx的核心原理]



1.wx的核心原理和MFC差不多,其中的一部分是menu,event,thread,dc,control.

2.以下是使用和wx这些功能的例子,在MinGW(g++),msys(make)下编译.g++ 4.4,我用的eclipse CDT建的工程,单是编译的话直接用make就行了,不需要eclipse.

3.用的wxWidgets-2.9.2,核心的dll只需要3个,由于是编译了基本上全部功能和控件,所以这些库还是比较大的,不过有很大的压缩余地。也和gcc编译有关。

wxbase292u_gcc_custom.dll (6,461 kb)
wxmsw292u_adv_gcc_custom.dll (5,498 kb)
wxmsw292u_core_gcc_custom.dll (12,237 kb)

4.应用程序入口文件:

my_app.h

/*
 * my_app.h
 *
 *  Created on: 2013-5-30
 *  Author: Sai
 */

#ifndef MY_APP_H_
#define MY_APP_H_

#include "wx/wx.h"

class MyApp: public wxApp
{
public:
	MyApp();
	virtual ~MyApp();

	bool OnInit();
};

#endif /* MY_APP_H_ */

my_app.cpp

/*
 * my_app.cpp
 *
 *  Created on: 2013-5-30
 *  Author: Sai
 */

#include "my_app.h"
#include "my_frame.h"

IMPLEMENT_APP(MyApp)

MyApp::MyApp()
{

}

MyApp::~MyApp()
{

}

bool MyApp::OnInit()
{
	MyFrame* frame = new MyFrame();
	frame->Create(wxID_ANY,wxT("infoworld"));

	SetTopWindow(frame);
	frame->Show(true);
	return true;
}


5.主窗口文件

my_frame.h

/*
 * my_frame.h
 *
 *  Created on: 2013-5-30
 *  Author: Sai
 */

#ifndef MY_FRAME_H_
#define MY_FRAME_H_

#include "wx/wx.h"

/**
 * Show Example
 *
 * 1.menu
 * 2.event
 * 3.thread
 * 4.dc
 * 5.control
 */
class MyFrame : public wxFrame
{
	DECLARE_EVENT_TABLE()
	DECLARE_DYNAMIC_CLASS(MyFrame)
public:
	MyFrame();
	virtual ~MyFrame();
	virtual bool Create(wxWindowID id, const wxString& title);

protected:
	void OnQuit(wxCommandEvent& event);
	void OnThread(wxCommandEvent& event);
	void OnThreadUpdate(wxThreadEvent& event);
	void OnPaintPanel(wxPaintEvent& event);
private:
	wxGauge* gauge_;
	wxPanel *panel_;
};

#endif /* MY_FRAME_H_ */

my_frame.cpp

/*
 * my_frame.cpp
 *
 *  Created on: 2013-5-30
 *  Author: Sai
 */

#include "my_frame.h"

namespace
{
enum
{
	kGauge = 1, kButton, kThreadUpdateId
};
}

class MyThread: public wxThread
{
public:
	MyThread(MyFrame *handler) :
			wxThread(wxTHREAD_DETACHED)
	{
		m_pHandler = handler;
	}
	~MyThread()
	{
	}
	void Execute()
	{
		Create();
		Run();
	}

protected:
	virtual ExitCode Entry()
	{
		for (int i = 1; i < 11; ++i)
		{
			//1.asynchronous update,communicate with main thread.
			wxThreadEvent* event = new wxThreadEvent(wxEVT_THREAD,
					kThreadUpdateId);
			event->SetInt(i * 10);
			wxQueueEvent(m_pHandler->GetEventHandler(), event);
		}
		return (wxThread::ExitCode) 0;
	}
	MyFrame *m_pHandler;
};
BEGIN_EVENT_TABLE(MyFrame, wxFrame) EVT_MENU(wxID_EXIT, MyFrame::OnQuit)
EVT_BUTTON(kButton, MyFrame::OnThread)
EVT_THREAD(kThreadUpdateId, MyFrame::OnThreadUpdate)
END_EVENT_TABLE()

IMPLEMENT_DYNAMIC_CLASS(MyFrame, wxFrame)

MyFrame::MyFrame()
{

}

MyFrame::~MyFrame()
{

}

bool MyFrame::Create(wxWindowID id, const wxString& title)
{
	if (!wxFrame::Create(NULL, id, title, wxDefaultPosition, wxSize(400, 400)))
	{
		return false;
	}
	panel_ = new wxPanel(this, wxID_ANY, wxPoint(0, 0));
	panel_->SetBackgroundColour(*wxBLUE);
	panel_->Connect(wxEVT_PAINT, wxPaintEventHandler(MyFrame::OnPaintPanel),
			NULL, this);

	//1.menubar and statusbar
	wxMenu *fileMenu = new wxMenu();

	(*fileMenu).Append(wxID_EXIT, wxT("&Exit\tAlt-X"),
			wxT("Quit this program"));

	wxMenuBar *bar = new wxMenuBar();
	bar->Append(fileMenu, wxT("&File"));

	SetMenuBar(bar);
	CreateStatusBar();
	SetStatusText(wxT("welcome to WxWidget"));

	//2.button,
	wxButton* button = new wxButton(panel_, kButton, wxT("wxThread"),
			wxPoint(20, 20));
	gauge_ = new wxGauge(panel_, kGauge, 100, wxPoint(20, 60), wxSize(200, 40),
			wxGA_HORIZONTAL);
	gauge_->SetValue(0);

	return true;
}

void MyFrame::OnPaintPanel(wxPaintEvent& event)
{
	wxPaintDC dc(panel_);
	dc.SetPen(wxPen(*wxRED));
	wxSize size = panel_->GetSize();
	dc.DrawRectangle(wxRect(20, 20, size.x - 40, size.y - 40));
}

void MyFrame::OnThreadUpdate(wxThreadEvent& event)
{
	gauge_->SetValue(event.GetInt());
}

void MyFrame::OnThread(wxCommandEvent& event)
{
	wxMessageBox(wxT("Start a wxThread"), wxT("Good evening."));
	MyThread* thread = new MyThread(this);
	thread->Execute();
}

void MyFrame::OnQuit(wxCommandEvent& event)
{
	Close();
}


6.值的一提的是如果要用vista以上的好看的控件样式,需要资源文件定义,再把它链接到exe里。

windres --input-format=rc -O coff -i resources/style.rc -o build/style.o --define __WXMSW__ --include-dir E:/software/Lib/gui/wxWidgets-2.9.2/include

style.rc

#include "winresrc.h"

// set this to 1 if you don't want to use manifest resource (manifest resource
// is needed to enable visual styles on Windows XP - see docs/msw/winxp.txt
// for more information)
#define wxUSE_NO_MANIFEST 0

// this is not always needed but doesn't hurt (except making the executable
// very slightly larger): this file contains the standard icons, cursors, ...
#include "wx/msw/wx.rc"

LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US

//wx.rc contain .manifest,so override it.
1 RT_MANIFEST "uac.manifest"

uac.manifest

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity version="0.64.1.0" processorArchitecture="x86" name="Controls" type="win32"></assemblyIdentity>
<description></description>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> 
		<security> 
			<requestedPrivileges> 
				<requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel> 
			</requestedPrivileges> 
		</security> 
</trustInfo>
<dependency>
    <dependentAssembly>
        <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="X86" publicKeyToken="6595b64144ccf1df" language="*"></assemblyIdentity>
    </dependentAssembly>
</dependency>
</assembly>

完整程序下载地址:

http://download.csdn.net/download/infoworld/5487427


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Peter(阿斯拉达)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值