リストボックスにおいて現在選択されている項目上における右クリックやホイールクリックを通知する拡張です。
//ヘッダー部
#define LBN_RCLK 10 //こららのIDによる安全性は保証できません。他のイベントと混信したり将来他の機能に使用される可能性があります。
#define LBN_MCLK 11
#define ON_LBN_RCLK(id, memberFxn) \
ON_CONTROL(LBN_RCLK, id, memberFxn)
#define ON_LBN_MCLK(id, memberFxn) \
ON_CONTROL(LBN_MCLK, id, memberFxn)
// CClickableListBox
class CClickableListBox : public CListBox
{
//抜粋
afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
afx_msg void OnMButtonDown(UINT nFlags, CPoint point);
};
//ソース部(抜粋)
BEGIN_MESSAGE_MAP(CClickableListBox, CListBox)
ON_WM_RBUTTONDOWN()
ON_WM_MBUTTONDOWN()
END_MESSAGE_MAP()
void CClickableListBox::OnRButtonDown(UINT nFlags, CPoint point)
{
BOOL isOutside;
UINT mousePos = this->ItemFromPoint(point, isOutside);
UINT curSel = this->GetCurSel();
if(!isOutside && mousePos == curSel)
{
DWORD H = DWORD(LBN_RCLK) << 16;
DWORD L = DWORD( this->GetDlgCtrlID() );
WPARAM wParam = H + L;
this->GetParent()->SendMessage(WM_COMMAND, wParam, (LPARAM)this->GetSafeHwnd());
}
CListBox::OnRButtonDown(nFlags, point);
}
void CClickableListBox::OnMButtonDown(UINT nFlags, CPoint point)
{
BOOL isOutside;
UINT mousePos = this->ItemFromPoint(point, isOutside);
UINT curSel = this->GetCurSel();
if(!isOutside && mousePos == curSel)
{
DWORD H = DWORD(LBN_MCLK) << 16;
DWORD L = DWORD( this->GetDlgCtrlID() );
WPARAM wParam = H + L;
this->GetParent()->SendMessage(WM_COMMAND, wParam, (LPARAM)this->GetSafeHwnd());
}
CListBox::OnMButtonDown(nFlags, point);
}
//サンプル
//親ダイアログ CSampleDlg
//リストボックスのID IDC_CLICK_LIST
BEGIN_MESSAGE_MAP(CSampleDlg, CDialog)
ON_LBN_SELCHANGE(IDC_CLICK_LIST, &CSampleDlg::OnLbnSelchangeClickList) //既存のイベント
ON_LBN_DBLCLK(IDC_CLICK_LIST, &CSampleDlg::OnLbnDblclkClickList) //既存のイベント
ON_LBN_RCLK(IDC_CLICK_LIST, &CSampleDlg::OnLbnRclkClickList) //拡張イベント
ON_LBN_MCLK(IDC_CLICK_LIST, &CSampleDlg::OnLbnMclkClickList) //拡張イベント
END_MESSAGE_MAP()
//サブクラス化
void CSampleDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_CLICK_LIST1, m_ClickList);
}
void CSampleDlg::OnLbnSelchangeClickList()
{
// TODO: Add your control notification handler code here
}
void CSmapleDlg::OnLbnDblclkClickList()
{
// TODO: Add your control notification handler code here
}
void CSmapleDlg::OnLbnRclkClickList()
{
// TODO: Add your control notification handler code here
}
void CSmapleDlg::OnLbnMclkClickList()
{
// TODO: Add your control notification handler code here
}

コメントをかく