Redimensionare CComboBox

Intrebari legate de programarea cu biblioteci precum MFC, ATL, WTL si GDI+.
Post Reply
mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Redimensionare CComboBox

Post by mesajflaviu » 29 Sep 2010, 12:14

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 ? Asa din topor , am putut face asta cu :

Code: Select all

pCombo->ShowDropDown(FALSE);
si apoi :

Code: Select all

pCombo->ShowDropDown(TRUE);
dar nu e elegant , si pe unele sisteme apare flickering ... am mai incercat si sa redesenez combo-box-ul , insa degeaba ...



User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Redimensionare CComboBox

Post by Ovidiu Cucu » 30 Sep 2010, 08:09

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 ? ...
Destul de greu de reprodus...
Probabil, un FindWindow("ComboLBox", NULL) urmat de un MoveWindow, poate rezolva problema.

Viorel
Microsoft MVP
Microsoft MVP
Posts: 293
Joined: 13 Jul 2007, 12:26

Re: Redimensionare CComboBox

Post by Viorel » 01 Oct 2010, 22:44

Încearcă SetMinVisibleItems(GetCount()).

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Redimensionare CComboBox

Post by Ovidiu Cucu » 02 Oct 2010, 15:15

Poti sa incerci codul de mai jos.
Daca sunt nelamuriri te rog nu ezita sa intrebi.

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

mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Redimensionare CComboBox

Post by mesajflaviu » 02 Oct 2010, 21:33

Viorel wrote:Încearcă SetMinVisibleItems(GetCount()).
Eu folosesc VC6 , nu am disponibila aceasta metoda ...

mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Redimensionare CComboBox

Post by mesajflaviu » 02 Oct 2010, 22:28

Ovidiu , am implementat solutia ta , dar nu cred ca functioneaza ... am atasat proiectul ... poate mi-a scapat ceva :?:
Attachments
AutoComplete2.rar
(37.26 KiB) Downloaded 282 times

User avatar
cristianamarie
Membru++
Membru++
Posts: 480
Joined: 12 Mar 2009, 18:47
Judet: Iaşi
Location: Iasi

Re: Redimensionare CComboBox

Post by cristianamarie » 03 Oct 2010, 14:33

mesajflaviu wrote:
Viorel wrote:Încearcă SetMinVisibleItems(GetCount()).
Eu folosesc VC6 , nu am disponibila aceasta metoda ...
Incearca cu CB_SETMINVISIBLE. Merge de la XP incolo.
Nuclear launch detected

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Redimensionare CComboBox

Post by Ovidiu Cucu » 03 Oct 2010, 15:38

mesajflaviu wrote:Ovidiu , am implementat solutia ta , dar nu cred ca functioneaza ...
Nu merge deoarece clasa pentru lista drop-down nu este asa cum ai pus tu "ComboBox" ci "ComboLBox", cu 'L'.
Ia vezi acuma cum zbarnaie! :)
AutoComplete2.zip
(20.48 KiB) Downloaded 287 times
// Cateodata e bun si copy/paste-ul, mai ales atunci cand sursa e de incredere... ;)

mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Redimensionare CComboBox

Post by mesajflaviu » 04 Oct 2010, 13:17

Nu merge deoarece clasa pentru lista drop-down nu este asa cum ai pus tu "ComboBox" ci "ComboLBox"
Ai avut dreptate , acum merge brici ! Alta data sper sa casc ochii mai bine . :geek:
Multumesc mult !!!!!

mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Redimensionare CComboBox

Post by mesajflaviu » 04 Oct 2010, 13:22

// Cateodata e bun si copy/paste-ul, mai ales atunci cand sursa e de incredere...
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 .

mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Redimensionare CComboBox

Post by mesajflaviu » 04 Oct 2010, 13:26

cristianamarie wrote:
mesajflaviu wrote:
Viorel wrote:Încearcă SetMinVisibleItems(GetCount()).
Eu folosesc VC6 , nu am disponibila aceasta metoda ...
Incearca cu CB_SETMINVISIBLE. Merge de la XP incolo.
Asa cum am spus , folosesc VC6 , si as dori ca implementarea sa functioneze si pe Windows NT. Dar o sa incerc si ideea ta .

User avatar
cristianamarie
Membru++
Membru++
Posts: 480
Joined: 12 Mar 2009, 18:47
Judet: Iaşi
Location: Iasi

Re: Redimensionare CComboBox

Post by cristianamarie » 05 Oct 2010, 10:38

mesajflaviu wrote:
cristianamarie wrote:
mesajflaviu wrote:
Viorel wrote:Încearcă SetMinVisibleItems(GetCount()).
Eu folosesc VC6 , nu am disponibila aceasta metoda ...
Incearca cu CB_SETMINVISIBLE. Merge de la XP incolo.
Asa cum am spus , folosesc VC6 , si as dori ca implementarea sa functioneze si pe Windows NT. Dar o sa incerc si ideea ta .
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.
Nuclear launch detected

mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Redimensionare CComboBox

Post by mesajflaviu » 10 Feb 2011, 15:18

Fiindca incerc sa dezvolt un pic acest control , am dat de o problema , peste care nu pot trece : Sa zicem ca in combobox am cateva articole : 'One','Two','Three','Four' .
Incerc sa tastez litere in editbox-ul combo-ului , daca am mai mult de o litera ( caracter ) , afisez lista drop-down :

Code: Select all

	CString sText;
	GetWindowText(sText);
	if(! sText.IsEmpty())ShowDropDown();
dar , daca tastez litera 'O' , controlul imi autocompleteaza 'One' in editbox , ( + marcheaza tot textul ) si eu nu vreau asta ... cum pot scapa de acest comportament ( util cateodata , dar nu si in cazul meu ) ?

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Redimensionare CComboBox

Post by Ovidiu Cucu » 10 Feb 2011, 17:16

Din cate stiu eu, acest ficer nu-l ai by default nici intr-un combobox normal.
Ok, acolo n-ar fi fost din cale-afara de greu de implementat. Folosesti CComboBox::FindString pe o anumita notificare, dupa care faci si dregi.
Daca insa inlocuim lista cu un tree, nu cred ca mai e chiar asa de simplu.
Ce ar trebui sa intample daca, de exemplu, in copacel am avea douasprezece frunzulitze numite "twelve"?

Post Reply