⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 controls.cxx

📁 windows mobile phone source code
💻 CXX
📖 第 1 页 / 共 3 页
字号:
    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 + -