Code: Select all
pCombo->ShowDropDown(FALSE);
Code: Select all
pCombo->ShowDropDown(TRUE);
Code: Select all
pCombo->ShowDropDown(FALSE);
Code: Select all
pCombo->ShowDropDown(TRUE);
Destul de greu de reprodus...mesajflaviu wrote:Daca la un combo box , in starea drop down , sterg un item , exista posibilitatea de a redimensiona fereastra drop down pentru a nu fi mai mare decat numarul de item-uri ramase ? ...
Code: Select all
class CMyComboBox : public CComboBox
{
// ...
public:
void FitDropDownToItems();
private:
BOOL _IsTypeSimple();
HWND _GetDropdownListBox();
};
Code: Select all
void CMyComboBox::FitDropDownToItems()
{
HWND hWnd = _GetDropdownListBox();
if(NULL != hWnd)
{
CWnd* pWnd = CWnd::FromHandle(hWnd);
CRect rcDropDown, rcDropDownCli;
pWnd->GetWindowRect(rcDropDown);
pWnd->GetClientRect(rcDropDownCli);
int nHeight = rcDropDown.Height() - rcDropDownCli.Height();
const int nCount = GetCount();
for(int nIndex = 0; nIndex < nCount; nIndex++)
{
nHeight += GetItemHeight(nIndex);
}
CRect rcDropDownNew(rcDropDown.left, rcDropDown.top, rcDropDown.right, rcDropDown.top + nHeight);
if(_IsTypeSimple())
{
ScreenToClient(rcDropDown);
ScreenToClient(rcDropDownNew);
pWnd->MoveWindow(rcDropDownNew);
int nHeightDiff = rcDropDown.Height() - rcDropDownNew.Height();
CRect rcCombo;
GetWindowRect(rcCombo);
GetParent()->ScreenToClient(rcCombo);
rcCombo.bottom -= nHeightDiff;
MoveWindow(rcCombo);
}
else
{
pWnd->MoveWindow(rcDropDownNew);
}
}
}
BOOL CMyComboBox::_IsTypeSimple()
{
DWORD dwType = 0x03 & GetStyle();
return (CBS_SIMPLE == dwType);
}
HWND CMyComboBox::_GetDropdownListBox()
{
HWND hWnd = NULL;
if(_IsTypeSimple())
{
CString strClassName;
const int nMaxCount = 64;
HWND hWndChild = ::GetWindow(m_hWnd, GW_CHILD);
while(NULL != hWndChild)
{
::GetClassName(hWndChild, strClassName.GetBufferSetLength(nMaxCount), nMaxCount);
strClassName.ReleaseBuffer();
if(!strClassName.CompareNoCase(_T("ComboLBox")))
{
hWnd = hWndChild;
break;
}
hWndChild = ::GetWindow(hWndChild, GW_HWNDNEXT);
}
}
else
{
hWnd = ::FindWindow(_T("ComboLBox"), NULL);
}
return hWnd;
}
Code: Select all
void CMyDialog::OnButtonTest()
{
m_combo.ShowDropDown();
m_combo.DeleteString(2); // just for testing
m_combo.FitDropDownToItems();
}
Eu folosesc VC6 , nu am disponibila aceasta metoda ...Viorel wrote:Încearcă SetMinVisibleItems(GetCount()).
Incearca cu CB_SETMINVISIBLE. Merge de la XP incolo.mesajflaviu wrote:Eu folosesc VC6 , nu am disponibila aceasta metoda ...Viorel wrote:Încearcă SetMinVisibleItems(GetCount()).
Nu merge deoarece clasa pentru lista drop-down nu este asa cum ai pus tu "ComboBox" ci "ComboLBox", cu 'L'.mesajflaviu wrote:Ovidiu , am implementat solutia ta , dar nu cred ca functioneaza ...
Ai avut dreptate , acum merge brici ! Alta data sper sa casc ochii mai bine .Nu merge deoarece clasa pentru lista drop-down nu este asa cum ai pus tu "ComboBox" ci "ComboLBox"
Asa e , dar poate ca daca nu greseam , nu bagam de seama cum se numeste aceasta clasa pt lista drop-down ... oamenii invata din greseli ... din ce in ce mai perfectionate .// Cateodata e bun si copy/paste-ul, mai ales atunci cand sursa e de incredere...
Asa cum am spus , folosesc VC6 , si as dori ca implementarea sa functioneze si pe Windows NT. Dar o sa incerc si ideea ta .cristianamarie wrote:Incearca cu CB_SETMINVISIBLE. Merge de la XP incolo.mesajflaviu wrote:Eu folosesc VC6 , nu am disponibila aceasta metoda ...Viorel wrote:Încearcă SetMinVisibleItems(GetCount()).
Windows NT nu o sa mearga. Am spus ca merge de la XP incolo. VC6 nu are nici o legatura, nu o sa ai, poate metoda SetMinVisibleItems, dar SendMessage(CB_SETMINVISIBLE, wParam, lParam) o sa mearga.mesajflaviu wrote:Asa cum am spus , folosesc VC6 , si as dori ca implementarea sa functioneze si pe Windows NT. Dar o sa incerc si ideea ta .cristianamarie wrote:Incearca cu CB_SETMINVISIBLE. Merge de la XP incolo.mesajflaviu wrote:Eu folosesc VC6 , nu am disponibila aceasta metoda ...Viorel wrote:Încearcă SetMinVisibleItems(GetCount()).
Code: Select all
CString sText;
GetWindowText(sText);
if(! sText.IsEmpty())ShowDropDown();