CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Wysokość Header w ListView

Wysokość Header w ListView

dział ogólny

Re: Wysokość Header w ListView

Nowy postprzez polymorphism » sobota, 16 lutego 2013, 16:25

Subclassing kontrolki załatwia sprawę. Jak będę miał nieco czasu i nie zapomnę, napiszę coś więcej.

Dla bardziej ogarniętych: trzeba napisać własną obsługę komunikatu HDM_LAYOUT.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Wysokość Header w ListView

Nowy postprzez Cyfrowy Baron » sobota, 16 lutego 2013, 17:58

polymorphism napisał(a):trzeba napisać własną obsługę komunikatu HDM_LAYOUT.


Robiłem to z HDM_LAYOUT, ale widocznie coś poszło nie tak przy pobieraniu uchwytu do istniejącego nagłówka, gdyż z nowym się udało.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Wysokość Header w ListView

Nowy postprzez polymorphism » sobota, 16 lutego 2013, 18:55

Może ten TListView to jakaś implementacja własna, a nie kontrolka systemowa, bo dziwne jest to, że ListView_GetHeader nie działa (rzekomo).
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Wysokość Header w ListView

Nowy postprzez Cyfrowy Baron » sobota, 16 lutego 2013, 19:53

Dobra! Już mi zadziałało. Niepotrzebnie wstawiałem flagę HDM_LAYOUT do funkcji SetWindowPos. Trochę nie rozumiem dlaczego tak zrobiłem, gdyż przy tworzeniu nagłówka postąpiłem inaczej, a potem jakoś mi to umknęło. Niemniej jednak może to wyglądać tak:

KOD cpp:     UKRYJ  
 WINDOWPOS wp;
 RECT rcLProc = ListView1->ClientRect;

 HDLAYOUT hdl;
 hdl.prc = &rcLProc;
 hdl.pwpos = ℘

 HWND lhWnd = ListView_GetHeader( ListView1->Handle );

 if(lhWnd == NULL) { ShowMessage("brak objektu!"); return; }

 SendMessage( lhWnd, HDM_LAYOUT, 0, (LPARAM) &hdl );

 SetWindowPos( lhWnd, wp.hwndInsertAfter, wp.x, wp.y, wp.cx, wp.cy + 20, wp.flags );


Niemniej jednak nagłówek przesłania wiersze.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Wysokość Header w ListView

Nowy postprzez polymorphism » sobota, 16 lutego 2013, 19:59

flagę HDM_LAYOUT

To nie flaga, tylko komunikat kontrolki header.

Niemniej jednak nagłówek przesłania wiersze.

Przesłania, bo nie subclasowałeś kontrolki i nie zrobiłeś obsługi wspomnianego komunikatu. Później wrzucę przykładowy kod.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Wysokość Header w ListView

Nowy postprzez Cyfrowy Baron » sobota, 16 lutego 2013, 20:13

polymorphism napisał(a):To nie flaga, tylko komunikat kontrolki header.


Wiem, tylko, że wrzuciłem ją zamiast wp.flags i dlatego skojarzyło mi się to z flagą.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Wysokość Header w ListView

Nowy postprzez polymorphism » sobota, 16 lutego 2013, 20:38

Kodu nieco...
KOD cpp:     UKRYJ  
WNDPROC oldHeaderProc = NULL;

...

LRESULT CALLBACK newHeaderProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
        if(msg == HDM_LAYOUT)
        {
                LONG height = 40; //<--- przykładowa wysokość
               
                HDLAYOUT* hdl = (HDLAYOUT*)lparam;

                hdl->prc->top = height;
                hdl->pwpos->hwndInsertAfter = NULL;
                hdl->pwpos->x = 0;
                hdl->pwpos->y = 0;
                hdl->pwpos->cy = height;
                hdl->pwpos->cx = hdl->prc->right - hdl->prc->left;
                hdl->pwpos->flags = 0;
                return 1;
        }

        return CallWindowProc(oldHeaderProc, hwnd, msg, wparam, lparam);
}

...


/* subclassing (wywoływać tylko raz!) */
HWND hHeader = ListView_GetHeader( m_list_ctrl->GetHWND() );
if(hHeader)
{
        oldHeaderProc = (WNDPROC) GetWindowLongPtr(hHeader, GWLP_WNDPROC);
        SetWindowLongPtr(hHeader, GWLP_WNDPROC, (LONG_PTR) &newHeaderProc);
}
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Wysokość Header w ListView

Nowy postprzez Cyfrowy Baron » sobota, 16 lutego 2013, 21:29

Fakt to działa, ale w C++Builder TListView nie ma funkcji GetHWND(), więc zamiast użyłem Handle. Cały kod u mnie ma taką postać:

KOD cpp:     UKRYJ  
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{

}
//---------------------------------------------------------------------------
WNDPROC oldHeaderProc = NULL;

LRESULT CALLBACK newHeaderProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
        if(msg == HDM_LAYOUT)
        {
                LONG height = 40; //<--- przykładowa wysokość

                HDLAYOUT* hdl = (HDLAYOUT*)lparam;

                hdl->prc->top = height;
                hdl->pwpos->hwndInsertAfter = NULL;
                hdl->pwpos->x = 0;
                hdl->pwpos->y = 0;
                hdl->pwpos->cy = height;
                hdl->pwpos->cx = hdl->prc->right - hdl->prc->left;
                hdl->pwpos->flags = 0;
                return 1;
        }

        return CallWindowProc(oldHeaderProc, hwnd, msg, wparam, lparam);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
 HWND hHeader = ListView_GetHeader( ListView1->Handle );
 if(hHeader)
 {
                oldHeaderProc = (WNDPROC) GetWindowLongPtr(hHeader, GWLP_WNDPROC);
                SetWindowLongPtr(hHeader, GWLP_WNDPROC, (LONG_PTR) &newHeaderProc);
 }
}
//---------------------------------------------------------------------------
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Wysokość Header w ListView

Nowy postprzez polymorphism » sobota, 16 lutego 2013, 22:05

GetHWND to metoda z wxWidgets. Kod wklejałem bezpośrednio z projektu, więc i ta metoda w nim się znalazła.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Poprzednia strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 8 gości