关于wxScrolledWindow自动滚动的问题
我新建了一个类继承自wxScrolledWindow,主要是用来显示图片内容,并且添加了一些基本方法。现在的问题是,添加了图片以后,即使图片超过了这个窗口的ViewRect,滚动条无法自动出现,我尝试使用setSize等方法设置绘图区域的大小,但是依旧没出来,请问该如何才能实现这个功能?
代码如下:
drawablepanel.h
#ifndef __DRAWABLE_PANEL_H__
#define __DRAWABLE_PANEL_H__
#include <wx/scrolwin.h>
#include <wx/bitmap.h>
class DrawablePanel : public wxScrolledWindow
{
public:
DrawablePanel(wxWindow *parent, wxWindowID id = wxID_ANY,const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize);
~DrawablePanel();
void SetImage(wxBitmap& img);
void SetZoom(int zoom);
int GetZoom();
wxSize GetZoomSize() const;
void SetGridVisible(bool visible);
bool GetGridVisible();
void SetBorderSize(int size);
int GetBorderSize() const;
void SetRulersVisible(bool visible);
bool GetRulersVisible() const;
void SetRulersSpace(int space);
int GetRulersSpace() const;
void SetRulersSize(int size);
int GetRulersSize() const;
void RefreshNotify();
void Resize();
void SetDrawAlign(int align);
int GetDrawAlign() const;
protected:
void OnPaint(wxPaintEvent& event);
//重新计算当前的范围。根据内容和zoom的不同,可以出现\隐藏滚动条。
void RecomputationSize();
void RecomputationBorder();
int GetAbsolutelyBorder()const;
private:
wxBitmapimage;
wxBitmapbufferImage;
intzoomLevel ;
bool isGridVisible;
int borderSize;
int rulersSpace;
int rulersSize;
bool rulersVisible;
int rulersHigh;//
int drawAlign;
int absolutelyBorder;
DECLARE_EVENT_TABLE()
};
#endif //__DRAWABLE_PANEL_H__
#include "drawablepanel.h"
BEGIN_EVENT_TABLE(DrawablePanel,wxScrolledWindow)
EVT_PAINT(DrawablePanel::OnPaint)
END_EVENT_TABLE()
DrawablePanel::DrawablePanel(wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size) : wxScrolledWindow(parent, id, pos, size, wxSUNKEN_BORDER)
{
zoomLevel = 0;
isGridVisible = false;
borderSize= 0;
rulersSpace = 5
rulersSize = 10;//
rulersHigh = 20;
rulersVisible = true;
drawAlign = wxALIGN_LEFT;
absolutelyBorder = borderSize + rulersSize + rulersHigh;
}
DrawablePanel::~DrawablePanel()
{
}
void DrawablePanel::SetImage(wxBitmap& img)
{
image = img;
Resize();
RefreshNotify();
}
void DrawablePanel::SetGridVisible(bool visible)
{
if(isGridVisible != visible)
{
isGridVisible = visible;
RefreshNotify();
}
}
bool DrawablePanel::GetGridVisible()
{
return this->isGridVisible;
}
void DrawablePanel::SetZoom(int zoom)
{
int newZoom = zoomLevel + zoom;
if(zoomLevel != newZoom)
{
zoomLevel = newZoom;
Resize();
RefreshNotify();
}
}
int DrawablePanel::GetZoom()
{
return this->zoomLevel;
}
wxSize DrawablePanel::GetZoomSize() const
{
if(image.IsOk())
{
if(zoomLevel == 0)
return wxSize(image.GetWidth(),image.GetHeight());
else if(zoomLevel < 0)
return wxSize(image.GetWidth() / abs(zoomLevel),image.GetHeight() / abs(zoomLevel));
else
return wxSize(image.GetWidth() * zoomLevel,image.GetHeight() * zoomLevel);
} else
{
return wxSize(0,0);
}
}
void DrawablePanel::SetBorderSize(int size)
{
if(borderSize != size)
{
borderSize = size;
RecomputationBorder();
Resize();
RefreshNotify();
}
}
int DrawablePanel::GetBorderSize() const
{
return borderSize;
}
void DrawablePanel::SetRulersVisible(bool visible)
{
if(rulersVisible != visible)
{
rulersVisible = visible;
RefreshNotify();
}
}
bool DrawablePanel::GetRulersVisible() const
{
return rulersVisible;
}
void DrawablePanel::SetRulersSpace(int space)
{
if(rulersSpace != space)
{
rulersSize = space;
RecomputationBorder();
Resize();
RefreshNotify();
}
}
int DrawablePanel::GetRulersSpace() const
{
return rulersSpace;
}
void DrawablePanel::SetRulersSize(int size)
{
if(rulersSize != size)
{
rulersSize = size;
RecomputationBorder();
Resize();
RefreshNotify();
}
}
int DrawablePanel::GetRulersSize() const
{
return rulersSize;
}
void DrawablePanel::Resize()
{
RecomputationSize();
}
int DrawablePanel::GetAbsolutelyBorder()const
{
return absolutelyBorder;
}
void DrawablePanel::RecomputationBorder()
{
absolutelyBorder = borderSize + rulersSize + rulersHigh;
}
// 重新计算绘制区域的标准大小,相当于boxsizer中的resize。
void DrawablePanel::RecomputationSize()
{
if(image.IsOk())
{
wxSize zoomSize = GetZoomSize();
wxSize ss(zoomSize.GetWidth() + absolutelyBorder*2,zoomSize.GetHeight() + absolutelyBorder*2);
wxRect r(0,0,zoomSize.GetWidth() + absolutelyBorder*2,zoomSize.GetHeight() + absolutelyBorder*2);
SetSize(r);
//SetVirtualSize(ss);
GetParent()->Layout();
//wxString s = wxString::Format(wxT("%i"),r.GetWidth()) + wxT(",") + wxString::Format(wxT("%i"),r.GetHeight());
//wxMessageBox(s);
} else
{
SetSize(wxRect(0,0,absolutelyBorder*2,absolutelyBorder*2),wxSIZE_AUTO);
}
}
void DrawablePanel::SetDrawAlign(int anchor)
{
if(drawAlign & anchor)
return;
drawAlign = anchor;
RefreshNotify();
}
int DrawablePanel::GetDrawAlign() const
{
return drawAlign;
}
void DrawablePanel::OnPaint(wxPaintEvent& event)
{
wxPaintDC dc(this);
dc.DrawBitmap(image,0,0,true);
}
void DrawablePanel::RefreshNotify()
{
Refresh(true);
Update();
}