Funkcja WndProc() nie przechwytuje podwójnego kliknięcia myszą.

0

W funkcji WndProc() chcę obejść instrukcję switch i sprawdzić od razu czy

  1. komunikat pochodzi od okna ListBox
  2. czy naciśnięty został dwukrotnie klawisz myszy
    (żeby móc wyświetlić w miejscu elementu listbox okno edit).
    Chcę żeby na dblclick pokazywało się okno hEdit2 (edit window) w miejscu zaznaczonego elementu ListBox i było ono edytowalne, po naciśnięciu na niego enter albo escape, żeby się ukrywało.

Wie ktoś może czemu ten kod nie działa?


// hWndList - uchwyt do okna ListBox

 if ((HWND)lParam == hWndList) {
           if (message == (INT)WM_LBUTTONUP | (INT)WM_COMMAND) {/* to działa jak należy */}

// to się odpala zawsze - a chcę, żeby tylko wtedy kiedy klikam dwukrotnie klawiszem myszy
if (message == (INT)WM_LBUTTONDBLCLK | (INT)WM_COMMAND) {MessageBeep(1); }

}
// tutaj zaś bym oczekiwał po naciśnięciu przycisku enter ukrycia okna, a to się nie dzieje
  if ((HWND)lParam == hEdit3 ) {
        
          if (wParam == IDOK) { ShowWindow(hEdit3,SW_HIDE);}

// to zaś w ogóle się nie odpala
if ((HWND)lParam == hEdit3 ) {
            if(message == WM_LBUTTONDOWN){     }}
0

Jakoś tak:

if((HWND)lParam == hWndList && message == WM_COMMAND && HIWORD(wParam) == LBN_DBLCLK) {
    ...
}
0

@_0x666_: niestety nawet nie beepuje.
to też się nie odpala.

if ((HWND)lParam == hWndList) {
  
            if (message == WM_COMMAND) {{MessageBeep(1);}}
0

Pewny jesteś, że ten uchwyt jest poprawny?

0

Napisalem na górze co chcę zrobić, takie edytowalny ListBox.
Tyle już rzeczy przerabiałem, że to trochę może mało się stało czytelne ale no kod wygląda tak:
hWndList - ListBox
hEdit3 - edit control.
Chcę pobrać pozycję zaznaczonego elementu ListBox, ustawić tam edit'a , pokazać go i wczytać przez niego dane do ListBox'a potem ukryć tego edit'a.
Przy czymś takim mi bipuje raz, potem już nie jak klikam myszą, chyba że zmieniam focus na inne okno i wracam.
"" if(HIWORD(wParam) == LBN_DBLCLK) { " - to się w ogóle nie załącza.

if ((HWND)lParam == hWndList) {
        //  if (message == (INT)WM_LBUTTONDBLCLK | (INT)WM_COMMAND) {
            if (message == WM_COMMAND) {
              
             //   WORD notifyCode = GET_WM_COMMAND_CMD(wParam, lParam); ostatnia próba
                
                
                tagRECT t5;
               
                LRESULT SelIndex;
                SelIndex = SendMessage(hWndList, LB_GETCURSEL, 0, 0L);
                string s1, s2, s3, s4;
               
                wchar_t tr[20];
                SelIndex = SendMessage(hWndList, LB_GETCURSEL, 0, 0L);
                tmp_str = std::to_string(SelIndex);
                SendMessage(hWndList, LB_GETTEXT, SelIndex, (LPARAM)tr);


                SendMessage(hWndList, LB_GETITEMRECT, SelIndex, (LPARAM)&t5);
                SendMessage(hWndList, LB_GETTEXT, SelIndex, (LPARAM)tr);
                SetWindowText(hEdit3, (LPCWSTR)tr);

                //MoveWindow(hEdit3, t5.left, t5.top, t5.left, t5.top, TRUE);
             
                MessageBeep(1);
        
               
                ShowWindow(hEdit3, hcm);// SW_SHOWNA);
              
                 return 0;

     
        }
        }
1

A wystarczy zajrzeć do dokumentacji.

1

ListBox musi być stworzony ze stylem LBS_NOTIFY

0

Działa wielkie dzięki! xD
A skoro już jesteś to wiesz może coś o tym VK_RETURN - czemu mi nie przyjmuje?
Chociaż jakiego typu to jest? UINT ? Bo ten LB_DBLCLK to był HIWORD.

0

Chodzi o edita? Rozwiń temat.

0

Edit mi ignoruje przyciski takie jak enter i escape.
O to mi nie odpala kompletnie.

if ((HWND)lParam == hEdit3 ) {
          if (wParam == IDOK) {}}
0

Zgaduje, że powinieneś subklasować kontrolkę edit, by móc przechwytywać WM_KEYDOWN.

0

Ok , chyba ogarniam. Dzięki wielkie.
Bo rozumiem jak dodam do tworzenia tego okna edit taki zapis " KBD_NOTIFY" to nie podziała?

3
if (message == (INT)WM_LBUTTONDBLCLK | (INT)WM_COMMAND) {MessageBeep(1); }

To nie są maski bitowe żeby takiego ora robić.

if (message == WM_LBUTTONDBLCLK || message == WM_COMMAND) ...
0

Dlatego też dałem pojedyńczego "ora" czyli "|" .
Działa.
Dobra, subklasowałem to xD
"nie można otworzyć pliku K:\VC++_projects\WindowsProject9\x64\Debug\WindowsProject9.exe do zapisu"
I tak się kończy ta piękna historia.

1

No ale to raczej nie ma związku z subklasowaniem. Podejrzewam, że proces z poprzedniego uruchomienia cały czas "wisi" i kompilator nie może utworzyć nowej wersji WindowsProject9.exe. Ubij ten proces, jeśli jest, i próbuj jeszcze raz.

0

Jak przechodzi przez procesor to chyba wszystko ma ze sobą związek. Ewentualnie przeze mnie. Wydawało mi się że wyłączałem program. Kiedyś jak byłem mądry miałem na xp program co pokazywał otworzone uchwyty do plików w systemie. Ale thx spróbuje.
Bo wiesz ja już jak zobaczyłem tą funkcję aboutDlgproc() to napisałem własną edProc - ze switch w środku itp), dałem tam gdzie reszta była, ale nie miałem pojęcia jak to podpiąć. Teraz już udało mi się wcisnąć komunikat do niej do środka i wyświetliło go po interakcji.

1
johnny_Be_good napisał(a):

Dlatego też dałem pojedyńczego "ora" czyli "|" .
Działa.

Nie działa, bo to nie ma matematycznego sensu.

0
Azarien napisał(a):
johnny_Be_good napisał(a):

Dlatego też dałem pojedyńczego "ora" czyli "|" .
Działa.

Nie działa, bo to nie ma matematycznego sensu.


    if ((HWND)lParam == hEdit2) {
        if (message == (INT)WM_LBUTTONUP | (INT)WM_COMMAND) {
            MessageBeep(1);
        }
    }

Działa bo sam słyszę.
2 okna edit, przy naprzemiennym klikaniu na nie jest beep.
Poza tym twórcy vc++ dopuścili taką możliwość bo kompilator kompiluje to.
A jak jesteś głuchy to tego już nie dasz rady zignorować:

if ((HWND)lParam == hEdit2) {
       if (message == (INT)WM_LBUTTONUP | (INT)WM_COMMAND) {
           DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
           MessageBeep(1);
       }
   }

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