Skocz do zawartości

Trix

Członkowie
  • Postów

    0
  • Dołączył

  • Ostatnio

    Nigdy

Posty napisane przez Trix

  1. hmm
    Wydaje się być wszystko w miarę ok. Zrobiłem mały programik, który właściwie jest prawie dokładnie taki sam jak twój ( fragment ładowania i wyświetlania bitmapy) i wszystko działa jak należy. Widać, że wywołujesz te funkcje w procedurze obsługi okna (lParam) - może parametry, które przekazujesz są niewłaściwe? Próbowałeś debugować program? Możesz ewentualnie spróbować załadować jakąś bitmapę, podając bezpośrednio wartości w funkcjach, a nie przekazując je z innych funkcji (np. ścieżkę w LoadImage). Może funkcja GetOpenFileName zwraca 0? Może niepoprawnie zainicjalizowałeś strukturę ofn?

    pozdrawiam

  2. Faktycznie - wydaje się to bardziej funkcjonalne niż to przełączanie. Dodatkowo, jeśli dobrze rozumiem wystarczyło, że ukryłeś całe okno i wszystkie kontrolki na nim były równierz ukrywane? Ja ukrywam i pokazuje kontrolki oddzielnie, co jest bardzo niewygodne, zajmuje dużo miejsca w kodzie i wprowadza bałagan...no ale cóż - początkujący jestem i uczę sie dopiero:)

    pozdrawiam

  3. Jeżeli chcesz załadować bitmapę z pliku to trzeba użyć funkcji LoadImage. Wydaje mi się, że nie możesz tego zrobić tak jak pokazałeś ponieważ u Ciebie X jest prawdopdobnie strukturą typu OPENFILENAME, która to przechowuje między innymi nazwę pliku wybranego przez użytkownika więc nie możesz jej tak bezpośrednio przekazać funkcji LoadBitmap. Nazwa pliku wybranego przez użytkownika znajduje się w składowej struktury OPENFILENAME.
    Jak to wszystko ładnie zrobić jest pokazane w artykule Pinolca:
    https://winapi.org/index.php?option=content&task=view&id=27&Itemid=28

    pozdrawiam

  4. Zgodnie z tym textem:

    https://www.kellygroup.com/glinkj/help/scd/dunits.htm

    Więc w skrócie:
    1 jednostka dialogu w poziomie = 1/4 average character width ( czyli albo szerokosc sredniego znaku, albo srednia szerokosc znaku..)
    1 jednostka dialogu w pionie = 1/8 average character height
    MSDN twierdzi, że łatwiej jest użyc funkcji MapDialogRect, która w jednym ze swoich parametrów zwróci rozmiar okna dialogowego w pikselach.

    pozdrawiam

  5. Po kilku dniach użerania się z kontrolkami Tab udało mi się wreszcie rozwiązać ten problem. Rozwiązanie jest jak zwykle banalne...
    Mój problem odnosi się nie tylko do kontrolki zakładek ale ogólnie do okien ( czyli np. kontrolek zasłoniętych przez inne kontrolki ). Jak wiemy okno ma swoje współrzędne x,y ( lewy górny róg ) oraz szerokość i długość. Jednak aby system wiedział, które okno jest aktualnie widoczne ( jest na wierzchu), wykorzystuje współrzędną z, która określa, jak głeboko znajduje się okno. Do sterowania ( nie bezpośredniego) oknem w wymiarze z służy funkcja SetWindowPos. W moim przypadku pierwsza kontrolka zasłaniała drugą, więc przesłałem tą pierwszą na sam "spód":

    invoke SetWindowPos, hcMainTab, HWND_BOTTOM, 0, 0,\
                                     0, 0, SWP_NOMOVE or SWP_NOSIZE
    

    I tyle...Prawda, że banalne?

  6. Witam
    Mam kolejny "błahy" problem;) Mam dwie kontrolki Tab. Kiedy klikam na jedną z zakładek to pokazuje mi się druga kontrolka Tab, tylko że jest ona przysłonięta przez tą pierwszą...Włączyłem styl WS_EX_TRANSPARENT ale nic nie pomogło. Jak się z tym można uporać?

  7. Rzeczywiście jest skuteczny - nareszcie dziala prawie tak jak powinno. No właśnie - prawie. Pojawił się pewien problem: na oknie dialogowym mam kontrolkę List View, dwa EditBox'y i kilka Static Text'ów. Kiedy uruchamiam program to wszystko jest w porządku - zakładki działają i to co ma znikać, znika, a to co ma się pojawić, pojawia się. Kiedy jednak zmieniam myszką szerokość kolumny na ListView tak, żeby część ostaniej kolumny wychodziła poza obszar widoczny to ten obszar poszerzony przybiera kolor okna dialogowego ( czyli znika część kolumny ). Normalnie powinie sie pokazać poziomy ScrollBar ( mam ten styl włączony ) ale się nie pokazuje, a zamiast niego pojawia się kolor okna dialogowego. Po zmianie zakładki na drugą i powrocie wszystko jest ok ( widać ScrollBar i kolumnę ). Gdy w prgramie zmienię tak, żeby kolumny były na tyle szerokie żeby np. jedna wychodziła poza widoczny obaszar to po uruchomieniu programu również wszystko jest ładnie wyświetlane. Może mam obsłużyć jakiś LVN_.. ?. W poprzedniej wersji programu, jak nie miałem jeszcze zakładek to tego problemu nie było. Wiecie, co może być nie tak?

  8. Właśnie się zorientowałem, że kompletnie źle myślałem:). Wydawało mi się że jak mam kontrolkę Tab i klikam na jej zakładki to każdej zkładce przypożądkowany jest odzielne okno dialogowe, a to przecież tylko kontrolki się pojawiają albo znikają...Chyba musze troche zażyc ruchu:P
    Poczytałem o PropertySheet i tam faktycznie juz podaje się okna dialogowe - ale w takim przypadku nie będzie chyba mi to potrzebne. Zmarnowałem na to cały dzień:(

    ps. czemu ten serwis tak wolno chodzi?

  9. Witam,
    stworzylem trzy okna dialogowe. Jedno z nich jest oknem rodzicem dla pozostalych, w nim tez znajduje sie kontolka Tab. Chce aby po klinkieciu na jedna z dwoch zakladek wyswietlilo sie jedno z okien dialogowych. Narazie mam jedna funkcje obslugi okna ( okna rodzica). Czy musze stworzyc odzielne funkcje obslugi pozostalych dwoch okien dialogowych?

  10. Witam
    Mam kontrolke ListView - zawiera ona 4 kolumny ( 1 Item + 3 SubItem'y). Kontrolka ustawiona jest na automatyczne sortowanie elementow. Problem polega na tym, ze gdy dodam nowy element, a jest on "mniejszy" niz poprzedni, to zostanie on przesuniety przed poprzedni element ale jego podelementy zostaja na tym samym miejscu. Reasumujac jak skojarzyc Item z SubItem tak, aby sortowane byly cale wiersze??

  11. Faktycznie! Teraz kiedy to wyjasiles wydaje sie to prawie oczywiste:). Dzieki wielkie! Troche bez sensu jest to ze kompilator wlasnie tak rozwija invoke'a...Z tego co wycztalem z dokumentacji funkcji to proces wywolujacy jest odpowiedzialny za oczyszczenie stosu - zatem trzeba po instrukcji call dodac jeszcze add ESP, 28...
    Zastanawia mnie tylko jeszcze jedna rzecz: gdy program wrzuca na stos zmienna typu np. WORD to i tak na stos wrzucana jest warotsc DWORD ( ponoc wynika to z tego ze jest to szybsze) - czyli jest jakby wyrownanie do DWORD. Dlaczego wiec nie wrzuca poprawnie tego? Czy moze sie myle?

    ps. Fajnie ze piszesz w asmie bo ciezko jest sie kogos poradzic, gdy kroluje c++:)

  12. Witam
    Zdaje sie, ze juz mniej wiecej wiem gdzie siedzi problem - prawdopodobnie jest nim funkcja wsprintf! Po deasemblacji programu zauwazylem ze na stos wrzucany jest tylko pierwszy parametr, a nastepne nie sa juz wrzucane parametry tylko zamiast nich sa instrukcje

    push 0

    . Nie wiem dokladnie co tam sie dzieje bo nie mam czasu tego analizowac ale z ta funkcja wsprintf sa same problemy...Moj problem rozwiazalem srednio fajnie ale wazne ze dziala - zamiast wrzucac wszystko do wsprintf dopisuje poprostu do bufora kolejne przekonwertowane liczby. Wyglada to tak:

         invoke FileTimeToLocalFileTime, ADDR FoundData.ftLastWriteTime, 
    ADDR FTime
         invoke FileTimeToSystemTime, ADDR FTime, ADDR STime                    
         invoke wsprintf, ADDR fsBuf, SADD("%u:"),  STime.wHour
         invoke wsprintf, ADDR temp, SADD("%02u "), STime.wMinute
         invoke lstrcat, ADDR fsBuf, ADDR temp
         invoke wsprintf, ADDR temp, SADD("%u-"), STime.wDay
         invoke lstrcat, ADDR fsBuf, ADDR temp
         invoke wsprintf, ADDR temp, SADD("%02u-"), STime.wMonth
         invoke lstrcat, ADDR fsBuf, ADDR temp
         invoke wsprintf, ADDR temp, SADD("%u"), STime.wYear
         invoke lstrcat, ADDR fsBuf, ADDR temp
    
    

    Byc moze zle tez tworzylem ciag formatujacy ale probowalem z wieloma typami i nic to nie dawalo wiec watpie. Oczywiscie wsprintf z jednym paramterem dziala poprawnie.
    pozdrawiam

  13. Witam
    Moj problem polega na tym ze, gdy po odczycie daty ostatniego wpisu w pliku i jej konwersji na czas systemowy konwertuje ja na ciag znakow funkcja wsprintf to niestety wynikiem sa jakies liczby ktore z pewnoscia nie sa data ani czasem. Oto fragment kodu:

    invoke FileTimeToSystemTime, ADDR FoundData.ftLastWriteTime, ADDR STime                    
                        .if eax == 0
                            invoke MessageBox, NULL, SADD("Blad przy konwersji daty"), SADD("Konwersja daty"), MB_OK
                        .endif
                        invoke wsprintf, ADDR fsBuf, ADDR templateData, STime.wHour, STime.wMinute, STime.wDay, STime.wMonth, STime.wYear
    

    Ponizej zmienne wykorzystywane we fragmencie:

    LOCAL FoundData:    WIN32_FIND_DATA
    LOCAL STime:        SYSTEMTIME
    LOCAL fsBuf[MAX_PATH]: BYTE             ; pomocniczy bufor
    templateData db "%u:%u %u-%u-%u",0  ciag formatujacy
    

    Wczesniej w programie struktura FoundData jest oczywiscie wypelniana przez funkcje FindNextFile. W czym moze byc problem?

×
×
  • Utwórz nowe...