文章分类 | 推荐文章 | 最新文章 | 热点文章 | 最新软件 | 精品软件 | 下载排行 | 推荐下载 | 免费看大片 | WPS | 杀毒软件
清风网络
首 页 软件下载 网络学院 数码学院
QQ 电脑入门 游戏 操作系统 图形处理 办公软件 媒体动画 精文荟萃 工具软件 网络编程 程序开发 网络技术 认证考试 网站建设 文章专栏
当前位置:清风网络学院程序开发软件工程揭开.NET消息循环的神秘面纱
精品推荐
特别推荐
·Tomcat中用web.xml控制Web应用详解
·计算机网络工程课程讲解
·COM, COM+ and .NET 的区别
·ISO9000:2000 质量管理八大原则(1)
·Struts框架及其在Web开发中的应用
·献给汇编初学者-函数调用堆栈变化分析
·质量管理的十三项步骤和八项原则(1)
·质量管理体系审核全解(1)
·WinCE.Net平台下电力巡检仪数据同步研究与实现
·黑盒测试和白盒测试
·黑客程序设计
·软件自动化测试流程
·详述RPG游戏引擎的设计原理
热点TOP10
·Visual Studio 2005集成开发环境图解
·Linux BOOTLOADER全程详解(Arm S3C2410)
·清除window 2000/XP系统中的无用设备的驱动程序
·gsoap中文文档(8.1.1)
·如何为嵌入式开发建立交叉编译环境
·ISO9000:2000 质量管理八大原则
·Vista新技术:WCF开发指南之构建服务
·UML类图详解(1)
·ISO9000:2000 质量管理八大原则(1)
·商场荧屏导购展板系统软件需求说明书
·Tomcat中用web.xml控制Web应用详解
·使用ADS1.2进行嵌入式软件开发
·VC中利用多线程技术实现线程之间的通信
·编写质量手册
·软件工程-软件目的需求开发与管理
·软件项目质量管理经验谈
·.NET 数据访问架构指南
·献给汇编初学者-函数调用堆栈变化分析
·软件与并发巨变 不得不面对的革命
·管理信息系统需求调研分析指南

揭开.NET消息循环的神秘面纱

日期:2007年5月3日 作者: 查看:[大字体 中字体 小字体]



  曾经在Win32平台下奋战的程序员们想必记得,为了弄清楚“消息循环”的概念,度过多少不眠之夜。尽管如今在应用程序代码的编写过程中,我们已经不再需要它,但是深刻理解Windows平台内部的消息流转机制依然必要..

  在早年直接用Win32/Win16 API写程序的时代,消息循环是我们必须搞懂的第一个观念。现在,不管你用是Windows上面的哪一套Application Framework(MFC、VCL、VB、.NET Framework),甚至Unix、Linux、MacOSX上面的Application Framework,都不太容易看到消息循环。事实上,消息循环依然存在,只是被这些ApplicationFramework包装起来,深深地埋藏在某个角落。

  本文章试图唤起大家对于消息循环的回忆,也试图解释消息循环如何被封装进.NET Framework的Windows Forms中。虽然Windows Forms将这一切都藏起来,但是也留下许多空间,让我们可以自行处理Win32的消息。

  传统的Windows 程序

  传统的Windows程序,只利用Win32 API撰写,下面是一个程序范例,为了节省篇幅,我将其中许多程序代码省略:

// 程序进入点

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

LPTSTR lpCmdLine, int nCmdShow){
 MSG msg;
 if (!InitInstance (hInstance, nCmdShow)){
  return FALSE;
 }

 // 主消息循环:

 while (GetMessage(&msg, NULL, 0, 0)){
  TranslateMessage(&msg); DispatchMessage(&msg);
 }
 return (int) msg.wParam;
}

// 函数: WndProc(HWND, unsigned, WORD, LONG)
// 用途: 处理主窗口的消息。

LRESULT CALLBACK WndProc(
 HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
  int wmId, wmEvent; PAINTSTRUCT ps;
  HDC hdc;
  switch (message){
   case WM_COMMAND:
    wmId = LOWORD(wParam);
    wmEvent = HIWORD(wParam);
    // 剖析菜单选取项目:
    switch (wmId){
     case IDM_ABOUT:
      DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX,hWnd, (DLGPROC)About);
      break;
     case IDM_EXIT:
      DestroyWindow(hWnd);
      break;
     default:
      return DefWindowProc(hWnd, message,wParam,lParam);
    }
    break;
   case WM_PAINT:
    hdc = BeginPaint(hWnd, &ps);

    // TODO: 在此加入任何绘图程序代码...
    EndPaint(hWnd, &ps);
    break;

   case WM_DESTROY:
    PostQuitMessage(0);
    break;
   default:
    return DefWindowProc(hWnd, message,wParam, lParam);
  }
  return 0;
 }

 // [关于] 方块的消息处理例程。

 LRESULT CALLBACK About(HWND hDlg, UINT message,

 WPARAM wParam, LPARAM lParam){
  switch (message){
   case WM_INITDIALOG:
    return TRUE;
   case WM_COMMAND:
    if (LOWORD(wParam) == IDOK LOWORD(wParam) == IDCANCEL){
     EndDialog(hDlg, LOWORD(wParam));
     return TRUE;
    }
    break;
   }
   return FALSE;
  }
  1、从_tWinMain内,程序进入主消息循环;

  2、消息循环从消息队列(Message Queue)中取得一个消息(透过调用GetMessage())。每个执行中的程序都有一个属于自己的消息队列;

  3、消息循环根据消息内容来决定消息应该送给哪个Windows Procedure(WndProc),.. 这就称为消息分发(Message Dispatch)。通常“每一种”窗口或控件(control)都有一个Windows Procedure,来处理该种窗口/控件的行为;

  4、Windows Procedure根据消息内容来决定应该调用哪个函数(利用Switch/Case语法);..

  5、Windows Procedure处理完,控制权回到消息循环。继续进行2、3、4、5的动作;

  6、当消息队列为空的时候,GetMessage()无法取得任何消息,就会进入Idle(空闲)状态,进入睡眠状态(而不是Busy Waiting)。当消息队列不再为空的时候,程序会自动醒过来,继续进行2、3、4、5的动作;

  7、当取得的消息是WM_QUIT,GetMessage()就会得到0的返回值,因而离开消息循环,程序结束。程序会利用调用PostQuitMessage()来将WM_QUIT放置进消息队列中,来造成稍后结束,而不会直接贸然跳离开循环来结束。

  虽名为队列(queue),.. 但是消息队列中的消息并非总是先进先出(First In First Out,FIFO),有一些特例:

  . 只要消息队列中有WM_QUIT ,就会先取出WM_QUIT,导致程序结束。

  . 只有在没有其它消息的时候,WM_PAINT 和WM_TIMER才会被取出。且多个WM_PAINT可能会被合并成一个,WM_TIMER也是如此。

  . 利用TranslateMessage()来处理消息,可能会造成新消息的产生。例如:TranslateMessage()可以辨识出WM_KEYDOWN(按键按下)加上WM_KEYUP(按键放开)就产生WM_CHAR(字符输入)。


[1] [2] [3] 下一页 




上一篇:用好VS2005之减少重复代码输入

下一篇:需求源于沟通 获取需求十大沟通技巧

揭开.NET消息循环的神秘面纱 相关文章:
·图片左右循环连续滚动代码,解决marquee的留白问题
·珊瑚虫、飘云(显IPQQ)和腾讯最新消息
·揭开WinRAR不能解压之谜
·催眠术揭开死亡面纱:催眠与前世回归
·神秘岛3:放逐 全攻略
·QQ的消息保护模式是怎么回事?
·左右图片循环滚动停顿一下后继续
·神秘QQ空间背景+导航+鼠标效果代码
·WINDOWS消息说明
·揭开人体模特的神秘面纱(图片)
揭开.NET消息循环的神秘面纱 相关软件:
·《珠穆朗玛探险》神秘视线游戏试玩
·神秘小镇
·Zamby和神秘水晶
·《罗马之全面战争》MOD-神秘东方
·神秘的解剖室-心尘
·神秘鲨鱼岛
·QQ&POPO消息快速发送工具 V1.0
·哈里·波特历险记——神秘的魔法石
·神秘古墓(Mosaic Tomb of Mystery)
·揭开尘封四个世纪的悬案:《毒药52》

特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
[打印本页] [关闭窗口] 转载请注明来源:http://www.vipcn.net
| 帮助(?) | 版权声明 | 友情连接 | 关于我们 | 信息发布
Copyright 2007 www.vipcn.net All Rights Reserved. 鄂ICP备05000083号Powered by:viphot