更新时间:2016-01-10 19:18:32浏览次数:1+次
你不要被系统的各种规定所限制。既然我们学的深入了,就要灵活应用。没有CS_DBLCLKS窗口类风格,系统不会将双击的消息投递到我们的窗口消息队列中。这个意思就是,即使系统检测到了双击,也不理睬。这个过程包含了两个步骤:第一,系统要检测鼠标在客户区的双击;第二,系统还要将WM_LBUTTONDBLCLK发送到窗口的消息队列。下面用一张图简要的展示了这个过程。
SendMessage(hwnd,WM_LBUTTONDBLCLK,wParam,lParam);
第一个参数就是本窗口的句柄;第二个就是消息的宏WM_LBUTTONDBLCLK,指示消息类型;第三个和第四个参数含带的信息,如果你双击时不需要,可以都填成NULL。如果处理双击消息时需要,那就将单击时的参数直接传给它就行了,也就是上面显示的那样。而且单击和双击的参数都是一样的,所以直接传给双击消息也是可以的。这种情况,看下图所示的序列:
#include "windows.h"
#include <tchar.h>
TCHAR tip[]=_T("C++技术网www.cjjjs.com");
// - 项目是Unicode字符集
LRESULT CALLBACK WinProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
static LONG LastClickTime=0;//初始化为0,便于第一次单击检测
switch (message)
{
case WM_LBUTTONDOWN:
{
LONG lNow = GetMessageTime();//获取当前消息产生的时间,以毫秒为单位
if (LastClickTime==0)
{
LastClickTime=lNow;//第一次单击设置时间
}
else
{
int iMs = lNow-LastClickTime;//计算时间间隔
if (iMs<500)
{
//检测两次单击时间间隔在指定的范围内,发送双击消息(产生真正的双击消息,而不是程序模拟一个双击逻辑判断哦)
SendMessage(hwnd,WM_LBUTTONDBLCLK,wParam,lParam);
LastClickTime=0;//重置时间,便于下次双击使用
}
else
{
LastClickTime=lNow;//未产生双击消息,则更新当前的上一次单击的时间
}
}
}
return 0;
case WM_LBUTTONDBLCLK:
if(IsZoomed(hwnd))//-判断窗口是不是最大化了
ShowWindow(hwnd, SW_SHOWNORMAL);// - 显示正常大小的窗口
else
ShowWindow(hwnd, SW_SHOWMAXIMIZED);// - 最大化窗口
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
break;//跳出到默认处理
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrev,LPSTR lpCmd,int iShow)
{
TCHAR ClassName[] = _T("MyClass");
TCHAR title1[] = _T("C++技术网http://www.cjjjs.com");
WNDCLASS wndClass;
wndClass.cbClsExtra=0;
wndClass.cbWndExtra=0;
wndClass.hbrBackground= (HBRUSH)GetStockObject(WHITE_BRUSH);
wndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndClass.hInstance = hInstance;
wndClass.lpfnWndProc = WinProc;
wndClass.lpszClassName = ClassName;
wndClass.lpszMenuName=NULL;
wndClass.style=CS_HREDRAW|CS_VREDRAW;
if(!RegisterClass(&wndClass))return 0;
HWND hwnd = CreateWindow(ClassName,title1,WS_OVERLAPPEDWINDOW,0,0,350,400,NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,SW_SHOWNORMAL);
MSG msg;
while (GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
相关资讯