windows-nt/Source/XPSP1/NT/admin/activec/nodemgr/ccomboex.cpp
2020-09-26 16:20:57 +08:00

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);
}