Windows SDK设置控件支持Tab键

在使用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);
        }
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值