win32开发(自定义消息)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/feixiaoxing/article/details/78877296

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

    一般来说,windows除了提供的普通的消息处理机制之外,还提供了自定义消息的处理方法。这就是说,WndProc不仅可以处理来自于操作系统的消息,还可以处理自定义的消息。这对写程序的coder来说实在是太方便了。

    那一般什么时候使用自定义消息呢?情况是这样的,对于那些io操作时间比较长的操作,我们一般会重新起一个thread来处理,比如说网络的操作。因为如果把网络的操作放在WndProc里面,这会产生很多的卡顿非常影响操作者的使用体验。让socket等一些低速操作分开进行之后,可以在thread操作完成后主动给窗口发一个消息,告知相关工作已经结束就可以了,这就克服了操作卡顿的问题。

    那windows下面自定义消息的代码一般是什么样子呢?我们这里可以看一段代码,

    case (WM_USER+1):
        hWnd = hWnd;
        break;

    case WM_COMMAND:
        wmId    = LOWORD(wParam); 
        wmEvent = HIWORD(wParam); 
        // Parse the menu selections:
        switch (wmId)
        {
        case IDM_ABOUT:
            DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
            PostMessage(hWnd, WM_USER+1, 0,0);
            break;

        case IDM_EXIT:
            DestroyWindow(hWnd);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }

    大家注意这里的消息都是从WM_USER开始定义的,建议大家还是按照windows推荐的macro依次定义本地的app消息。除此之外,这里还用了PostMessage函数。PostMessage和SendMessgae函数差不多,参数都是一样的,唯一的区别就是后者会等待处理结果,而前者是异步处理的。

    前面我们说到会独立创建thread来处理低速io操作,那windows一般怎么发送消息给thread呢?其实也简单,只要发送这个函数就可以了,

PostThreadMessage(idThread, Msg, wParam, lParam)

    它和SendMessage、PostMessage唯一的区别就是函数的第一个参数变成了idThread,其他都是一样的处理流程。

展开阅读全文

没有更多推荐了,返回首页