Windows SDK设置控件支持Tab键

来源:互联网 发布:巨星知我心txt百度云 编辑:程序博客网 时间:2024/06/06 14:27

在使用windows api编程时,若是页面有很多编辑框EDIT,那么,能否支持Tab键将会很影响用户体验。。

我在使用codeblocks写Win32GUI工程时,建立了一个Frame Based的项目,然后进行编程,创建了一堆的Edit控件,代码如下:

Hwnd_EDIT_Set_IP=CreateWindow(TEXT("EDIT"),TEXT(""),WS_CHILD | WS_BORDER|WS_TABSTOP,290,45,                                  90,20,hwnd,(HMENU)ID_Common,((LPCREATESTRUCT) lParam)->hInstance,NULL);Hwnd_EDIT_Set_DB=CreateWindow(TEXT("EDIT"),TEXT(""),WS_CHILD | WS_BORDER|WS_TABSTOP,290,75,                                  90,20,hwnd,(HMENU)ID_Common,((LPCREATESTRUCT) lParam)->hInstance,NULL);Hwnd_EDIT_Set_User=CreateWindow(TEXT("EDIT"),TEXT(""),WS_CHILD | WS_BORDER|WS_TABSTOP,290,105,                                    90,20,hwnd,(HMENU)ID_Common,((LPCREATESTRUCT) lParam)->hInstance,NULL);Hwnd_EDIT_Set_Pass=CreateWindow(TEXT("EDIT"),TEXT(""),WS_CHILD | WS_BORDER|WS_TABSTOP,290,135,                                    90,20,hwnd,(HMENU)ID_Common,((LPCREATESTRUCT) lParam)->hInstance,NULL);Hwnd_EDIT_Set_Interval=CreateWindow(TEXT("EDIT"),TEXT(""),WS_CHILD | WS_BORDER|WS_TABSTOP,290,165,                                        90,20,hwnd,(HMENU)ID_Common,((LPCREATESTRUCT) lParam)->hInstance,NULL);

很明显,为了使控件支持Tab键,在用CreateWindow创建控件时,必须在窗体风格参数dwStyle上指定WS_TABSTOP风格。。。

可是,一旦debug就发现,程序依然不响应Tab键。。。

解决方案:

虽然指定了WS_TABSTOP风格,但是,如果要程序响应Tab键,则必须要操作系统向程序发送Tab键指令啊。。。问题就处在这里了,对于FrameBased应用项目来说(DialogBased没有试过),正常情况下,你的Tab键消息被操作系统给拦截了,所以即使你指定了WS_TABSTOP风格,程序依然不会响应。

为了解决这个问题,需要在WinMain函数中,窗口进入消息循环时添加一句代码,让操作系统不拦截消息。。。代码如下:

while (GetMessage (&messages, NULL, 0, 0))    {        if(!IsDialogMessage(hwnd,&messages))//这一句是必要的,必须添加        {            /* Translate virtual-key messages into character messages */            TranslateMessage(&messages);            /* Send message to WindowProcedure */            DispatchMessage(&messages);        }    }

需要注意的是:上面这样进行操作后,会导致有些消息无法被传入消息处理函数,例如WM_KEYDOWN消息,将直接被操作系统拦截了,导致消息处理函数中关于按键消息的函数响应失败~正确的做法最好如下:

while (GetMessage (&messages, NULL, 0, 0))    {        if(!IsDialogMessage(hwnd,&messages))        {            /* Translate virtual-key messages into character messages */            TranslateMessage(&messages);            /* Send message to WindowProcedure */            DispatchMessage(&messages);        }        else        {            TranslateMessage(&messages);            DispatchMessage(&messages);        }    }


原创粉丝点击