
I mean, I want a small popup-menu to occur when I click with RMB on some item from the list (say, 'Collection'). The problem is that normally Combo ListBox doesn't react on any button other than LMB (which selects certain item and closes ListBox).
Someone told me that I should 'subclass the ComboBox, then subclass the Combo ListBox on WM_CTLCOLORLISTBOX'. Then I could 'catch' RMB clicks. So I subclassed the ComboBox - see the code below. But now I am stuck.
I don't know how to subclass the ListBox on WM_CTLCOLORLISTBOX. What should be written in place of ???,???,??? (in code below)? How should ListBox Window Procedure (on_listbox_hook) look like - what should it return?
Maybe someone can help me
CODE
class playlists_dropdown : public uie::container_ui_extension
{
WNDPROC m_combobox_proc;
protected:
HWND m_hWnd; // <-- handle to my ComboBox window
public:
LRESULT on_message(HWND wnd, UINT msg, WPARAM wp, LPARAM lp);
LRESULT on_hook(HWND wnd, UINT msg, WPARAM wp, LPARAM lp);
static LRESULT WINAPI hook_proc(HWND wnd, UINT msg, WPARAM wp, LPARAM lp);
}
LRESULT playlists_dropdown::on_message(HWND wnd, UINT msg, WPARAM wp, LPARAM lp)
{
switch (msg) {
case WM_CREATE:
{
m_hWnd = CreateWindowEx(0, WC_COMBOBOX, 0, CBS_DROPDOWNLIST ... );
SetWindowLongPtr(m_hWnd, GWL_USERDATA, (LPARAM) (this));
m_combobox_proc = (WNDPROC) SetWindowLongPtr(m_hWnd, GWL_WNDPROC, (LPARAM) (hook_proc));
}
break;
}
return DefWindowProc(wnd, msg, wp, lp);
}
LRESULT WINAPI playlists_dropdown::hook_proc(HWND wnd, UINT msg, WPARAM wp, LPARAM lp)
{
playlists_dropdown * p_this;
p_this = reinterpret_cast< playlists_dropdown * >(GetWindowLongPtr(wnd, GWL_USERDATA));
LRESULT rv = p_this ? p_this->on_hook(wnd, msg, wp, lp) : DefWindowProc(wnd, msg, wp, lp);
return rv;
}
LRESULT playlists_dropdown::on_hook(HWND wnd, UINT msg, WPARAM wp, LPARAM lp)
{
switch (msg) {
case WM_CTLCOLORLISTBOX:
{
/* ??? */
/* ??? */
/* ??? */
}
break;
}
return CallWindowProc(m_combobox_proc, wnd, msg, wp, lp);
}
/* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= */
LRESULT playlists_dropdown::on_listbox_hook(HWND wnd, UINT msg, WPARAM wp, LPARAM lp)
{
switch (msg) {
case WM_RBUTTONUP:
{
/* Show popup-menu */
}
break;
}
return /* ?????? */
}
/* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= */
{
WNDPROC m_combobox_proc;
protected:
HWND m_hWnd; // <-- handle to my ComboBox window
public:
LRESULT on_message(HWND wnd, UINT msg, WPARAM wp, LPARAM lp);
LRESULT on_hook(HWND wnd, UINT msg, WPARAM wp, LPARAM lp);
static LRESULT WINAPI hook_proc(HWND wnd, UINT msg, WPARAM wp, LPARAM lp);
}
LRESULT playlists_dropdown::on_message(HWND wnd, UINT msg, WPARAM wp, LPARAM lp)
{
switch (msg) {
case WM_CREATE:
{
m_hWnd = CreateWindowEx(0, WC_COMBOBOX, 0, CBS_DROPDOWNLIST ... );
SetWindowLongPtr(m_hWnd, GWL_USERDATA, (LPARAM) (this));
m_combobox_proc = (WNDPROC) SetWindowLongPtr(m_hWnd, GWL_WNDPROC, (LPARAM) (hook_proc));
}
break;
}
return DefWindowProc(wnd, msg, wp, lp);
}
LRESULT WINAPI playlists_dropdown::hook_proc(HWND wnd, UINT msg, WPARAM wp, LPARAM lp)
{
playlists_dropdown * p_this;
p_this = reinterpret_cast< playlists_dropdown * >(GetWindowLongPtr(wnd, GWL_USERDATA));
LRESULT rv = p_this ? p_this->on_hook(wnd, msg, wp, lp) : DefWindowProc(wnd, msg, wp, lp);
return rv;
}
LRESULT playlists_dropdown::on_hook(HWND wnd, UINT msg, WPARAM wp, LPARAM lp)
{
switch (msg) {
case WM_CTLCOLORLISTBOX:
{
/* ??? */
/* ??? */
/* ??? */
}
break;
}
return CallWindowProc(m_combobox_proc, wnd, msg, wp, lp);
}
/* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= */
LRESULT playlists_dropdown::on_listbox_hook(HWND wnd, UINT msg, WPARAM wp, LPARAM lp)
{
switch (msg) {
case WM_RBUTTONUP:
{
/* Show popup-menu */
}
break;
}
return /* ?????? */
}
/* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= */
