Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 13 kết quả

Đề tài: Chuột Phải trên ListBox Ra Menu ???

  1. #1
    Ngày gia nhập
    01 2009
    Bài viết
    201

    Wink Chuột Phải trên ListBox Ra Menu ???

    Các Bạn bày mình cách kích chuột phải trên ListBox là ra Menu đi,rất cảm ơn

  2. #2
    Ngày gia nhập
    11 2008
    Bài viết
    73

    - Bắt sự kiện click chuột phải trên ListBox
    - Mở cái Popup Menu ra.

  3. #3
    Ngày gia nhập
    01 2009
    Bài viết
    201

    Cảm ơn bạn VAT nhiều nhé ,bạn có thể cho mình biết rõ hơn về cái
    - Mở cái Popup Menu ra.
    được không

  4. #4
    Ngày gia nhập
    11 2008
    Bài viết
    73

    Bạn dùng PreTranslateMessage của CDialog để làm .

    Chi tiết như sau :

    Code:
    BOOL CMenuPopupDlg::PreTranslateMessage(MSG* pMsg)
    {
    	if (pMsg->message==WM_RBUTTONDOWN)
    	{
    		CWnd* pWnd=(CWnd*)GetDlgItem(IDC_LIST1);
    		CRect lpRect;
    		pWnd->GetWindowRect(&lpRect); //Lay toa do cua IDC_LIST1 
    		
    		if (pWnd==GetFocus()) 
    // Xác định xem đã chọn  IDC_LIST 1 chưa
    		if (((pMsg->pt.x >= lpRect.left)&& (pMsg->pt.y >=lpRect.top)) && ((pMsg->pt.x <=lpRect.right)&&(pMsg->pt.y <=lpRect.bottom)))
    // Xem tọa độ của con chuột có nằm trong vùng IDC_LIST1 không 
    		{
    //Nếu có thì bật Popup menu lên //
    			CMenu menu;
    			menu.LoadMenu(IDR_MENU1);
    //Lấy menu con đầu tiên trong IDR_MENU1 làm Popup Menu 
    			CMenu* menuPopup =menu.GetSubMenu(0); 			
    // Gọi Popup menu 
    menuPopup->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON,pMsg->pt.x, pMsg->pt.y, this);
    			menuPopup->DestroyMenu();
    			return TRUE;
    		}
    	}
    	return CDialog::PreTranslateMessage(pMsg);
    }

  5. #5
    Ngày gia nhập
    10 2006
    Nơi ở
    In Your Bugs
    Bài viết
    823

    Không nên lạm dụng hàm preTranslateMessage trừ các trường hợp không thể không.

    Nếu bình nhớ ko lầm thì trong ListBox có phát sinh sự kiện gì đó ...RIGHTCLICK, bạn nên handle sự kiện này.

  6. #6
    Ngày gia nhập
    11 2008
    Bài viết
    73

    Mặc định Chuột Phải trên ListBox Ra Menu ???

    Trong trường hợp với LISTBOX thì mình chưa tìm được giải pháp tốt hơn.
    Trong LISTBOX không có handler RightClick .

  7. #7
    Ngày gia nhập
    10 2006
    Nơi ở
    In Your Bugs
    Bài viết
    823

    uhm, bạn xem sự kiện mousedown ( hoặc mouseup) từ đó quyết định là left hay right để xử lí.

    Dĩ nhiên cách của bạn giải quyết được bài toán này, nhưng mình chỉ nghĩ là nên tránh đến mức thấp nhất.

  8. #8
    Ngày gia nhập
    11 2008
    Bài viết
    73

    Không dùng tới hàm PreTranslateMessage thì ta có thể subclass cái ListBox control để thực hiện .

    Code như sau :
    1) Tạo một Class name: CNewListBox dựa trên CListBox
    2) Trong file NewListBox.h
    Code:
    #pragma once
    #include "afxwin.h" // Cái này phải thêm vào
    
    // CNewListBox
    
    class CNewListBox : public CListBox
    {
    	DECLARE_DYNAMIC(CNewListBox)
    
    public:
    	CNewListBox();
    	virtual ~CNewListBox();
    ////// Code them vao o duoi //////////////
    
    	virtual void PreSubclassWindow();
    	afx_msg void OnRButtonDown(UINT  nFlags, CPoint point); 
    
    ////////////////////////////////////////////////////
    protected:
    	DECLARE_MESSAGE_MAP()
    };
    Chú giải :
    - Hàm PreSubclassWindow() bắt buộc phải có trước khi muốn subclass một control nào đó.
    - Hàm OnRButtonDown là của lớp cơ bản CWnd dùng để bắt các sự kiện click chuột phải xuống

    3) Trong file NewListBox.cpp
    Code:
    #include "stdafx.h"
    #include "ListBoxExtend.h"
    #include "NewListBox.h"
    
    
    // CNewListBox
    
    IMPLEMENT_DYNAMIC(CNewListBox, CListBox)
    
    CNewListBox::CListBoxEx()
    {
    
    }
    
    CNewListBox::~CListBoxEx()
    {
    }
    
    
    BEGIN_MESSAGE_MAP(CNewListBox, CListBox)
    // Code thêm vào ở dưới///
    	ON_WM_RBUTTONDOWN()  
    
    /////////////////////////////////////
    END_MESSAGE_MAP()
    
    
    void CNewListBox::PreSubclassWindow()
    {
    	CListBox::PreSubclassWindow();
    }
    void CNewListBox::OnRButtonDown(UINT nFlags, CPoint point)
    {
    if (nFlags==MK_RBUTTON)
    MessageBox(_T("Click chuot phai"),_T("Thong bao"),MB_OK);
    
    }
    Chú giải :
    - ON_WM_RBUTTONDOWN() : Là message handler cho sự kiện nhấn chuột phải xuống (Tham khảo ở MSDN)

    4) Sử dụng :
    - Khai báo : CNewListBox m_ListBox
    - Trong OnInitDialog() thêm vào :

    Code:
    m_ListBox.SubclassDlgItem(IDC_LIST1,this);

  9. #9
    Ngày gia nhập
    10 2006
    Nơi ở
    In Your Bugs
    Bài viết
    823

    Còn 1 cách cuối cùng ( theo mình biết ) để giải quyết bài này,
    Hay là cậu nói luôn đi ( à làm cái tuts rồi tổng hợp lại cho nó xôm tụ, lâu lắm rồi CViet chưa có bài thảo luận nào ra hồn )


    1. PreTranslateMsg
    2. MouseDown
    3. Subclass
    4. Inherit

  10. #10
    Ngày gia nhập
    01 2009
    Bài viết
    89

    @AdminPro:

    Cái này bạn thử xem cách của mình xem:
    http://forums.congdongcviet.com/show...1&postcount=10

Các đề tài tương tự

  1. Tạo Menu khi click phải chuột trên C#?
    Gửi bởi thanh_it trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 6
    Bài viết cuối: 08-04-2016, 04:52 PM
  2. Gắn ứng dụng C# vào menu chuột phải của Windows
    Gửi bởi nqthanh trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 7
    Bài viết cuối: 22-06-2009, 10:47 AM
  3. Cách add ứng dụng vào menu chuột phải
    Gửi bởi vinhhy trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 1
    Bài viết cuối: 01-06-2009, 01:19 PM
  4. Cách Tạo sự kiện chuột phải trên ListBox ???
    Gửi bởi AdminPro trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 4
    Bài viết cuối: 12-04-2009, 04:59 PM
  5. Lấy đường dẫn từ menu chuột phải
    Gửi bởi AdminPro trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 6
    Bài viết cuối: 24-03-2009, 11:03 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn