win32开发(自定义消息)

来源:互联网 发布:埃摩森猎头公司 知乎 编辑:程序博客网 时间:2024/06/07 07:37

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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,其他都是一样的处理流程。

原创粉丝点击