detecting a right-click

I wanted to make a program that doesn't have a common windows title bar and that can be dragged by clicking anywhere in the form (winamp style).
So I used the following function :

void __fastcall TForm1::WMNCHitTest(TMessage &Msg)
{
    Msg.Result = HTCAPTION;
}

This funtion traps the WM_NCHITTEST message and by returning HTCAPTION allows the form to be dragged (just like if I clicked in the title bar).
As said in a help file : "The WM_NCHITTEST message is sent to a window when the cursor moves, or when A mouse button is PRESSED or RELEASED ". So the "OnMouse" events don't work anymore. The problem is, I want to detect a right-click in order to show a popup menu and as all the mouse events are trapped by that function, how can I know if a right button was clicked ?

Thanks
wizcoolAsked:
Who is Participating?
 
BeyondWuConnect With a Mentor Commented:
I'm familiar with C++Builder.I use VC.
I think you should not catch the WM_NCHITTEST.(remove it)
void __fastcall TForm1::WMNCHitTest(TMessage &Msg)
{
   Msg.Result = HTCAPTION;
}

you can only catch WM_LBUTTONDOWN, if you want to move the window when the user press the left button.
void __fastcall TForm1::WMLBUTTONDOWN(TMessage &Msg)
{
   //Msg.Result = HTCAPTION;
   ::SendMessage(hThisWnd,WM_NCLBUTTONDOWN,WPARAM(HTCAPTION),MAKELPARAM(x,y));
   // MAKELPARAM(x,y) is the current mouse point.
   // maybe you can find it in the TMessage.
}

Now you can catch the right-click.
0
 
wizcoolAuthor Commented:
I forgot to say that I'm using C++Builder.
0
 
LoungeLizardCommented:
Click on the form, go to the properties box on the left, select (double click) the OnMouseDown event, and then in your code examine the provided objects (Button and Shift) to determine which button was pressed.

BTW, there is an standard way of getting a pop-up menu in C++ Builder, although I can't remember exactly where you find it. I'll look this afternoon and let you know.
0
Upgrade your Question Security!

Your question, your audience. Choose who sees your identity—and your question—with question security.

 
BeyondWuCommented:
Sorry, it should be "I'm not familiar with C++Builder"
0
 
AlexVirochovskyCommented:
1. Usually use next code
void __fastcall TForm1::WMNCHitTest(TMessage &Msg)
{
if(GetAsyncKeyState(VK_LBUTTON)<0)
Msg.Result = HTCAPTION;
else
Msg.Result = HTCLIENT;
}
2. For detect Right click from WMNCHitTest
(or from any other function) you can use
GetAsyncKeyState API:
if (GetAsyncKeyState(VK_RBUTTON)<0 ) //right button?
  {
   ...
  }
0
 
wizcoolAuthor Commented:
Although both BeyondWu's and AlexVirochovsky's solutions worked I can only accept one. So I accepted BeyondWu's because i liked it better and because he also answered first.

Thanks to you all.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.