做界面开发,很重要的就是一个用户体验,然而用户体验更多归结于界面舒适度。所以有了这篇内容。。。。为了界面的美化,自定义标题栏。
第一种方法
利用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接口发送系统菜单消息关于移动窗口的命令给系统。