wxwidgets显示不规则Frame

来源:互联网 发布:软件license未授权 编辑:程序博客网 时间:2024/05/20 18:17

#include "wx/wx.h"

//定义Frame类 

class ShapedFrame: public wxFrame
{
    public:
        ShapedFrame();
        ~ShapedFrame();
    private:
        wxBitmap m_bmp;
        bool m_hasShape;
        wxPoint m_delta;

        void OnMouseMove(wxMouseEvent& event);
        void OnPaint(wxPaintEvent& event);
        void OnMouseLeftDown(wxMouseEvent& event);
        void OnMouseLeftUp(wxMouseEvent& event);

        void SetWindowShape();
#ifdef __WXGTK__
        void OnWindowCreate(wxWindowCreateEvent& event);
#endif
        DECLARE_EVENT_TABLE()
};

 //建立事件处理连接。鼠标移动事件由OnMouseMove捕获,重绘事件由OnPaint捕获,鼠标左键按下事件由OnMouseLeftDown捕获~

BEGIN_EVENT_TABLE(ShapedFrame, wxFrame)
    EVT_MOTION(ShapedFrame::OnMouseMove)
    EVT_PAINT(ShapedFrame::OnPaint)
    EVT_LEFT_DOWN(ShapedFrame::OnMouseLeftDown)
    EVT_LEFT_UP(ShapedFrame::OnMouseLeftUp)
#ifdef __WXGTK__
    EVT_WINDOW_CREATE(ShapedFrame::OnWindowCreate)
#endif
END_EVENT_TABLE()

 

//分别实现类中函数

ShapedFrame::ShapedFrame()
    : wxFrame((wxFrame*)NULL, wxID_ANY, wxEmptyString,wxDefaultPosition,wxSize(250,300),\
              wxFRAME_SHAPED | wxSIMPLE_BORDER | wxFRAME_NO_TASKBAR | wxSTAY_ON_TOP)
{
    wxImage::AddHandler(new wxPNGHandler);
    m_hasShape = false;
    m_bmp.LoadFile(wxT("penguin.png"),wxBITMAP_TYPE_PNG);
    if(!m_bmp.Ok()){
        wxMessageBox(wxT("sorry, could not load file."));
    }
    SetSize(wxSize(m_bmp.GetWidth(),m_bmp.GetHeight()));

    SetWindowShape();
}

#ifdef __WXGTK__
void ShapedFrame::OnWindowCreate(wxWindowCreateEvent& event){
    SetWindowShape();
}
#endif

void ShapedFrame::SetWindowShape(){
    wxRegion region(m_bmp,*wxWHITE);
    m_hasShape = SetShape(region);
}

void ShapedFrame::OnMouseMove(wxMouseEvent& event){
    wxPoint pt = event.GetPosition();

    if(event.Dragging() && event.LeftIsDown()){
        wxPoint pos = ClientToScreen(pt);//pos为点击位置

        Move(wxPoint(pos.x-m_delta.x,pos.y-m_delta.y));
    }
}

void ShapedFrame::OnMouseLeftDown(wxMouseEvent& event){
    CaptureMouse();
    wxPoint pt = ClientToScreen(event.GetPosition());
    wxPoint origin = GetPosition();
    int dx = pt.x-origin.x;
    int dy = pt.y-origin.y;
    m_delta = wxPoint(dx,dy);
}

void ShapedFrame::OnMouseLeftUp(wxMouseEvent& event){
    if(HasCapture()){
        ReleaseMouse();
    }
}

void ShapedFrame::OnPaint(wxPaintEvent& event){
    wxPaintDC dc(this);
    dc.DrawBitmap(m_bmp,0,0,true);
}

ShapedFrame::~ShapedFrame()
{
}

 

原创粉丝点击