Skocz do zawartości

BM_SETCHECK


Cloud

Recommended Posts

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).

Link do komentarza
Udostępnij na innych stronach

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

Link do komentarza
Udostępnij na innych stronach

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

Link do komentarza
Udostępnij na innych stronach

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

Link do komentarza
Udostępnij na innych stronach

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

Link do komentarza
Udostępnij na innych stronach

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 :)

Link do komentarza
Udostępnij na innych stronach

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gość
Odpowiedz...

×   Wkleiłeś zawartość bez formatowania.   Usuń formatowanie

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Utwórz nowe...