2011-08-04 31 views
7

Tôi đang sử dụng Windows Forms trong C#.Kích hoạt một nút mẫu và nút xử lý cùng một lúc?

Tôi có một biểu mẫu chính với một vài thanh công cụ có chứa toolStripButtons. Sau khi làm việc với biểu mẫu khác có chứa dữ liệu, biểu mẫu chính mất tiêu điểm và nhấp vào một toolStripButton không kích hoạt sự kiện OnClick: nhấp chuột đầu tiên kích hoạt biểu mẫu chính và chỉ lần nhấp thứ hai thực sự nhấn nút. Tôi cần người dùng nhấp vào một nút chỉ một lần để kích hoạt sự kiện Nhấp, mọi ý tưởng về cách thực hiện điều đó? Cảm ơn.

Ghi chú:

  • Tôi đã sử dụng MDI và không có vấn đề cách nhấp vào nút hình thức của cha mẹ. Nhưng bây giờ điều tối quan trọng là có các biểu mẫu tự do trôi nổi trên nhiều màn hình.
  • Các biểu mẫu công nhân có hình thức chính là tài sản Chủ sở hữu, theo cách này họ ở trên đầu trang của biểu mẫu chính.
  • Khi tôi nhấp vào nút của biểu mẫu không hoạt động, không có MouseHover, MouseEnter, MouseDown hoặc MouseUp cháy. Nó chỉ là sự kiện kích hoạt của biểu mẫu chính kích hoạt.
  • Có một treeView (bên trong một tabControl, bên trong một splitContainer, bên trong một bảng điều khiển), trên biểu mẫu chính. Các mục của nó được chọn khi nhấp chuột đầu tiên, ngay cả khi biểu mẫu chính không hoạt động. Tôi đoán không phải tất cả các điều khiển đều bình đẳng!

Trả lời

6

Những gì bạn cần làm là tạo một lớp kế thừa ToolStrip và xử lý WndProc. Đây là một cách để làm điều đó. Co nhung nguoi khac.

private class MyToolStrip : ToolStrip 
{ 
    private const uint WM_LBUTTONDOWN = 0x201; 
    private const uint WM_LBUTTONUP = 0x202; 

    private static bool down = false; 

    protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == WM_LBUTTONUP && !down) 
     { 
      m.Msg = (int)WM_LBUTTONDOWN; 
      base.WndProc(ref m); 
      m.Msg = (int)WM_LBUTTONUP; 
     } 

     if (m.Msg == WM_LBUTTONDOWN) down = true; 
     if (m.Msg == WM_LBUTTONUP) down = false; 
     base.WndProc(ref m); 
    } 
} 

Tôi cũng đã nhìn thấy giải pháp này:

protected override void WndProc(ref Message m) 
{ 
    // WM_MOUSEACTIVATE = 0x21 
    if (m.Msg == WM_MOUSEACTIVATE && this.CanFocus && !this.Focused) 
     this.Focus(); 
    base.WndProc(ref m); 
} 

Tôi chạy vào này ở nơi cuối cùng tôi làm việc, tôi nghĩ rằng giải pháp tôi đã đưa ra làm việc nhiều như sau này, nhưng tôi don không có quyền truy cập vào mã chính xác mà tôi đã sử dụng.

+2

Tôi đang sử dụng giải pháp thứ hai và nó hoạt động tuyệt vời. Cảm ơn bạn! –

+0

Chỉ cần một lưu ý, nó phải là base.WndProc (ref m); –

+0

Xin lỗi, tôi đã tự động chuyển mã đó từ VB. Tôi sẽ sửa chữa nó. – dwidel

-4

nếu u có mẫu không biên giới, vì vậy logic này đã làm việc cho bạn xây dựng vào :)

form.FormBorderStyle = FormBorderStyle.None 
+4

Câu trả lời của bạn dường như không liên quan gì đến câu hỏi. – LarsTech

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