274 lines
6.9 KiB
C++
274 lines
6.9 KiB
C++
//-----------------------------------------------------------------------------
|
|
// File: ComboBox.cpp
|
|
// Desc: ComboBox control class
|
|
//
|
|
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
|
|
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
|
|
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
|
|
// PARTICULAR PURPOSE.
|
|
//
|
|
// Copyright (C) Microsoft Corporation. All rights reserved.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
#include "wincontrol.h"
|
|
#include "ComboBox.h"
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Name: AddString
|
|
// Description: Add a string to the combo box list.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
BOOL ComboBox::AddString(LPCTSTR sItem)
|
|
{
|
|
if (!sItem)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
LRESULT result = SendMessage(CB_ADDSTRING, 0, (LPARAM)sItem);
|
|
if (result == CB_ERR || result == CB_ERRSPACE)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Name: AddString
|
|
// Description: Add a string to the combo box list, with an associated
|
|
// data item.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
BOOL ComboBox::AddString(LPCTSTR sItem, DWORD_PTR pData)
|
|
{
|
|
if (!sItem)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
LRESULT result = SendMessage(CB_ADDSTRING, 0, (LPARAM)sItem);
|
|
if (result == CB_ERR || result == CB_ERRSPACE)
|
|
{
|
|
return FALSE;
|
|
}
|
|
else
|
|
{
|
|
return SetItemData((int)result, pData);
|
|
}
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Name: InsertString
|
|
// Description: Insert a string at a specified index.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
BOOL ComboBox::InsertString(int index, LPCTSTR sItem)
|
|
{
|
|
if (!sItem)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
LRESULT result = SendMessage(CB_INSERTSTRING, (WPARAM)index, (LPARAM)sItem);
|
|
if (result == CB_ERR || result == CB_ERRSPACE)
|
|
{
|
|
return FALSE;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Name: GetCurrentSelection
|
|
// Description: Get the index of the current selection.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
BOOL ComboBox::GetCurrentSelection(int *pindex)
|
|
{
|
|
if (!pindex)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
LRESULT res = SendMessage(CB_GETCURSEL, 0, 0);
|
|
if (res == CB_ERR)
|
|
{
|
|
return FALSE;
|
|
}
|
|
else
|
|
{
|
|
*pindex = (int)res;
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Name: Select
|
|
// Description: Select an item in the list, by index.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
BOOL ComboBox::Select(int index)
|
|
{
|
|
LRESULT res = SendMessage(CB_SETCURSEL, (WPARAM)index, 0);
|
|
if (res == CB_ERR)
|
|
{
|
|
return FALSE;
|
|
}
|
|
else
|
|
{
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Name: GetString
|
|
// Description: Get the string at a specified index.
|
|
//
|
|
// The caller must call CoTaskMemFree to release the string.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
BOOL ComboBox::GetString(int index, TCHAR **ppBuffer)
|
|
{
|
|
if (ppBuffer == NULL)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
LRESULT res = SendMessage(CB_GETLBTEXTLEN, (WPARAM)index, 0);
|
|
if (res == CB_ERR)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
DWORD count = (DWORD)(res + 1);
|
|
|
|
TCHAR *pBuffer = (TCHAR*)CoTaskMemAlloc(sizeof(TCHAR) * count);
|
|
if (pBuffer == NULL)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
res = SendMessage(CB_GETLBTEXT, (WPARAM)index, (LPARAM)pBuffer);
|
|
|
|
if (res == CB_ERR)
|
|
{
|
|
CoTaskMemFree(pBuffer);
|
|
return FALSE;
|
|
}
|
|
else
|
|
{
|
|
*ppBuffer = pBuffer;
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Name: GetSelectedString
|
|
// Description: Get the string for the item that is currently selected.
|
|
//
|
|
// The caller must call CoTaskMemFree to release the string.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
BOOL ComboBox::GetSelectedString(TCHAR **ppBuffer)
|
|
{
|
|
int index = 0;
|
|
if (GetCurrentSelection(&index))
|
|
{
|
|
return GetString(index, ppBuffer);
|
|
}
|
|
else
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Name: Count
|
|
// Description: Returns the number of items in the combo box.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
UINT ComboBox::Count()
|
|
{
|
|
LRESULT res = SendMessage(CB_GETCOUNT, 0, 0);
|
|
return (res == CB_ERR ? 0 : (UINT)res);
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Name: ClearItems
|
|
// Description: Clears the combo box list.
|
|
//
|
|
// Note: If the combo box items have user data associated with them, the
|
|
// application must release the free the memory for the user data before
|
|
// calling this method.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
void ComboBox::ClearItems()
|
|
{
|
|
SendMessage(CB_RESETCONTENT, 0, 0);
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Name: SetItemData
|
|
// Description: Sets the user data for an item in the combo box.
|
|
//
|
|
// nIndex: Index of the combo box item.
|
|
// pData: User data.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
BOOL ComboBox::SetItemData(int nIndex, DWORD_PTR pData)
|
|
{
|
|
LRESULT result = SendMessage(CB_SETITEMDATA, nIndex, (LPARAM) pData);
|
|
if (result == CB_ERR)
|
|
{
|
|
return FALSE;
|
|
}
|
|
else
|
|
{
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Name: GetItemData
|
|
// Description: Gets the user data for an item in the combo box.
|
|
//
|
|
// nIndex: Index of the combo box item.
|
|
// pData: Receives a pointer to the data.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
BOOL ComboBox::GetItemData(int nIndex, DWORD_PTR *ppData)
|
|
{
|
|
|
|
LRESULT result = SendMessage(CB_GETITEMDATA, nIndex, 0);
|
|
if (result == CB_ERR)
|
|
{
|
|
return FALSE;
|
|
}
|
|
else
|
|
{
|
|
*ppData = (DWORD_PTR)result;
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Name: GetCurrentSelectionItemData
|
|
// Description: Gets the user data for the current selection.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
BOOL ComboBox::GetCurrentSelectionItemData(DWORD_PTR *pData)
|
|
{
|
|
int selection;
|
|
BOOL bResult = GetCurrentSelection(&selection);
|
|
if (bResult)
|
|
{
|
|
bResult = GetItemData(selection, pData);
|
|
}
|
|
return bResult;
|
|
} |