Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Bag prilikom eliminiacije ListView treperenja (flickering)

[es] :: Kernel i OS programiranje :: Bag prilikom eliminiacije ListView treperenja (flickering)

[ Pregleda: 2587 | Odgovora: 1 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

NomadSOulX

Član broj: 26435
Poruke: 2
212.200.12.*

Sajt: www.nomadsoulx.xredirect...


Profil

icon Bag prilikom eliminiacije ListView treperenja (flickering)13.05.2004. u 12:16 - pre 191 meseci
Neznam da li sam postavio pitanje u pravom delu formua (nadam se da ce mi moderatori oprostiti :))

Ovako:
Dosadano teperenje nekih controli zna poprolicno da izludi ljude (a ponajvise one koji to hoce da srede). Evo kako glasi kod:
Inicijalizacija:
Code:

hListView = CreateWindowEx(WS_EX_CLIENTEDGE,WC_LISTVIEW,"",
WS_VISIBLE | WS_CHILD | WS_BORDER | LVS_REPORT | LVS_SINGLESEL,
        iLeft,iTop,iWidth,iHeight,hParentWnd,(HMENU)IDListview,hInst,NULL);
if (hListView == NULL)
    return false;
ListView_SetExtendedListViewStyle(hListView,LVS_EX_FULLROWSELECT);
wpLast = (WNDPROC)SetWindowLong(hListView,GWL_WNDPROC,(LONG)ListViewAddProc);

Subclassovana ListView glavna funkcija:
Code:

LRESULT CALLBACK ListViewAddProc(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam)
{
    switch (Msg)
    {
    case WM_ERASEBKGND:
        return 0;
        break;
    case WM_PAINT:
        {
            HDC hDc = GetDC(hWnd);
            RECT rtRect;
            GetClipBox(hDc,&rtRect);
            rtRect.top+=17; //da izostavim header
            FillRect(hDc,&rtRect, CreateSolidBrush(RGB(0,0,0)));
            ReleaseDC(hWnd,hDc);
        }
        break;
    }
    return CallWindowProc(wpLast,hWnd,Msg,wParam,lParam);
}

Problem je sledeci:
Flickering je ovako nestao (ne sasvim, ali je podnosljivo), ali su se pojavile neke anomalije koje ne mogu da objasnim. Kada promenim poziciju glavnog prozora tako da ode iza bordera desktopa i kada ga vratim, stavke listview-a (listview je u Report rezimu) nestanu sa prozora (?!?). Ali onog trenutka kada promenim velicinu prozora sve se vrati kako treba. Ista anomalija se desava i kada scrolujem listview pomocu horizontalnog klizaca u njegovom prozoru (isto se sve resava ponovnom promenom velicine glavnog prozora). Pomocu Spy++ sam pokusao da vidim da li se mozda slucajno ne salje neka poruka koji nisam obradio, ali nista nisam primetio sto bi moglo da bude. Video sam jedino da se salje NM_CUSTODRAW u obliku WM_NOTIFY. Da li je ovo poruka koju treba da obradim ili ima neka druga, ili nesto sasvim deseto sto nisam uradio...
Ako nesto znaci glavni prozor sadrzi parametar WS_CLIPCHILDREN, kako ne bi docrtavao deo prozora na kojem stoje kontrole.
Unapred hvala
 
Odgovor na temu

hwfanatic
Branko Grbac
Beograd

Član broj: 91
Poruke: 171
*.ppp-bg.sezampro.yu



Profil

icon Re: Bag prilikom eliminiacije ListView treperenja (flickering)25.06.2004. u 22:22 - pre 190 meseci
Jesi li uzeo u obzir da WM_PAINT poruka u jednom svom delu sadrži i tačne koordinate dela prozora koji je zaista potrebno osvežiti?
Yea, and from this day forth, a surface must be locked before beast or man can draw upon it!
 
Odgovor na temu

[es] :: Kernel i OS programiranje :: Bag prilikom eliminiacije ListView treperenja (flickering)

[ Pregleda: 2587 | Odgovora: 1 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.