slider95.cpp
来自「A*算法 A*算法 A*算法 A*算法A*算法A*算法」· C++ 代码 · 共 693 行 · 第 1/2 页
CPP
693 行
scrollEvent = wxEVT_SCROLL_CHANGED;
}
break;
case SB_ENDSCROLL:
scrollEvent = wxEVT_SCROLL_CHANGED;
break;
default:
// unknown scroll event?
return false;
}
int newPos = ValueInvertOrNot((int) ::SendMessage((HWND) control, TBM_GETPOS, 0, 0));
if ( (newPos < GetMin()) || (newPos > GetMax()) )
{
// out of range - but we did process it
return true;
}
SetValue(newPos);
wxScrollEvent event(scrollEvent, m_windowId);
event.SetPosition(newPos);
event.SetEventObject( this );
GetEventHandler()->ProcessEvent(event);
wxCommandEvent cevent( wxEVT_COMMAND_SLIDER_UPDATED, GetId() );
cevent.SetInt( newPos );
cevent.SetEventObject( this );
return GetEventHandler()->ProcessEvent( cevent );
}
void wxSlider::Command (wxCommandEvent & event)
{
SetValue (event.GetInt());
ProcessCommand (event);
}
// ----------------------------------------------------------------------------
// geometry stuff
// ----------------------------------------------------------------------------
wxRect wxSlider::GetBoundingBox() const
{
// take care not to call our own functions which would call us recursively
int x, y, w, h;
wxSliderBase::DoGetPosition(&x, &y);
wxSliderBase::DoGetSize(&w, &h);
wxRect rect(x, y, w, h);
if ( m_labels )
{
wxRect lrect = m_labels->GetBoundingBox();
GetParent()->ScreenToClient(&lrect.x, &lrect.y);
rect.Union(lrect);
}
return rect;
}
void wxSlider::DoGetSize(int *width, int *height) const
{
wxRect rect = GetBoundingBox();
if ( width )
*width = rect.width;
if ( height )
*height = rect.height;
}
void wxSlider::DoGetPosition(int *x, int *y) const
{
wxRect rect = GetBoundingBox();
if ( x )
*x = rect.x;
if ( y )
*y = rect.y;
}
int wxSlider::GetLabelsSize(int *width) const
{
int cy;
if ( width )
{
// find the max label width
int wLabelMin, wLabelMax;
GetTextExtent(Format(m_rangeMin), &wLabelMin, &cy);
GetTextExtent(Format(m_rangeMax), &wLabelMax, &cy);
*width = wxMax(wLabelMin, wLabelMax);
}
else
{
cy = GetCharHeight();
}
return EDIT_HEIGHT_FROM_CHAR_HEIGHT(cy);
}
void wxSlider::DoMoveWindow(int x, int y, int width, int height)
{
// all complications below are because we need to position the labels,
// without them everything is easy
if ( !m_labels )
{
wxSliderBase::DoMoveWindow(x, y, width, height);
return;
}
// be careful to position the slider itself after moving the labels as
// otherwise our GetBoundingBox(), which is called from WM_SIZE handler,
// would return a wrong result and wrong size would be cached internally
if ( HasFlag(wxSL_VERTICAL) )
{
int wLabel;
int hLabel = GetLabelsSize(&wLabel);
int xLabel = HasFlag(wxSL_LEFT) ? x + width - wLabel : x;
// position all labels: min at the top, value in the middle and max at
// the bottom
DoMoveSibling((HWND)(*m_labels)[SliderLabel_Min],
xLabel, y, wLabel, hLabel);
DoMoveSibling((HWND)(*m_labels)[SliderLabel_Value],
xLabel, y + (height - hLabel)/2, wLabel, hLabel);
DoMoveSibling((HWND)(*m_labels)[SliderLabel_Max],
xLabel, y + height - hLabel, wLabel, hLabel);
// position the slider itself along the left/right edge
wxSliderBase::DoMoveWindow(HasFlag(wxSL_LEFT) ? x : x + wLabel + HGAP,
y + hLabel/2,
width - wLabel - HGAP,
height - hLabel);
}
else // horizontal
{
int wLabel;
int hLabel = GetLabelsSize(&wLabel);
int yLabel = HasFlag(wxSL_TOP) ? y + height - hLabel : y;
// position all labels: min on the left, value in the middle and max to
// the right
DoMoveSibling((HWND)(*m_labels)[SliderLabel_Min],
x, yLabel, wLabel, hLabel);
DoMoveSibling((HWND)(*m_labels)[SliderLabel_Value],
x + (width - wLabel)/2, yLabel, wLabel, hLabel);
DoMoveSibling((HWND)(*m_labels)[SliderLabel_Max],
x + width - wLabel, yLabel, wLabel, hLabel);
// position the slider itself along the top/bottom edge
wxSliderBase::DoMoveWindow(x,
HasFlag(wxSL_TOP) ? y : y + hLabel,
width,
height - hLabel);
}
}
wxSize wxSlider::DoGetBestSize() const
{
// these values are arbitrary
static const int length = 100;
static const int thumb = 24;
static const int ticks = 8;
int *width;
wxSize size;
if ( HasFlag(wxSL_VERTICAL) )
{
size.x = thumb;
size.y = length;
width = &size.x;
if ( m_labels )
{
int wLabel;
int hLabel = GetLabelsSize(&wLabel);
// account for the labels
size.x += HGAP + wLabel;
// labels are indented relative to the slider itself
size.y += hLabel;
}
}
else // horizontal
{
size.x = length;
size.y = thumb;
width = &size.y;
if ( m_labels )
{
// labels add extra height
size.y += GetLabelsSize();
}
}
// need extra space to show ticks
if ( HasFlag(wxSL_TICKS) )
{
*width += ticks;
// and maybe twice as much if we show them on both sides
if ( HasFlag(wxSL_BOTH) )
*width += ticks;
}
return size;
}
// ----------------------------------------------------------------------------
// slider-specific methods
// ----------------------------------------------------------------------------
int wxSlider::GetValue() const
{
return ValueInvertOrNot(::SendMessage(GetHwnd(), TBM_GETPOS, 0, 0));
}
void wxSlider::SetValue(int value)
{
::SendMessage(GetHwnd(), TBM_SETPOS, (WPARAM)TRUE, (LPARAM)ValueInvertOrNot(value));
if ( m_labels )
{
::SetWindowText((*m_labels)[SliderLabel_Value], Format(value));
}
}
void wxSlider::SetRange(int minValue, int maxValue)
{
m_rangeMin = minValue;
m_rangeMax = maxValue;
::SendMessage(GetHwnd(), TBM_SETRANGEMIN, TRUE, m_rangeMin);
::SendMessage(GetHwnd(), TBM_SETRANGEMAX, TRUE, m_rangeMax);
if ( m_labels )
{
::SetWindowText((*m_labels)[SliderLabel_Min], Format(ValueInvertOrNot(m_rangeMin)));
::SetWindowText((*m_labels)[SliderLabel_Max], Format(ValueInvertOrNot(m_rangeMax)));
}
}
void wxSlider::SetTickFreq(int n, int pos)
{
m_tickFreq = n;
::SendMessage( GetHwnd(), TBM_SETTICFREQ, (WPARAM) n, (LPARAM) pos );
}
void wxSlider::SetPageSize(int pageSize)
{
::SendMessage( GetHwnd(), TBM_SETPAGESIZE, (WPARAM) 0, (LPARAM) pageSize );
m_pageSize = pageSize;
}
int wxSlider::GetPageSize() const
{
return m_pageSize;
}
void wxSlider::ClearSel()
{
::SendMessage(GetHwnd(), TBM_CLEARSEL, (WPARAM) TRUE, (LPARAM) 0);
}
void wxSlider::ClearTicks()
{
::SendMessage(GetHwnd(), TBM_CLEARTICS, (WPARAM) TRUE, (LPARAM) 0);
}
void wxSlider::SetLineSize(int lineSize)
{
m_lineSize = lineSize;
::SendMessage(GetHwnd(), TBM_SETLINESIZE, (WPARAM) 0, (LPARAM) lineSize);
}
int wxSlider::GetLineSize() const
{
return (int)::SendMessage(GetHwnd(), TBM_GETLINESIZE, 0, 0);
}
int wxSlider::GetSelEnd() const
{
return (int)::SendMessage(GetHwnd(), TBM_GETSELEND, 0, 0);
}
int wxSlider::GetSelStart() const
{
return (int)::SendMessage(GetHwnd(), TBM_GETSELSTART, 0, 0);
}
void wxSlider::SetSelection(int minPos, int maxPos)
{
::SendMessage(GetHwnd(), TBM_SETSEL,
(WPARAM) TRUE /* redraw */,
(LPARAM) MAKELONG( minPos, maxPos) );
}
void wxSlider::SetThumbLength(int len)
{
::SendMessage(GetHwnd(), TBM_SETTHUMBLENGTH, (WPARAM) len, (LPARAM) 0);
}
int wxSlider::GetThumbLength() const
{
return (int)::SendMessage( GetHwnd(), TBM_GETTHUMBLENGTH, 0, 0);
}
void wxSlider::SetTick(int tickPos)
{
::SendMessage( GetHwnd(), TBM_SETTIC, (WPARAM) 0, (LPARAM) tickPos );
}
// ----------------------------------------------------------------------------
// composite control methods
// ----------------------------------------------------------------------------
WXHWND wxSlider::GetStaticMin() const
{
return m_labels ? (WXHWND)(*m_labels)[SliderLabel_Min] : NULL;
}
WXHWND wxSlider::GetStaticMax() const
{
return m_labels ? (WXHWND)(*m_labels)[SliderLabel_Max] : NULL;
}
WXHWND wxSlider::GetEditValue() const
{
return m_labels ? (WXHWND)(*m_labels)[SliderLabel_Value] : NULL;
}
WX_FORWARD_STD_METHODS_TO_SUBWINDOWS(wxSlider, wxSliderBase, m_labels)
#endif // wxUSE_SLIDER
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?