API ListView kolor zaznaczenia wiersza

0

Problem jest raczej trudny ale mam nadzieje , że na tym forum ktoś potrafi rozwiązać problem.
Chodzi o zmianę koloru paska zaznaczającego wiersz aktywny.

Poniżej fragment kodu, który powinien to realizować ale niestety nie realizuje :(

function FunOkna(hOkno: HWND; uKomunikat: UINT;
		wParametr: WPARAM; lParametr: LPARAM): LRESULT; stdcall;
begin
  Result := 0;
  case uKomunikat of
    WM_NOTIFY:

        if PNMLVCustomDraw(Lparametr)^.nmcd.hdr.hwndFrom=HListView then
            begin
              if PNMLVCustomDraw(LParametr)^.nmcd.dwDrawStage=CDIS_SELECTED then
                 begin
                    SetBkMode(PNMLVCustomDraw(Lparametr)^.nmcd.hdc, OPAQUE);
                    SetTextColor(PNMLVCustomDraw(Lparametr)^.nmcd.hdc, RGB(0,255,0));
                    SetBkColor(PNMLVCustomDraw(Lparametr)^.nmcd.hdc, rgb(255,0,0));
                    PNMLVCustomDraw(LParametr)^.clrTextBk:=RGB(0,255,0);
                    PNMLVCustomDraw(LParametr)^.clrText:=rgb(255,0,0);
                    Result:= CDRF_DODEFAULT or CDRF_NOTIFYPOSTPAINT;
                 end;
            end;
      end;
end;
0

Obawiam się, żę koloru zaznaczenia nie da się wybrać, bo jest ustalany prze bieżący motyw.
trzeba to wymalować 'ręcznie' w odp. komunikacie, po kolei tło oraz tekst, przy czym wyłączyć
CDRF_DODEFAULT.

proponuję poczytać też w win32sdk, temat: Highlighting an Entire Row in a ListView Control:
"One of the supported styles for the ListView control is LVS_OWNERDRAWFIXED,
which allows the program to perform all the drawing of items in the
ListView control. Whenever the ListView control needs to have a portion of
the control repainted, it calculates which items are in that area and sends
a WM_DRAWITEM message to its parent for each item. If any part of an item
needs to be redrawn, the ListView sends the WM_DRAWITEM with the update
rectangle set to the entire item.

The ListView control handles owner drawn items differently from other owner
drawn controls. Previous owner drawn controls use the DRAWITEMSTRUCT's
itemAction field to let the parent know if it needs to draw the item,
change the selected state, or change the focus state. The ListView control
always sends the WM_DRAWITEM message with the itemAction set to
ODA_DRAWENTIRE. The parent needs to check the itemState to see if the focus
or selection needs to be updated.
"

polecam też link: http://support.microsoft.com/kb/q131788/

0

Dzięki za wskazówkę mam nadzieję , że uda się coś zrobić ale już coraz bardziej ręce rozkładam.
Zmianę tego koloru czyli zaznaczenia w ListView widziałem w E-mule tam są kody źródłowe ale nie jestem tego w stanie odseparować :-( no i jest w C+

Temat również jest na : http://forum.gamedev.pl/index.php/topic,3102.0.html

0

Możesz jeszcze zasymulować działanie listViewa za pomocą scrollboxa i paneli - dzięki temu zyskasz wieeeele nowych możliwości - mam nadzieję, że to pomoże: http://4programmers.net/Forum/388107?h=panel#id388107

0
procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
with ListView1.Canvas do
     begin
     if Item.Selected then
        begin
        Brush.Color := clHighLight;
        Font.Color := clHighLightText;
        Font.Style := [fsBold];
        end;
     end;
DefaultDraw := True;
end;


{lub}

{UWAGA !
Nie jest możliwe podświetlenie wielu pozycji. Nie działa opcja SelectAll podświetlające wszystkie pozycje.}
procedure TFormMAC.ListView1AdvancedCustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; Stage: TCustomDrawStage;
  var DefaultDraw: Boolean);
begin
 if Item.Selected then
   begin
    ListView1.Canvas.Brush.Color := $0053D2FF;
    ListView1.Canvas.Font.Color  := clBlack;
    ListView1.Selected           := Item.ListView.DropTarget;
   end
 else
   begin
    ListView1.Canvas.Brush.Color := ListView1.Color;
   end;
end;
0

Poddaję się !!!
Nie mam pojęcia jak to zrobić !
W E-mule to jest zrobione.
http://abj_31.w.interia.pl/ListView1.JPG
przy ustawieniach windy
http://abj_31.w.interia.pl/ListView_ustaw1.JPG

Kody są dostępne ale ja tego nie mogę znaleŹć

// zmieniłem image na url, nie zmusaj ludzi do ściągania screenów. (dop. deus)

0

Chyba jesteś nie poważny !

Podałem Ci jak na tacy, ale widocznie spożytkowanie tego jest dla Ciebie wielkim wyzwaniem... żenada.

0
Opi napisał(a)

Chyba jesteś nie poważny !

Podałem Ci jak na tacy, ale widocznie spożytkowanie tego jest dla Ciebie wielkim wyzwaniem... żenada.

Żenada to, że nie umiesz czytać w temacie masz jak wół API
A to co podałeś to VCL prawie dobrze ale prawie robi wielką różnicę.
Spróbuj to przetworzyć na WinApi będziesz wielki bo ja nie potrafię.

To co napisałeś czyli rozwiazanie jest ok ! na pewno się komuś przyda.
W moim przypadku akurat nie !!!

0

Ekhm... Panowie, VCL to API!. Tak, ta biblioteka to interface programowania aplikacji. Oczywiście abj miał na myśli WINAPI. Koniec konfliktu, abj - uważniej dobieraj słowa.</b>

1 użytkowników online, w tym zalogowanych: 0, gości: 1