WM_RBUTTONDOWN

01/04/2004 - 13:36 por Sergio | Informe spam
Buenas,

Tengo una lista dinámica y uno de los miembroe de la lista es un botón.
Necesito capturar el click sobre el boton con el boton derecho del
raton. He intentado hacer lo siguiente en la función PreTranslateMsg

<->
...
switch (pMsg->message) {
...
case WM_RBUTTONDOWN:
bot = (CButton*) GetFocus(); //bot es un CButton* declarado antes
id = bot->GetDlgCtrlID(); //id es un UINT declarado antes
if (id >= IDC_MIN && id <= IDC_MAX) {
...
}
...
<->


Pero no hay manera, el id no es el valor correcto, en cambio si el
mensaje es WM_LBUTTONDOWN funciona sin problemas.

Alguna sugerencia?

Preguntas similare

Leer las respuestas

#1 Sergio
01/04/2004 - 13:54 | Informe spam
Sergio escribió:
Buenas,

Tengo una lista dinámica y uno de los miembroe de la lista es un botón.
Necesito capturar el click sobre el boton con el boton derecho del
raton. He intentado hacer lo siguiente en la función PreTranslateMsg

<->
...
switch (pMsg->message) {
...
case WM_RBUTTONDOWN:
bot = (CButton*) GetFocus(); //bot es un CButton* declarado antes
id = bot->GetDlgCtrlID(); //id es un UINT declarado antes
if (id >= IDC_MIN && id <= IDC_MAX) {
...
}
...
<->


Pero no hay manera, el id no es el valor correcto, en cambio si el
mensaje es WM_LBUTTONDOWN funciona sin problemas.

Alguna sugerencia?



Vale ya se que el problema es que el boton nunca recibe el foco. Asi que
como hace que un boton reciba el foco cuando se pulsa sobre el con el
botón derecho del raton?
Respuesta Responder a este mensaje
#2 Cholo Lennon
01/04/2004 - 21:03 | Informe spam
Deriva tu propia clase botón de CButton. Maneja ahí el mensaje
WM_RBUTTONDOWN.

Saludos
Cholo Lennon
Salta, ARG
Respuesta Responder a este mensaje
#3 Sergio
02/04/2004 - 08:55 | Informe spam
Cholo Lennon escribió:
Deriva tu propia clase botón de CButton. Maneja ahí el mensaje
WM_RBUTTONDOWN.



Ok, ya lo tengo, pero ahora me surge un problema

Derivando WM_RBUTTONDOWN hago SetFocus(), lo cual me permite saber desde
la vista el id del botón que ha sido pulsado, el problema esta en que
luego cada vez que hago click con el botón derecho del raton sobre
cualquier otro elemento de la vista que no haya sido derivado, me
devuelve el id del último boton pulsado. He pueso SetFocus() después la
llamada que responde al botón, pero no hay manera, no consigo que la
vista reciba el foco, y deje de reaccionar.
Respuesta Responder a este mensaje
#4 Cholo Lennon
02/04/2004 - 22:38 | Informe spam
Existe varias soluciones. Aquí va una:

Tu propia clase botón implementa WM_RBUTTONDOWN. El código de implementación
notifica al padre (el diálogo, vista o lo que sea que lo contiene) que ha
sido pulsado el botón derecho. Esta notificación es mediante un mensaje del
usuario. Uno de los parámetros del mensaje es el ID del botón sobre el que
se ha pulsado:

#define WM_RIGHTCLICK (WM_USER + 1)

class CMyButton : public CButton
{
// ...

// Generated message map functions
protected:
//{{AFX_MSG(CMyButton)
// ...
afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
//}}AFX_MSG

// ...

};
-

// ...
void CMyButton::OnRButtonDown(UINT nFlags, CPoint point)
{
GetParent()->SendNotifyMessage(WM_RIGHTCLICK, GetDlgCtrlID(), 0);
CButton::OnRButtonDown(nFlags, point);
}
// ...
-

- MyButtonDlg.h -
#include "MyButton.h"

class CMyButtonDlg : public CDialog
{
public:
// ...

// Dialog Data
//{{AFX_DATA(CMyButtonDlg)
enum { IDD = IDD_MYBUTTON_DIALOG };
CMyButton m_btn1;
CMyButton m_btn2;
//}}AFX_DATA

// Generated message map functions
//{{AFX_MSG(CMyButtonDlg)
// ...
afx_msg LRESULT OnRightClick(WPARAM nCtrlID, LPARAM);
//}}AFX_MSG

// ...
};

// ...

- MyButtonDlg.cpp -
// ...
BEGIN_MESSAGE_MAP(CMyButtonDlg, CDialog)
//{{AFX_MSG_MAP(CMyButtonDlg)
// ...
ON_MESSAGE(WM_RIGHTCLICK, OnRightClick)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

LRESULT CMyButtonDlg::OnRightClick(WPARAM nCtrlID, LPARAM)
{
TRACE("Control %u", nCtrlID);
return 0;
}

// ...

-


Saludos
Cholo Lennon
Salta, ARG
Respuesta Responder a este mensaje
#5 Sergio
05/04/2004 - 09:50 | Informe spam
Muchas gracias por tu ayuda, ahora funciona perfectamente
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida