wxWidgets自定义标题栏

做界面开发,很重要的就是一个用户体验,然而用户体验更多归结于界面舒适度。所以有了这篇内容。。。。为了界面的美化,自定义标题栏。

第一种方法

利用wxWidgets中自带的鼠标事件(QMouseEvent)

#pragma once

#include <wx/artprov.h>
#include <wx/xrc/xmlres.h>
#include <wx/panel.h>
#include <wx/gdicmn.h>
#include <wx/font.h>
#include <wx/colour.h>
#include <wx/settings.h>
#include <wx/string.h>
#include <wx/sizer.h>
#include <wx/dialog.h>

///


///
/// Class MyDialog
///
class MyDialog : public wxDialog
{
	private:
        wxPoint m_point;
	protected:
		wxPanel* m_panel;

	public:

		MyDialog( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 402,288 ), long style = 0 );
		~MyDialog();
        void OnLeftDown(wxMouseEvent &event);
        void OnMove(wxMouseEvent &event);
};
MyDialog::MyDialog( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
{
	this->SetSizeHints( wxDefaultSize, wxDefaultSize );

	wxBoxSizer* bSizer1;
	bSizer1 = new wxBoxSizer( wxVERTICAL );

	m_panel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxSize( -1,30 ), wxTAB_TRAVERSAL );
	bSizer1->Add( m_panel, 0, wxALL|wxEXPAND, 5 );


	this->SetSizer( bSizer1 );
	this->Layout();

	this->Centre( wxBOTH );
    panel->Bind(wxEVT_LEFT_DOWN,MyDialog::OnLeftDown,this);
    panel->Bind(wxEVT_MOTION,MyDialog::OnMove,this);
}

MyDialog::~MyDialog()
{
    panel->Unbind(wxEVT_LEFT_DOWN,MyDialog::OnLeftDown,this);
    panel->Unbind(wxEVT_MOTION,MyDialog::OnMove,this);
}

void MyDialog::OnLeftDown(wxMouseEvent &event)
{
    m_point = event.GetPosition();
}

void MyDialog::OnMove(wxMouseEvent &event)
{
    if (event.LeftIsDown())
	{
		int x = m_point.x - event.GetPosition().x;
		if (x < 0)
			x = x - 2;
		else if (x > 0)
			x = x + 2;

		int y = m_point.y - event.GetPosition().y;
		if (y < 0)
			y = y - 2;
		else if (y > 0)
			y = y + 2;
		this->Move(this->GetScreenPosition() + wxPoint(-x,-y));
}

这种方法:实际效果会发生窗口抖动。

第二种方法:

#pragma once

#include <wx/artprov.h>
#include <wx/xrc/xmlres.h>
#include <wx/panel.h>
#include <wx/gdicmn.h>
#include <wx/font.h>
#include <wx/colour.h>
#include <wx/settings.h>
#include <wx/string.h>
#include <wx/sizer.h>
#include <wx/dialog.h>

///


///
/// Class MyDialog
///
class MyDialog : public wxDialog
{
	protected:
		wxPanel* m_panel;

	public:

		MyDialog( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 402,288 ), long style = 0 );
		~MyDialog();
        
        void OnMove(wxMouseEvent &event);
};
MyDialog::MyDialog( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
{
	this->SetSizeHints( wxDefaultSize, wxDefaultSize );

	wxBoxSizer* bSizer1;
	bSizer1 = new wxBoxSizer( wxVERTICAL );

	m_panel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxSize( -1,30 ), wxTAB_TRAVERSAL );
	bSizer1->Add( m_panel, 0, wxALL|wxEXPAND, 5 );


	this->SetSizer( bSizer1 );
	this->Layout();

	this->Centre( wxBOTH );
    
    panel->Bind(wxEVT_MOTION,MyDialog::OnMove,this);
}

MyDialog::~MyDialog()
{
    panel->Unbind(wxEVT_MOTION,MyDialog::OnMove,this);
}

void MyDialog::OnMove(wxMouseEvent &event)
{
    if (event.LeftIsDown())
	{
		if (ReleaseCapture())
			SendMessage(GetHwnd(), WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
    }
}

这种方法采用wxWidgets自带鼠标移动事件结合win32API接口发送系统菜单消息关于移动窗口的命令给系统。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值