读书人

关于wxScrolledWindow自动滚动的有关问

发布时间: 2013-09-05 16:02:07 作者: rapoo

关于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__


drawablepanel.cpp

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




[解决办法]
帮你 D 我也关注

读书人网 >C++

热点推荐