WinAPI - LixtView_XXXX

0

Nareszcie jakieś sensowne pytanie od mnie:

Jak obsłógiwać Funkcje ListView_* (*oznacza wildcard) a w szczególności
ListView_GetItem, ListView_SetItem, ListView_GetItemPosition, ListView_setItemPosition

lub:

Jak odczytać położenie ikon na pulpicie

0

Nie wiem czy ci to coś da ale wszystkie komunikaty możesz znaleźć w pliku "CommCtrl.pas"

0

wszystkie komunikaty są tam, czytałem, jest tego dużo, ale w winSDK nie piszą jak tego poprawnie użyć np ListView_GetItem z ustawioną flagą LVIF_TEXT

0

Też za bardzo tego nie wiem ale znalazłem programik z wykorzystaniem
modułu CommCtrl tyle że z komponentem ProgressBar
(Może to coś ci da [cygaro] )

{Copyright (c) 2002 by Adam Boduch}
program Ctrl;
uses
Windows,
CommCtrl,
Messages;
var ProgressBar : HWND;
function WndProc(Wnd: HWND; uMsg: UINT; wPar: WPARAM; lPar: LPARAM): LRESULT; stdcall;
var
i : Integer;
begin
{ na początek zwracamy wartość 0 - meldunek jest przetwarzany }
Result := 0;
case uMsg of
WM_CREATE:
begin
// umieść komponent ProgressBar i zwróć uchwyt
ProgressBar := CreateWindow('msctls_progress32', '', WS_CHILD or WS_VISIBLE, 100, 10, 350, 20, Wnd, 0, hInstance, nil);
end;
WM_PAINT: // obsługa komunikatu WM_PAINT
begin
for i := 0 to 100 do
begin
Sleep(50); // odczekaj 50 milisekund
SendMessage(ProgressBar, PBM_SETPOS, i, 0); // wyślij komunikat do komponentu
end;
Halt(1); // zamknij program
end;
WM_DESTROY: PostQuitMessage(0);
else Result := DefWindowProc(Wnd, uMsg, wPar, lPar);
end;
end;
var
Wnd: TWndClass; // klasa okna
Msg: TMsg;
begin
with Wnd do
begin
lpfnWndProc := @WndProc; // funkcja okienkowa
hInstance := hInstance; // uchwyt do zasobow
lpszClassName := 'My1stApp'; // klasa
hbrBackground := COLOR_WINDOW; // kolor tła
hIcon := LoadIcon(0, IDI_APPLICATION); // domyślna ikona
hCursor := LoadCursor(0, IDC_ARROW); // domyślny kursor
end;
RegisterClass(Wnd); // zarejestruj nowa klase
InitCommonControls;
// stworz forme...
CreateWindow('My1stApp', 'Aplikacja z wykorzystaniem modułu CommCtrl.pas',
WS_VISIBLE or WS_TILEDWINDOW,
300, 300, 500, 300,
0, 0, hInstance, NIL);
while GetMessage(msg, 0, 0, 0) do
begin
TranslateMessage(msg);
DispatchMessage(msg);
end;
end.

0

inaczej określe: co ja robie źle? oto kodzik:

procedure TForm1.Button1Click(Sender: TObject);
var
Desktop:THandle;
I: Integer;
LVI: TLVItem;
P: TPoint;
Text: PChar;

function GetDesktopListViewHandle: THandle;
var
S: String;
begin
Result := FindWindow('ProgMan', nil);
Result := GetWindow(Result, GW_CHILD);
Result := GetWindow(Result, GW_CHILD);
SetLength(S, 40);
GetClassName(Result, PChar(S), 39);
if PChar(S) 'SysListView32' then Result := 0;
end;

begin
Memo1.Clear;
Desktop:=GetDesktopListViewHandle;
if Desktop=0 then
begin
Application.MessageBox('Dupa!','Desktop',MB_OK or MB_ICONWARNING);
exit;
end;
Label1.Caption:='Handle to Desktop is:'+IntToStr(Desktop);
if CommCtrl.ListView_GetItemCount(Desktop)=0 then
Application.MessageBox('Albo mie sie zdaje albo nimosz zadnyc icon na pulpicie','Dupa!',MB_OK or MB_ICONWARNING)
else
Memo1.Lines.Add('Count of icons:'+IntToStr(ListView_GetItemCount(Desktop)));
Memo1.Lines.Add('--');
For I:=0 to ListView_GetItemCount(Desktop)-1 do
begin
FillChar(P, SizeOf(P),0);
if ListView_GetItemPosition(Desktop, I, P) then
begin
Text:=AllocMem(260);
CommCtrl.ListView_GetItemText(Desktop, I,0, Text, 260);
Memo1.Lines.Add(Format('Item#%d ("%s") X=%d Y=%d',[I,String(Text),P.X, P.Y]));
end;
end;
end;

Najpierw się explorer.exe wywala na commctrl.dl, potem (po reloadzie explorera) wszystko niby dobrz, zwraca dobrą ilość ikon, ale ani tekstu itemu ani pozycji nie zwraca, to dopiero chamstwo. pomocy!

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