#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()
{
}