125 lines
3.1 KiB
C++
125 lines
3.1 KiB
C++
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
//
|
||
|
// Copyright (C) Microsoft Corporation, 1999 - 1999
|
||
|
//
|
||
|
// File: ccomboex.cpp
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
// CComboex.cpp
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "ccomboex.h"
|
||
|
|
||
|
BOOL CComboBoxEx2::FindItem(COMBOBOXEXITEM* pComboItem, int nStart)
|
||
|
{
|
||
|
ASSERT(pComboItem != NULL);
|
||
|
ASSERT(nStart >= -1);
|
||
|
|
||
|
// Only suport lparam search for now
|
||
|
ASSERT(pComboItem->mask == CBEIF_LPARAM);
|
||
|
|
||
|
int nItems = GetCount();
|
||
|
|
||
|
COMBOBOXEXITEM ComboItem;
|
||
|
ComboItem.mask = CBEIF_LPARAM;
|
||
|
|
||
|
for (int iItem = nStart+1; iItem < nItems; iItem++)
|
||
|
{
|
||
|
ComboItem.iItem = iItem;
|
||
|
BOOL bStat = GetItem(&ComboItem);
|
||
|
ASSERT(bStat);
|
||
|
|
||
|
if (ComboItem.lParam == pComboItem->lParam)
|
||
|
return iItem;
|
||
|
}
|
||
|
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
//+-------------------------------------------------------
|
||
|
//
|
||
|
// FindNextBranch(iItem)
|
||
|
//
|
||
|
// This function returns the index of the next item which
|
||
|
// is not within the branch rooted at iItem. If no next
|
||
|
// branch is found, the fucntion returns the item count.
|
||
|
//+-------------------------------------------------------
|
||
|
|
||
|
int CComboBoxEx2::FindNextBranch(int iItem)
|
||
|
{
|
||
|
int nItems = GetCount();
|
||
|
ASSERT(iItem >= 0 && iItem < nItems);
|
||
|
|
||
|
COMBOBOXEXITEM ComboItem;
|
||
|
ComboItem.mask = CBEIF_INDENT;
|
||
|
|
||
|
// Get indent of start item
|
||
|
ComboItem.iItem = iItem;
|
||
|
BOOL bStat = GetItem(&ComboItem);
|
||
|
ASSERT(bStat);
|
||
|
int iIndent = ComboItem.iIndent;
|
||
|
|
||
|
// Locate next item with LE indent
|
||
|
while (++iItem < nItems)
|
||
|
{
|
||
|
ComboItem.iItem = iItem;
|
||
|
BOOL bStat = GetItem(&ComboItem);
|
||
|
ASSERT(bStat);
|
||
|
|
||
|
if (ComboItem.iIndent <= iIndent)
|
||
|
return iItem;
|
||
|
}
|
||
|
|
||
|
return nItems;
|
||
|
}
|
||
|
|
||
|
|
||
|
//+------------------------------------------------------
|
||
|
//
|
||
|
// DeleteBranch
|
||
|
//
|
||
|
// This function deletes the item as the specified index
|
||
|
// and all children of the item.
|
||
|
//+------------------------------------------------------
|
||
|
void CComboBoxEx2::DeleteBranch(int iItem)
|
||
|
{
|
||
|
int iNextBranch = FindNextBranch(iItem);
|
||
|
|
||
|
for (int i=iItem; i< iNextBranch; i++)
|
||
|
{
|
||
|
DeleteItem(iItem);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//+------------------------------------------------------
|
||
|
//
|
||
|
// FixUp
|
||
|
//
|
||
|
// This function is a workaround for two bugs in the NT4
|
||
|
// version of comctl32.dll. First it turns off the
|
||
|
// nointegralheight style of the inner combo box, which
|
||
|
// the comboxex code forces on during creation. Next it
|
||
|
// adjusts the size of the outer comboboxex wnd to be the
|
||
|
// same size as the inner combobox wnd. Without this the
|
||
|
// outer box cuts off the bottom of the inner box.
|
||
|
//+------------------------------------------------------
|
||
|
|
||
|
void CComboBoxEx2::FixUp()
|
||
|
{
|
||
|
ASSERT(::IsWindow(m_hWnd));
|
||
|
|
||
|
HWND hWndCombo = GetComboControl();
|
||
|
ASSERT(::IsWindow(hWndCombo));
|
||
|
|
||
|
::SetWindowLong( hWndCombo, GWL_STYLE, ::GetWindowLong( hWndCombo, GWL_STYLE ) & ~CBS_NOINTEGRALHEIGHT );
|
||
|
|
||
|
RECT rc;
|
||
|
::GetWindowRect(hWndCombo,&rc);
|
||
|
SetWindowPos(NULL, 0, 0, rc.right - rc.left, rc.bottom - rc.top, SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOREPOSITION|SWP_NOZORDER);
|
||
|
}
|
||
|
|
||
|
|