📄 controls.cxx
字号:
SendMessage(GetHWND(), LB_SETCURSEL, index, 0L);
parent->OnControlNotify(*this, NewSelection);
}
}
void PListBox::Select(PINDEX index, BOOL update, BOOL sel)
{
SendMessage(GetHWND(), WM_SETREDRAW, update, 0L);
SendMessage(_hWnd, LB_SETSEL, sel, MAKELPARAM(index, 0));
if (!update)
SendMessage(_hWnd, WM_SETREDRAW, TRUE, 0L);
parent->OnControlNotify(*this, NewSelection);
}
void PListBox::GetCreateWinInfo(WNDCLASS & wndClass)
{
PControl::GetCreateWinInfo(wndClass);
wndClass.lpszClassName = "ListBox";
if (sort)
_styleBits |= LBS_SORT;
if (multi)
_styleBits |= LBS_EXTENDEDSEL;
if (width != 0)
_styleBits |= LBS_MULTICOLUMN|WS_HSCROLL;
else
_styleBits |= WS_VSCROLL;
_styleBits |= WS_BORDER|LBS_NOINTEGRALHEIGHT|LBS_NOTIFY|LBS_DISABLENOSCROLL;
}
int PListBox::TranslateOption(NMHDR & msg) const
{
switch (msg.code) {
case LBN_SELCHANGE :
return NewSelection;
case LBN_DBLCLK :
return DoubleClick;
}
return -1;
}
void PListBox::CreateHWND()
{
PControl::CreateHWND();
if (width != 0)
SetColumnWidth(width, FALSE);
}
void PListBox::WndProc()
{
if (_msg->event == WM_DESTROY && deleteObjects && IsDescendant(PCustomListBox::Class())) {
for (PINDEX i = 0; i < GetCount(); i++) {
LPARAM itemData = SendMessage(GetHWND(), LB_GETITEMDATA, i, 0L);
if (itemData != LB_ERR)
delete (PObject *)itemData;
}
}
PControl::WndProc();
}
BOOL PListBox::AdjustDimensionForScrollBar(UINT) const
{
return FALSE;
}
//////////////////////////////////////////////////////////////////////////////
// PStringListBox
PINDEX PStringListBox::AddString(const PString & str, BOOL update)
{
SendMessage(GetHWND(), WM_SETREDRAW, update, 0L);
PINDEX retval = (PINDEX)SendMessage(_hWnd, LB_ADDSTRING, 0, (DWORD)(const char *)str);
if (!update)
SendMessage(_hWnd, WM_SETREDRAW, TRUE, 0L);
return retval;
}
void PStringListBox::InsertString(const PString & str, PINDEX index, BOOL update)
{
SendMessage(GetHWND(), WM_SETREDRAW, update, 0L);
SendMessage(_hWnd, LB_INSERTSTRING, index, (DWORD)(const char *)str);
if (!update)
SendMessage(_hWnd, WM_SETREDRAW, TRUE, 0L);
}
void PStringListBox::DeleteString(PINDEX index, BOOL update)
{
DeleteEntry(index, update);
}
PINDEX PStringListBox::FindString(const PString & str, PINDEX startIndex, BOOL exact) const
{
if (startIndex == P_MAX_INDEX)
startIndex = -1;
long retVal = SendMessage(GetHWND(),
exact ? LB_FINDSTRINGEXACT : LB_FINDSTRING, startIndex,
(DWORD)(const char *)str);
return retVal != LB_ERR ? (PINDEX)retVal : P_MAX_INDEX;
}
PString PStringListBox::GetString(PINDEX index) const
{
PString str;
long len = SendMessage(GetHWND(), LB_GETTEXTLEN, index, 0);
if (len != LB_ERR)
SendMessage(GetHWND(), LB_GETTEXT, index, (DWORD)str.GetPointer(len+1));
return str;
}
void PStringListBox::SetTabStops(PDIMENSION tab)
{
tabStops.SetSize(1);
tabStops[0] = tab;
SendMessage(GetHWND(), LB_SETTABSTOPS, 1, (LPARAM)&tab);
}
void PStringListBox::SetTabStops(const PORDINATE * tabs, PINDEX count)
{
PAssert(count > 0, PInvalidParameter);
memcpy(tabStops.GetPointer(count), tabs, count*sizeof(int));
SendMessage(GetHWND(), LB_SETTABSTOPS, count, (LPARAM)tabs);
}
void PStringListBox::SetTabStops(const PIntArray & tabs)
{
PAssert(tabs.GetSize() > 0, PInvalidParameter);
SendMessage(GetHWND(), LB_SETTABSTOPS,
tabs.GetSize(), (LPARAM)(const int *)tabs);
}
void PStringListBox::GetCreateWinInfo(WNDCLASS & wndClass)
{
PListBox::GetCreateWinInfo(wndClass);
_styleBits |= LBS_USETABSTOPS;
}
//////////////////////////////////////////////////////////////////////////////
// PCustomListBox
PINDEX PCustomListBox::AddEntry(PObject * obj, BOOL update)
{
SendMessage(GetHWND(), WM_SETREDRAW, update, 0L);
PINDEX retval = (PINDEX)SendMessage(_hWnd, LB_ADDSTRING, 0, (DWORD)obj);
if (!update)
SendMessage(_hWnd, WM_SETREDRAW, TRUE, 0L);
return retval;
}
void PCustomListBox::InsertEntry(PObject * obj, PINDEX index, BOOL update)
{
SendMessage(GetHWND(), WM_SETREDRAW, update, 0L);
SendMessage(_hWnd, LB_INSERTSTRING, index, (DWORD)obj);
if (!update)
SendMessage(_hWnd, WM_SETREDRAW, TRUE, 0L);
}
PINDEX PCustomListBox::FindEntry(const PObject & obj, PINDEX startIndex) const
{
if (startIndex == P_MAX_INDEX)
startIndex = -1;
long retVal = SendMessage(_hWnd,
LB_FINDSTRINGEXACT, startIndex, (DWORD)(const char *)(PString &)obj);
return retVal != LB_ERR ? (PINDEX)retVal : P_MAX_INDEX;
}
void PCustomListBox::SetEntry(PObject * obj, PINDEX index, BOOL update)
{
SendMessage(GetHWND(), WM_SETREDRAW, update, 0L);
BOOL doNotify = GetSelection() == index;
SendMessage(_hWnd, LB_SETITEMDATA, index, (DWORD)obj);
if (!update)
SendMessage(_hWnd, WM_SETREDRAW, TRUE, 0L);
if (doNotify)
parent->OnControlNotify(*this, NewSelection);
}
const PObject * PCustomListBox::GetEntry(PINDEX index) const
{
long retVal = SendMessage(GetHWND(), LB_GETITEMDATA, index, 0L);
return retVal != LB_ERR ? (const PObject *)retVal : NULL;
}
void PCustomListBox::GetCreateWinInfo(WNDCLASS & wndClass)
{
PListBox::GetCreateWinInfo(wndClass);
_styleBits |= LBS_OWNERDRAWVARIABLE;
}
//////////////////////////////////////////////////////////////////////////////
// PComboBox
PComboBox::PComboBox(PInteractorLayout * parent,
PRESOURCE_ID ctlID, const PNotifier & notify, PString * valuePtr)
: PControl(parent, ctlID, notify, valuePtr)
{
sort = (_styleBits&CBS_SORT) != 0;
PAssert((_styleBits&CBS_DROPDOWN) != 0, ControlResourceMismatch);
}
PINDEX PComboBox::GetCurrent() const
{
long retVal = SendMessage(GetHWND(), CB_GETCURSEL, 0, 0L);
return retVal != CB_ERR ? (PINDEX)retVal : P_MAX_INDEX;
}
void PComboBox::GetCreateWinInfo(WNDCLASS & wndClass)
{
PControl::GetCreateWinInfo(wndClass);
wndClass.lpszClassName = "ComboBox";
if (sort != 0)
_styleBits |= CBS_SORT;
_styleBits |= CBS_DROPDOWN|CBS_AUTOHSCROLL|WS_VSCROLL;
}
int PComboBox::TranslateOption(NMHDR & msg) const
{
switch (msg.code) {
case CBN_SELCHANGE :
return NewSelection;
case CBN_DROPDOWN :
return ListDropped;
case CBN_CLOSEUP :
return ListClosed;
case CBN_EDITCHANGE :
return EditChange;
}
return -1;
}
BOOL PComboBox::OnEndInput()
{
parent->OnControlNotify(*this, PEditBox::EndEdit);
return TRUE;
}
//////////////////////////////////////////////////////////////////////////////
// PScrollBar
PScrollBar::PScrollBar(PInteractorLayout * parent, PRESOURCE_ID ctlID,
const PNotifier & notify, PSCROLLBAR_VALUE * valuePtr)
: PControl(parent, ctlID, notify, valuePtr)
{
PStringArray limits = GetWndText().Tokenise(" ");
value = minimum = 0;
maximum = 100;
smallNudge = 1;
largeNudge = 10;
switch (limits.GetSize()) {
case 4 :
largeNudge = (PSCROLLBAR_VALUE)limits[3].AsInteger();
case 3 :
smallNudge = (PSCROLLBAR_VALUE)limits[2].AsInteger();
case 2 :
maximum = (PSCROLLBAR_VALUE)limits[1].AsInteger();
case 1 :
value = minimum = (PSCROLLBAR_VALUE)limits[0].AsInteger();
}
SetScrollRange(_hWnd, SB_CTL, minimum, maximum, FALSE);
SetScrollPos(_hWnd, SB_CTL, value, FALSE);
tracking = FALSE;
foregroundColour = owner->GetScrollBarColour();
backgroundColour = owner->GetScrollBarColour();
}
void PScrollBar::SetMaximum(PSCROLLBAR_VALUE val, BOOL redraw)
{
maximum = val;
if (minimum > maximum)
minimum = maximum;
SetScrollRange(GetHWND(), SB_CTL, minimum, maximum, redraw);
SetValue(value);
}
void PScrollBar::SetMinimum(PSCROLLBAR_VALUE val, BOOL redraw)
{
minimum = val;
if (maximum < minimum)
maximum = minimum;
SetScrollRange(GetHWND(), SB_CTL, minimum, maximum, redraw);
SetValue(value);
}
void PScrollBar::SetValue(PSCROLLBAR_VALUE val, BOOL redraw)
{
SetScrollPos(GetHWND(), SB_CTL, val, redraw);
PSCROLLBAR_VALUE newValue = (PSCROLLBAR_VALUE)GetScrollPos(_hWnd, SB_CTL);
if (value != newValue) {
parent->OnControlNotify(*this, StartTrack);
value = newValue;
parent->OnControlNotify(*this, EndTrack);
}
}
int PScrollBar::TrackScrollBar(WPARAM code, int trackVal)
{
int newVal = value;
switch (code) {
case SB_LINEUP :
newVal -= smallNudge;
break;
case SB_LINEDOWN :
newVal += smallNudge;
break;
case SB_PAGEUP :
newVal -= largeNudge;
break;
case SB_PAGEDOWN :
newVal += largeNudge;
break;
case SB_TOP :
newVal = minimum;
break;
case SB_BOTTOM :
newVal = maximum;
break;
case SB_THUMBTRACK :
case SB_THUMBPOSITION :
newVal = trackVal;
}
SetScrollPos(_hWnd, SB_CTL, newVal, TRUE);
value = (PSCROLLBAR_VALUE)GetScrollPos(_hWnd, SB_CTL);
if (tracking) {
if (code != SB_ENDSCROLL)
return Tracking;
tracking = FALSE;
return EndTrack;
}
tracking = TRUE;
return StartTrack;
}
void PScrollBar::CreateHWND()
{
PControl::CreateHWND();
SetScrollRange(_hWnd, SB_CTL, minimum, maximum, FALSE);
SetScrollPos(_hWnd, SB_CTL, value, TRUE);
foregroundColour = owner->GetScrollBarColour();
backgroundColour = owner->GetScrollBarColour();
}
void PScrollBar::GetCreateWinInfo(WNDCLASS & wndClass)
{
PControl::GetCreateWinInfo(wndClass);
wndClass.lpszClassName = "ScrollBar";
_styleBits |= WS_TABSTOP;
}
PVerticalScrollBar::PVerticalScrollBar(PInteractorLayout * parent,
PRESOURCE_ID ctlID, const PNotifier & notify, PSCROLLBAR_VALUE * valuePtr)
: PScrollBar(parent, ctlID, notify, valuePtr)
{
PAssert((_styleBits&1)!=0, ControlResourceMismatch);
}
void PVerticalScrollBar::GetCreateWinInfo(WNDCLASS & wndClass)
{
PScrollBar::GetCreateWinInfo(wndClass);
_styleBits |= SBS_VERT;
}
PHorizontalScrollBar::PHorizontalScrollBar(PInteractorLayout * parent,
PRESOURCE_ID ctlID, const PNotifier & notify, PSCROLLBAR_VALUE * valuePtr)
: PScrollBar(parent, ctlID, notify, valuePtr)
{
PAssert((_styleBits&1)==0,ControlResourceMismatch);
}
void PHorizontalScrollBar::GetCreateWinInfo(WNDCLASS & wndClass)
{
PScrollBar::GetCreateWinInfo(wndClass);
_styleBits |= SBS_HORZ;
}
// End Of File ///////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -