2009-02-06 19 views
5

Tôi có một cửa sổ để xử lý các tin nhắn WM_NCLBUTTONUP, để xử lý các nhấp chuột trên các nút tùy chỉnh trên thanh phụ đề. Điều này làm việc tuyệt vời khi cửa sổ được phóng to, nhưng khi nó không được, thông báo WM_NCLBUTTONUP sẽ không bao giờ xuất hiện! Tôi nhận được một tin nhắn WM_NCLBUTTONDOWN mặc dù. Kỳ lạ WM_NCLBUTTONUP sẽ đến nếu tôi nhấp vào bên phải của thanh trình đơn, nhưng bất cứ nơi nào dọc theo thanh phụ đề/khung cửa sổ, tin nhắn không bao giờ đến.Vấn đề tò mò về thông báo WM_NCLBUTTONUP bị thiếu khi cửa sổ không được tối đa

Sau một thời gian gỡ lỗi, tôi phát hiện ra rằng nếu tôi đặt điểm ngắt trên CMainFrame :: OnNcLButtonDown(), hãy nhấp vào thanh phụ đề, nhưng giữ nút chuột được giữ lại, để trình gỡ lỗi ngắt trong hàm, nhấn F5 để tiếp tục gỡ lỗi, sau đó thả nút chuột - kỳ diệu WM_NCLBUTTONUP được gửi !!

Câu hỏi của tôi là hai lần, (1) điều gì đang xảy ra? (2) làm thế nào để tôi có được xung quanh vấn đề này "".

Tôi cũng lưu ý rằng có một số người khác trên internet có cùng vấn đề (Google nhanh chóng tiết lộ rất nhiều người khác có cùng vấn đề nhưng không có giải pháp).

Sửa
Cám ơn hai trả lời đầu tiên, tôi đã cố gắng gọi ReleaseCapture trong NCLButtonDown, nhưng nó không có hiệu lực thi hành (trong thực tế, nó trả về NULL, cho thấy ảnh chụp không được đặt ra). Tôi chỉ có thể giả định rằng các lớp cơ sở (def window proc) chức năng có thể thiết lập một nắm bắt. Tôi sẽ điều tra vào thứ hai ...

Trả lời

4

Tôi đã gặp vấn đề tương tự. Vấn đề thực sự là một nút bấm trái trên chú thích cửa sổ bắt đầu một kéo, và do đó chụp chuột, ngăn ngừa WM_NCLBUTTONUP từ khi đến.

Giải pháp là để ghi đè WM_NCHITTEST:

LRESULT CALLBACK WndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam) 
{ 
    switch (nMsg) 
    { 
     ... 
     case WM_NCHITTEST: 
      Point p(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam); 
      ScreenToClient(p); 
      if (myButtonRect.Contains(p)) 
      { 
       return HTBORDER; 
      } 
      break; 
    } 
    return DefWindowProc(hWnd, nMsg, wParam, lParam); 
} 

Vì vậy, về cơ bản bạn thông báo cho Windows biết rằng khu vực bị chiếm đóng bởi nút bấm của bạn không phải là một phần của chú thích cửa sổ, nhưng một phần không đặc hiệu của khu vực phi-client (HTBORDER).

Chú thích: Nếu bạn đã gọi SetCapture() và chưa được gọi là ReleaseCapture() khi bạn mong đợi thông báo WM_NCLBUTTONDOWN đến, nó sẽ không đến ngay cả với thay đổi ở trên. Điều này có thể gây khó chịu vì việc giữ chuột trong khi tương tác với các nút tùy chỉnh như vậy là bình thường để bạn có thể hủy nhấp/đánh dấu nếu con chuột rời khỏi cửa sổ. Tuy nhiên, để thay thế cho việc sử dụng capture, bạn có thể xem xét SetTimer()/KillTimer() với khoảng thời gian ngắn (ví dụ 100 ms), điều này sẽ không làm cho các tin nhắn WM_NCLBUTTONUP biến mất.

2

Một dự đoán hoang dã - một số mã đang chụp chuột, có thể để tạo thuận lợi cho việc di chuyển cửa sổ khi bạn lấy tiêu đề. Điều đó sẽ giải thích lý do tại sao việc phá vỡ trình gỡ rối sẽ làm cho thông báo hiển thị - tương tác của trình gỡ lỗi đang xóa thao tác chụp chuột.

Tôi khuyên bạn nên chạy Spy ++ trên cửa sổ đó và đó là trẻ em và cố gắng tìm ra ai nhận được thông báo nút lên.

Cách khắc phục - không thể giúp bạn ở đó mà không cần nhìn vào mã thực. Bạn sẽ phải tìm ra thủ phạm là ai và nhìn vào mã của họ.

1

Để thêm vào Franci Penov's answer, nhấp chuột trên thanh tiêu đề được hiểu là bắt đầu kéo để đặt lại vị trí cửa sổ. Cửa sổ đang chụp chuột để nó có thể thực hiện thao tác kéo. Vì không thể kéo cửa sổ tối đa, việc chụp sẽ bị bỏ qua và thông báo sẽ chuyển sang bình thường.

1

bao gồm ReleaseCapture() trong WM_NCLBUTTONDOWN {khối mã}

Các vấn đề liên quan