Allegro.cc - Online Community

Allegro.cc Forums » Allegro Development » win32: detecting double click ?

This thread is locked; no one can reply to it. rss feed Print
win32: detecting double click ?
A J
Member #3,025
December 2002
avatar

in windowed mode i can spy on the WM_LBUTTONDOWN mesages and log when they occur, this gives me suffecient timing information to detect double clicks.

but in fullscreen mode, WM_LBUTTONDOWN messages dont appear to be sent.
how can i detect double clicks ? accurately.
(polling the mouse_b) can not be done accurately.

i'll consider solutions that involve hacking allegro too.. as i think that is the only way its going to happen.

___________________________
The more you talk, the more AJ is right. - ML

piccolo
Member #3,163
January 2003
avatar

1//Mouse.h
2#include "Button.h"
3 
4class Mouse: public MenuObject
5{
6private:
7 
8public:
9 Mouse();
10
11
12 bool is_doubleclick();
13 
14 void draw(BITMAP *bmp);
15};
16Mouse::Mouse()
17{
18 Set_x(mouse_x);
19 Set_y(mouse_y);
20 Set_w(10);
21 Set_h(10);
22}
23void Mouse::draw(BITMAP *bmp)
24{
25 show_mouse(bmp);
26 Set_x( mouse_x);
27 Set_y( mouse_y);
28 drawRectangle(bmp,Get_x(), Get_y(), Get_w(), Get_h(), Get_color(), 0, Get_color());
29 scare_mouse();
30 
31}
32 
33bool Mouse::is_doubleclick()//we can even put the sleep valus as ints in the fuction header for more flex
34{
35 if (mouse_b & 1)
36 {
37 Sleep(75);
38 if (!(mouse_b & 1))
39 {
40 Sleep(50);
41 if (mouse_b & 1)
42 {
43 
44 return true;
45
46 }
47 return false;
48 }
49 return false;
50 }
51 return false;
52}

1 
2#include "Menu.h"
3Menu login;
4 
5int draw_login(BITMAP* bmp)
6{
7 
8 login.buttons[0].Set_lable( " Logon");
9 login.buttons[0].Set_x(login.Get_x()+50);
10 login.buttons[0].Set_y(login.Get_y()+40);
11 login.buttons[0].Set_w(100);
12 login.buttons[0].Set_h(25);
13 login.buttons[1].Set_lable( "Make New");
14 login.buttons[1].Set_x(login.Get_x()+100);
15 login.buttons[1].Set_y(login.Get_y()+110);
16 login.buttons[1].Set_w(100);
17 login.buttons[1].Set_h(25);
18 
19 login.buttons[2].Set_lable( " Exit");
20 login.buttons[2].Set_x(login.Get_x()+100);
21 login.buttons[2].Set_y(login.Get_y()+150);
22 login.buttons[2].Set_w(100);
23 login.buttons[2].Set_h(25);
24 
25 login.textboxs[0].Set_lable( "Enter Uesrname");
26 login.textboxs[0].Set_x(login.Get_x()+160);
27 login.textboxs[0].Set_y(login.Get_y()+20);
28 login.textboxs[0].Set_w(100);
29 login.textboxs[0].Set_h(25);
30 
31 login.textboxs[1].Set_lable( "Enter PassWord");
32 login.textboxs[1].Set_x(login.Get_x()+160);
33 login.textboxs[1].Set_y(login.Get_y()+60);
34 login.textboxs[1].Set_w(100);
35 login.textboxs[1].Set_h(25);
36 
37 login.draw(bmp);
38 
39 login.buttons[0].draw(bmp);
40 login.buttons[1].draw(bmp);
41 login.buttons[2].draw(bmp);
42 
43username = login.textboxs[0].draw(bmp); //returns username
44password = login.textboxs[1].draw(bmp); //returns password
45 
46if (!(mouse_b & 1))
47{
48login.mx = mouse_x;
49login.my = mouse_y;
50}
51 login.mouse[0].draw(bmp);
52 //if (mouse_b & 1)
53 if (login.mouse[0].is_doubleclick())
54 {
55 if(login.is_collision( login.mouse[0]))
56 {
57 if(!login.buttons[0].is_collision( login.mouse[0]))
58 {
59 if(!login.buttons[1].is_collision( login.mouse[0]))
60 {
61 if(!login.textboxs[0].is_collision( login.mouse[0]))
62 {
63 if(!login.textboxs[1].is_collision( login.mouse[0]))
64 {
65
66 //login.Set_x( mouse_x );
67 //login.Set_y( mouse_y );
68 login.mov=mouse_x -login.mx;
69 login.mov2=mouse_y - login.my;
70 login.mx = mouse_x;
71 login.my = mouse_y;
72
73 login.Set_x( login.Get_x()+login.mov);
74 login.Set_y( login.Get_y()+login.mov2);
75
76 login.mov = 0;
77 login.mov2 = 0;
78 //mouse_x = login.mov + login.Get_x();
79 //mouse_y = login.mov2 + login.Get_y();
80 }
81 }
82 }
83 }
84 }
85
86 if(login.buttons[0].is_collision( login.mouse[0]))
87 {
88 login.buttons[0].Set_state(1);
89 //do this buttons stuff login
90 //sub menu get username and password
91 //need to give chances to enter that mean we need sever conection here
92 //contiual on to game
93
94 return 1;
95 }
96 else
97 {
98 login.buttons[0].Set_state(0);
99 }
100 if(login.buttons[1].is_collision( login.mouse[0]))
101 {
102 login.buttons[1].Set_state(1);
103 //do this buttons stuff new acount
104 
105 }
106 else
107 {
108 login.buttons[1].Set_state(0);
109 
110 }
111 
112 if(login.buttons[2].is_collision( login.mouse[0]))
113 {
114 login.buttons[2].Set_state(1);
115 //do this buttons stuff exit
116 return -1;//are you done drawing
117 }
118 else
119 {
120 login.buttons[2].Set_state(0);
121 }
122 
123 if(login.textboxs[0].is_collision( login.mouse[0]))
124 {
125 login.textboxs[0].Set_selceted(true);
126 login.textboxs[1].Set_selceted(false);
127 //username text box has keybord
128 
129 }
130 if(login.textboxs[1].is_collision( login.mouse[0]))
131 {
132 login.textboxs[1].Set_selceted(true);
133 login.textboxs[0].Set_selceted(false);
134 //passWord text box has keybord
135 
136 }
137 
138 }
139return 0; //are you done drawing
140}

wow
-------------------------------
i am who you are not am i

BAF
Member #2,981
December 2002
avatar

That isn't very elegant... sleeping multiple times in the poll function.

Also, why use show_mouse? Just draw_sprite() mouse_sprite to the x/y.

piccolo
Member #3,163
January 2003
avatar

BAF said:

That isn't very elegant... sleeping multiple times in the poll function.

there were 2 other way i thought up but they involve variables . this the best metod out of the tree. plus this can be class independent.

BAF said:

Also, why use show_mouse? Just draw_sprite() mouse_sprite to the x/y.

i am using the defalt mouse sprite. i did not load my own yet. check out my game and write a review if you can please

edit:
http://www.allegro.cc/depot/Thegame

wow
-------------------------------
i am who you are not am i

A J
Member #3,025
December 2002
avatar

picollo, you've missed the point, how can i detect the mouse_b is im busy doing other stuff

___________________________
The more you talk, the more AJ is right. - ML

GullRaDriel
Member #3,861
September 2003
avatar

AJ said:

how can i detect the mouse_b is im busy doing other stuff

héhé use pthread my bad !

"Code is like shit - it only smells if it is not yours"
Allegro Wiki, full of examples and articles !!

piccolo
Member #3,163
January 2003
avatar

is_doubleclick(); put that any where you want to check.

wow
-------------------------------
i am who you are not am i

Arthur Kalliokoski
Second in Command
February 2005
avatar

This is a windows prog? Check out WM_LBUTTONDBLCLK message.

“Throughout history, poverty is the normal condition of man. Advances which permit this norm to be exceeded — here and there, now and then — are the work of an extremely small minority, frequently despised, often condemned, and almost always opposed by all right-thinking people. Whenever this tiny minority is kept from creating, or (as sometimes happens) is driven out of a society, the people then slip back into abject poverty. This is known as "bad luck.”

― Robert A. Heinlein

BAF
Member #2,981
December 2002
avatar

What? That was the problem... it wasn't working for him full screen.

A J
Member #3,025
December 2002
avatar

in windowed mode, i can see the WM_LBUTTON message, but in fullscreen mode i dont.

___________________________
The more you talk, the more AJ is right. - ML

piccolo
Member #3,163
January 2003
avatar

gezzz thouse sleeps are in Milli seconds I'm using 50 50, and it only activates when the mouse is pressed.

wow
-------------------------------
i am who you are not am i

Marco Radaelli
Member #3,028
December 2002
avatar

A bit offtopic: how do you make a window fullscreen? I think that doesn't mean it's maximized.

Maybe that's in some way related to why you're not getting those messages (I suppose you still get WM_CHAR and friends).

A J
Member #3,025
December 2002
avatar

Marco.. i use set_gfx_mode(AUTO_DETECT_FULLSCREEN,

piccolo, it can't sleep, its busy doing other work, like rendering graphics.

___________________________
The more you talk, the more AJ is right. - ML

Milan Mimica
Member #3,877
September 2003
avatar

You'll have to took at allegro source code why messages are not forwarded to you app. My wild guess is that it creates another window to handle input.

Myrdos
Member #1,772
December 2001

I'm not familiar with WM_LBUTTONDOWN, but couldn't you use Allegro's interrupt routines?

http://www.allegro.cc/manual/api/mouse-routines/mouse_callback

You'll need to keep track of the number of MOUSE_FLAG_LEFT_DOWNs you got, with a timer to see if they were sufficiently close together.

__________________________________________________

Go to: