Nightowl Napisano Październik 28, 2019 Autor Zgłoś Udostępnij Napisano Październik 28, 2019 1. Chcę znaleźć element w ListView, mam coś takiego: GetCursorPos(&point); ScreenToClient(hListView, &point); LV_FINDINFO znajdz; znajdz.flags= LVFI_NEARESTXY ; znajdz.pt=point; int ktory ktory=ListView_FindItem(hListView,0, &znajdz); Czy ktoś mi powie co mam w tym kodzie źle, bo cały czas funkcja zwraca mi -1. :( 2. Jeżeli już mam index elementu w ListView, to jak mam pobrać nazwy z sąsiednich kolumn 3.Użyłem w programie dwóch dialogbox. Pierwszy uruchamia się poprawnie. Jak wywołuje drugi to mie się pokazują tylko jego kontrolki( bez tła i ramki). Dla drugiego DialogBox'a mam drugą procedurę. Czy tak jest poprawnie, czy może powinienem oba dialogi obsługiwać w jednej procedurze 4.Jak dodać bitmapę do dialogbox'a Dzięki za odpowiedzi :) Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Mops Napisano Październik 28, 2019 Zgłoś Udostępnij Napisano Październik 28, 2019 Cuda niewidy a nie mozna tak int itemIndex; itemIndex=ListView->ItemIndex; // tu dziabnelem sobie numerek //pobieranie danych TListItem *item; AnsiString TekstDane; TekstDane=item->Caption; //pierwsza kolumna //druga podobnie, trzecia tez itd " TekstDane=list->SubItems->Text; // albo sprawdz bo nie mam pewnosci a co do 3 i 4 pytania to nie wiem co to DIalogBOx :?: Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Burn Napisano Październik 28, 2019 Zgłoś Udostępnij Napisano Październik 28, 2019 Witam 1. Czy napewno chcesz szukać item najbliższy od aktulnej pozycji kursora tak Jeżeli tak to jak styl ma Twój ListView bo w MSDN piszą, że flaga LVFI_NEARESTXY działa tylko przy durzych i małych ikonach. 2. Nazwy z sąsiednich kolumn Chodzi o nagłówki listy, czy o zawartość sąsiednich kolumn listy (SubItem) 3. Jak wywołujesz drugi dialog Jeżeli np. po naciśnięciu na przycisk to powinno działać w ten sposób, że każdy dialog ma osobną procedurę z tym ,że w wywołaniu idrogiego dialogu za pomocą DialogBoxParam musisz ustawić trzeci parametr hWndParent (uchwyt rodzica) na uchwyt dialogu pierwszego. 4. O co chodzi z tą Bitmapą Chcesz wyświetlić bitmapę na dialogu? Można by to zrobić w obsłudze komunikatu WM_PAINT ale to jest bardziej skomplikowane znacznie prościej jest utworzenie na dialogu kontrolki Static ze stylem SS_BITMAP i jeżeli bitmapa znajduje sie w zasobach to załadować ją za pomocą LoadBitmap, natomiast jeżeli bitmapa znajduje się w pliku to trzeba użyć LoadImage. To wszystko co mogę teraz napisać, napisz bardziej szczegółowo pytania na, które nie dostałeś satysfakcionującej odpowiedzi. Pozdro Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Nightowl Napisano Październik 29, 2019 Autor Zgłoś Udostępnij Napisano Październik 29, 2019 Nie wiem gesiek, ale twój kod jest chyba pod visuala, bo nie moge znaleźć w helpie danych, których użyłeś. Proszę o sprostowanie. Do kAzka: 1.Nic mi nie wiadomo o ikonach- ja ich nie mam, bo w helpie nic o nich nie pisali. Moja kontrolka ma styl LVS_REPORT. Jeżeli wiesz jak to inaczej zrobić, to czekam. 2. Chodiz o zawartość sąsiednich kolumn. 3. Mi chodzi o wywołanie drugiego dialogu, który nie ma nic wspólnego z pierwszym. Więc oba okna dialogowe za rodzica mają okno główne. Wogule wywołuje dialogi za pomącą funkcji DialogBox, i z tego co mój kulawy angielski przeczytał, wynika że różni się ta funkcja od twojej parametrem LPARAM, który przekazuje początkową wartość przy wywołaniu. Jeśli sie mylę to proszę mnie poprawić. 4. Tak dokładnie to w zasobach mam coś takiego: CONTROL "", ID, STATIC, SS_BITMAP | (dalsze parametry). Chodzi mi o ten cudzysłów. Co ja mam do niego wpisać . Czy może to być ścieżka do bitmapy, a jak nie to czy ma on jakieś zastosowanie Dzięki. pozdro :) Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Burn Napisano Październik 29, 2019 Zgłoś Udostępnij Napisano Październik 29, 2019 Witam 1. No właśnie chodziło mi o to, że flaga LVFI_NEARESTXY dziala tylko przy stylach LVS_SMALLICON i LVS_ICON. Więc dlatego zwraca Ci -1. Aby szukać pozycji najbliższej kursora musisz napisać własną procedurę jednak ja tego nigdy nie robiłem (nie miałem potrzeby) więc Ci nie podpowiem jak. Natomiast jeżeli chcesz znaleźć tylko pozycję zawierającą określony ciąg znaków (string) to jest proste trzeba tylko ustawić pola struktury LV_FINDINFO .flags na LVFI_STRING lub LVFI_PARTIAL i .psz na adres szukanego ciagu znaków (przy LVFI_STRING musisz podać cały natomiast przy LVFI_PARTIAL wystarszy tylko początek) Póżniej wystarczy tylko wywołać: ktory=ListView_FindItem(hListView,-1, &znajdz); 2. Kiedyś w MASM na swoje potrzeby napisałem taką funkcję. Jeżeli nie bedziesz umiał tego przetłumaczyć na C++ to gdzieś poczytaj o LVM_GETITEM Parametry: hListView: HWND - uchwyt ListView iItemNo: DWORD - Numer Item (czyli wiersza) iSubItemNo: DWORD - Numer SubItem (czyli kolumny) lpText: LPSTR - Adres buforka w którym będzie zwrócony tekst MaxLen: DWORD - Maksymalna długość zwracenego tekstu (naie więcej niż długosć bufora) Uwaga: Wiersze i kolumny numerowane są od 0 GetListViewText proc hListView: HWND, iItemNo: DWORD, iSubItemNo: DWORD, lpText: LPSTR, MaxLen: DWORD LOCAL lvi:LV_ITEM push iItemNo pop lvi.iItem push iSubItemNo pop lvi.iSubItem mov lvi.imask, LVIF_TEXT push lpText pop lvi.pszText push MaxLen pop lvi.cchTextMax invoke SendMessage, hListView, LVM_GETITEM, 0, addr lvi ret GetListViewText endp 3. Niestety tu jest problem ponieważ wywołanie Dialogu za pomocą DialogBoxParam lub makra DialogBox tworzy modalne okno dialogowe, co uniemożliwia wywołnie drugiego dialogu spróbuj użyć CreateDialogParam albo makra CreateDialog (parametry bez zmian). Powinno działać :P 4. Składnia: CONTROL text, id, class, style, x, y, width, height [, extended-style] text - tekst kontrolki id - identyfikator class - klasa x, y - pozycja kontrolki względem głownego okna width - szerokość height - wysokość extended-style - styl rozszerzony (parametr opcjonalny) Jak z tego wynika pole text pozostawiasz bez zmian (przecież kontrolka nie ma wyświetlać tekstu tylko bitmapę). Aby wyświetlić bitmapę trzeba za pomocą funkcji LoadBitmap załadowąc bitmapę z zasobów a następnie trzeba wysłać komunikat STM_SETIMAGE do kontrolki którego wParam to IMAGE_BITMAP (chcemy załadować bitmapę) a lParam to uchwyt bitmapy. W MASM można to zrobić tak: invoke LoadBitmap, hInstance, ID_BITMAPY invoke SendDlgItemMessage, hWnd, ID_KONTROLKI, STM_SETIMAGE, IMAGE_BITMAP, eax Ale się rozpisałem :) Mam nadzieję, że przynajmniej trochę pomogłem. Uwaga Post został zmodyfikowany (dokładnie 3 punkt) bo tam wcześniej napisałem takie bzdury, że wstyd się przyznawać... Pozdro Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Mops Napisano Październik 30, 2019 Zgłoś Udostępnij Napisano Październik 30, 2019 lukasz_all napisał: Nie wiem gesiek, ale twój kod jest chyba pod visuala, bo nie moge znaleźć w helpie danych, których użyłeś. Proszę o sprostowanie. Troche nasciemniałem :) ja kozystam z C++ Builder 6 A wiec: 1) na formatke 2 TBUtton, 1 TMemo, 1 ListView (dodaj 4 kolumny) i umiesc nastepujacy kod :) //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { TListItem *item; ListView1->Items->BeginUpdate(); ListView1->Clear(); for(int i=1;i<10;i++) { item=ListView1->Items->Add(); item->Caption="Zamiykanie"; item->SubItems->Add("Exit"); item->SubItems->Add("Zamykanie programu"); item->SubItems->Add(i); } ListView1->Items->EndUpdate(); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { AnsiString tekst; tekst=ListView1->Items->Item[0]->Caption + " " + ListView1->Items->Item[0]->SubItems->Text; // + " " + ListView1->Items->Item[0]->SubItems->Text + " " + ListView1->Items->Item[0]->SubItems->Text); Memo1->Lines->Text=tekst; } //--------------------------------------------------------------------------- Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.