Cloud Napisano Wrzesień 10, 2019 Autor Zgłoś Udostępnij Napisano Wrzesień 10, 2019 gdy wysylam BM_SETCHECK do Checkboxa to ladnie sie zaznacza, ale jego wartosc checked(nie wykonuje sie metoda przypisana do zaznaczenia checkboxa) jest taka sama jak przed wyslaniem messege'a, probowalem wysylac WM_LBUTTONDBLCLK, ale wtedy kontrolka zyskuje tylko focus (mimo, ze podalem wspolzedne dokladnie na oknienko do zaznaczania). Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Burn Napisano Wrzesień 10, 2019 Zgłoś Udostępnij Napisano Wrzesień 10, 2019 Witam! Nie wiem co kombinujesz ale teoretycznie wszystko powinno działać... Jak zmieniasz stan CheckBox-a za pomocą komunikatu BM_SETCHECK, a odczytujesz za pomocą BM_GETCHECK to działa na 100%. Sprawdziłem!!! :D U mnie działa taki kod (niestety w MASM) :( invoke CreateWindowEx, 0, addr szButton, 0, WS_VISIBLE or WS_CHILD or BS_AUTOCHECKBOX, 25, 25, 100, 20, hWnd, 0, hInstance, 0 mov hButtonGenrate, eax invoke SendMessage, hButtonGenrate, BM_GETCHECK, 0, 0 PrintDec eax ;Sprawdzam stan CheckBox-a - mam 0 invoke SendMessage, hButtonGenrate, BM_SETCHECK, BST_CHECKED, 0 invoke SendMessage, hButtonGenrate, BM_GETCHECK, 0, 0 PrintDec eax ;Sprawdzam stan CheckBox-a - mam 1 Jeżeli dalej nie będzie śmigało napisz kawałek kodu jak tworzysz CheckBox i jak zmieniasz i odczytujesz jego stan. Pozdrowienia Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Cloud Napisano Wrzesień 10, 2019 Autor Zgłoś Udostępnij Napisano Wrzesień 10, 2019 balem sie, ze zostane tak zrozumiany :( tak, BM_SETCHECK i BM_GETCHECK mi dziala, ale nie do konca tak jakbym chcial .... np. mam potpieta procedure pod Checkboxa, ktora sie wykonuje gdy sie na niego kliknie i chce ja wywolac (czyli chce kliknac na checkboxa), na zwyklego buttona moge kliknac WM_LBUTTONDOWN+WM_LBUTTONUP, na checkboxa nie ... w Delphi jak wykonam CheckBox1.Checked:=true;(czyli zmienie stan checkboxa) to ta procedura sie wykonuje Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Burn Napisano Wrzesień 11, 2019 Zgłoś Udostępnij Napisano Wrzesień 11, 2019 Witam! Nie wiem czy o to Ci chodzi ale zobacz cos takiego (Przykład w MASM) MyCheckBoxProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM mov eax, uMsg .if eax == BM_SETCHECK ; <-- tu wstawiasz kod wywołujący twoją procedurę .endif invoke CallWindowProc, lpOldProc, hWin, uMsg, wParam, lParam ret MyCheckBoxProc endp WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM mov eax, uMsg .if eax == WM_CREATE invoke CreateWindowEx, 0, addr szButton, 0, WS_VISIBLE or WS_CHILD or BS_AUTOCHECKBOX, 25, 75, 100, 20, hWnd, 0, hInstance, 0 mov hCheckBox, eax invoke GetWindowLong, eax, GWL_WNDPROC mov lpOldProc, eax invoke SetWindowLong, hCheckBox, GWL_WNDPROC, addr MyCheckBoxProc .elseif eax == WM_DESTROY invoke PostQuitMessage,NULL .else invoke DefWindowProc,hWnd,uMsg,wParam,lParam ret .endif xor eax,eax ret WndProc endp Procedura wstawiona w obsłudze komunkatu BM_SETCHECK wywoła sie zarówno po ręcznym kliknięciu na CheckBoxa jak i przy zmianie jego stanu za pomocą wywołania komunkatu BM_SETCHECK Jeżeli dalej nie o to Ci chodzi to napisz kawałek kodu co jak robisz bo już nie wiem. Pozdrowienia Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Trace Napisano Wrzesień 11, 2019 Zgłoś Udostępnij Napisano Wrzesień 11, 2019 Czy na pewno trzeba posuwać się aż do subclassingu? Zawsze myślałem, że checkbox wysyła po kliknięciu (bądź wysłaniu BM_SETCHECK) komunikat WM_COMMAND tak, jak zwykly button... Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Burn Napisano Wrzesień 11, 2019 Zgłoś Udostępnij Napisano Wrzesień 11, 2019 Witam! Niestety (przynajmniej u mnie) nie działa to co napisał pamelus ale rzeczywiście można sie obejść bez subclassingu. Komunikat WM_COMMAND dostaję tylko po kliknięciu na CheckBox-a ale jeżeli zrobie cos takiego: invoke SendMessage, hCheckBox, BM_SETCHECK, BST_CHECKED, 0 and eax, BN_CLICKED invoke SendMessage, hWnd, WM_COMMAND, eax, hCheckBox to oczywiście zostanie wysłany komunikat WM_COMMAND :D który wystarczy tylko odpowiednio obsłużyć np. coś takiego .ELSEIF uMsg == WM_COMMAND HIWORD wParam .if eax == BN_CLICKED mov eax, lParam .if eax == hCheckBox invoke SendMessage, hCheckBox, BM_GETCHECK, 0, 0 ;i tu dopiero mamy stan naszego CheckBox-a .endif .endif .ELSE Więc jest to alternatywne rozwiązanie :D W tym miejscu chciałem prosić pamelusa aby napisał jak zrobić żeby CheckBox wysyłał komunikat WM_COMMAND po wysłaniu BM_SETCHECK Być może to kwestia nadania mu tylko odpowiedniego stylu ??!! Pozdrowienia Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Trace Napisano Wrzesień 12, 2019 Zgłoś Udostępnij Napisano Wrzesień 12, 2019 kAzek ma rację... Sprawdziłem i po wysłaniu BM_SETCHECK nie dostaję komunikatu WM_COMMAND. Wydawało mi się, że kiedyś takie rowziązanie wykorzystałem w jednym z moich programów, ale tam wysyłałem do checkbox BM_CLICK i wtedy w WM_COMMAND dopiero WM_SETCHECK i inne akcje... Sorx za wprowadzenie błąd Errare humanum est :) 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.