EnableWindow函数"失效"的解决办法!!!

例子:

单击按钮后,先使用EnableWindow函数禁止按钮接收鼠标消息键盘消息。然后执行长时间操作最后使用EnableWindow函数允许按钮接收鼠标消息键盘消息。以此来防止用户多次单击按钮

但是,按照以上思路在使用EnableWindow函数的过程中会造成EnableWindow函数"失效",而造成多次单击按钮的现象。

 

原因:

使用EnableWindow函数禁用按钮,在线程执行长时间操作的过程中未能及时处理EnableWindow函数产生的消息,且此时用户多次单击按钮,在最后使用EnableWindow函数启用按钮,系统会将之前未处理的WM_LBUTTONDOWN与WM_LBUTTONUP消息插入线程消息队列。因此,造成了多次单击按钮的现象。

 

解决办法以下两种:

1、在执行长时间操作,先处理EnableWindow函数产生的消息

2、长时间操作完成后,使用PeekMessage函数删除按钮所有的WM_LBUTTONDOWN消息

 

代码如下:

以下仅列出办法2的代码

LRESULT CALLBACK LoginWindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
    MSG msg;

    switch(uMsg)
    {
    .
    .
    .
    case WM_COMMAND:
        {
            switch(LOWORD(wParam))
            {
            case BUTTON_ID:  //按钮ID
                {
                    //禁用按钮
                    EnableWindow(button_hwnd,0);

                    //使用Sleep函数模拟长时间操作
                    Sleep(5000);

                    //启用按钮
                    EnableWindow(button_hwnd,1);

                    //将消息队列中属于按钮的WM_LBUTTONDOWN消息与WM_LBUTTONUP消息清除
                    while(PeekMessage(&msg,button_hwnd,\
                        WM_LBUTTONDOWN,WM_LBUTTONUP,PM_REMOVE));
                    return 0;
                }
            }
    .
    .
    .
    }
}

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值