Leaked source code of windows server 2003
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
//+-------------------------------------------------------------------------
//
// 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); }
|