新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论高级C/C++编程、代码重构(Refactoring)、极限编程(XP)、泛型编程等话题
    [返回] 中文XML论坛 - 专业的XML技术讨论区计算机技术与应用『 C/C++编程思想 』 → Windows 程序内部运行机制 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 3620 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: Windows 程序内部运行机制 举报  打印  推荐  IE收藏夹 
       本主题类别: Description Logics    
     葛靖青001 美女呀,离线,快来找我吧!水瓶座1984-2-14
      
      
      等级:大三(研究MFC有点眉目了!)
      文章:168
      积分:595
      门派:XML.ORG.CN
      注册:2010/11/2

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给葛靖青001发送一个短消息 把葛靖青001加入好友 查看葛靖青001的个人资料 搜索葛靖青001在『 C/C++编程思想 』的所有贴子 点击这里发送电邮给葛靖青001 引用回复这个贴子 回复这个贴子 查看葛靖青001的博客楼主
    发贴心情 Windows 程序内部运行机制

    【转自互联网】

    一、WinMain 函数原型

      int WINAPI WinMain(

      HINSTANCE hInstance,      // handle to current instance 程序当前运行实例句柄

      HINSTANCE hPrevInstance, // handle to previous instance 前一个实例句柄,参数总为NULL

      LPSTR lpCmdLine,          // command line 以空字符串结尾的命令行参数

      int nCmdShow              // show state 指定窗口的显示方式

      )

      二、创建一个窗口

      1.设计一个窗口类

      2.注册一个窗口类

      3.创建窗口

      4.显示及更新窗口

      (1).设计一个窗口类

      typedef struct _WNDCLASS{

      UINT style;

      WNDPROC lpfnWndProc;

      int cbClsExtra;

      int cbWndExtra;

      HANDLE hInstance;

      HICON Icon;

      HCURSOR Cursor;

      HBRUSH hbrBackground;

      LPCTSTR lpszMenuName;

      LPCTSTR lpszClassName;

      } WNDCLASS;

      ① style 属性指定窗口样式:

      CS_HREDRAW - 水平宽度变化重绘。

      CS_VREDRAW - 垂直方向高度变化重绘.

      CS_NOCLOSE - 禁用系统CLOSE命令.设关闭按钮.

      CS_DBLCLKS - 窗口接收双击消息.

      ② lpfnwndproc 函数指针

      指向窗口过程函数

      窗口过程函数是一个回调函数

      ③ cbclsExtra; -- 一般值为0

      Windows 系统中每一个窗口类型管理一个WNDCLASS结构

      ④ cbwndExtra; -- 一般值为0

      Windows系统中为每一个窗口管理一个内部数据结构,在注册一个窗口类时,

      应用程序能够指定一定字节数的附加内存空间,称为窗口附加内存.

      ⑤hInstance

      包含窗口过程的程序实例句柄

      ⑥hIcon 窗口类图标句柄

      成员变量须为一个图标资源句柄且成员为NULL,为系统提供默认图标

      我们可使用loadIcon函数来加载一个图标资源,并且它给系统分配图标句柄.

      函数原型:

      HIcon loadIcon(HINSTANCE hInstance, LPCTSTR lpIconName)

      ⑦hCursor指定窗口类光标句柄 -- 必须加载一个光标资源句柄,如果成员为NULL,

      无论何时鼠标进入到应用程序窗口中,应用程序都必须明确设置光标形状。

      ⑧hbrBackgound指定窗口类背景画刷句柄

      当窗口发生重绘,系统使用这里指定画刷来擦除窗口背影.

      ⑨ lpszMenuName -- 指定菜单资源名字(以以后终止字符串)

      如果使用菜单资源ID,那么需要用MAKENTRESouRCE宏来转换

      如果将其初始化为NULL,那么就算默认没有菜单。

      ⑩ lpszClassName - 指定窗口类名字(相当于给窗口取名字)
    三、注册窗口类

      设计宏窗口类后(WNDCLASS),我们还需要用 RegisterClass函数

      对其进行注册,注册成功后,才可创建该类型窗口 原型如下:

      ATOM RisterClass(Const WNDCLASS *LPWNDCLass);

      函数只有 - 参数,即上步骤中所设计窗口类对象指针。

      四、创建窗口 -- CreateWindow 函数

      HWND CreateWindow(

      LPCTSTR lpClassName, // 窗口类的名称 说明1

      LPCTSTR lpWindowName // 窗口的名字 - 窗口样式又标题栏,指定窗口名是在标题栏

      DWORD    dwstyle, // 指定窗口类样式,具体参考WS_OVERLAPPEDWINDOW类型

      int x, // 窗口左上角x.y坐标 -- 宽、高。 -- x,设为CW_USEDEFAULT,窗口默认左上角坐标忽略y参数。

      int y,

      int nWidth,

      int nHeight, // - 设为 CW_USEDEFAULT 窗口默认宽、高,nHight忽略。

      HWND hwndparent, // 创建窗口的父窗口句柄

      HMENU hmenu. // 指定窗口菜单句柄

      HANDLE hInstance, // 指定窗口所属应用程序实例句柄

      LPVOID lparam // WM_CREATE消息附加参数lparam传入数据指针

      // 创建多文档界面窗口,lparam指向CLIENTCREATESRUCT结构体多数窗口设为NULL

      // 说明1、调用CreateWindows函数前,没有用RegisterClass函数,注册名称的窗口类。

      #define WS_OVERLAPPEDWINDOW (WS_OVERLAPPED // 产生层叠窗口有标题栏和边框

      WS_CAPTION      |\ 创建一个有标题窗口

      WS_SYSMENU      |\ 创建在标题栏上有系统菜单和WS_CAPTION类型一起作用

      WS_THICKFRAME   |\ 创建一个具有可调边框窗口

      WS_MINIMIZEBOX |\ 最小化窗口,设定WS_SYSMENU类型

      WS_MAXIMIZEBOX |\ 最大化窗口,设定WS_SYSMENU类型

      )

      窗口创建成功,CreaeWindow 函数返回系统为窗口分配句柄,否则返回NULL

      五、显示及更新窗口 -- ShowWindow 函数

      原型

      Bool ShowWindow(

      HWND hwnd, // 创建窗口后返回哪个窗口句柄。

      int nCmdshow // 用来指定窗口显示状态。

      );

      nCmdShow 参数一般为:

      SW_HIDE -- 隐藏并激活其他窗口        SW_SHOW --窗口原位置 以原来尺寸激活和显示窗口

      SW_SHOWMAXIMIZED -- 激活窗口并将其最大化显示

      SW_SHOWMINIMIZED -- 激活窗口并将其最小化显示

      SW_SHOWNORMAL    -- 激活并显示窗口 -- 窗口最小化或最大化状态 系统其恢复原来尺寸和大小。

      更新窗口 -- updateWindow来刷新窗口

      原型

      Bool updateWindow(

      HWHD hwndl;// 指创建成功后的窗口句柄

      ) updateWindow 函数通过发送一个WM_PAINT 消息来刷新窗口

      updateWindow 将WM_PAINT消息直接发送给窗口过程函数进行处理,而没放到我们前面所说的消息队列中。

      六、消息循环 -- GetMessage函数

      原型:

      Bool Getmessage(

      LPMSG lpmsg, // 指向一个消息结构体 -- 将消息队列中信息保存在结构体对象中。

      HWND   hwnd, // 接收属于哪个窗口消息,通常设置NULL接收属于调用线程所有窗口的窗口消息

      UINT WMsgFiltermin, // 获取消息最小值,设为0接收所有消息。

      UINT WMsgFiltermax // 获取消息最大值,设为0接收所有消息。

      );
    GetMessage 接收除WM_QUIT外消息的非零值,对于WM_QUIT消息函数返回零,如果出现错误,

      函数直接返回-1

      MSG msg;

      while (GetMessage(&msg,null,0,0))

      {

      Translatemessage(&msg);   // 用于将虚拟键消息转换为字符消息

      Dispatchmessage(&msg);   // 分配一个消息到窗口过程,窗口过程函数对消息进行处理

      }

      七、编写窗口过程函

      LRESULT CALLBACK WinSunProc(

      HWND hwnd,      // 窗口句柄

      UINT uMsg,      // 消息代码

      WPARAM wParam, // 第一条消息参数

      LPARAM lParam   // 第二条消息参数

      );

      {

      switch(uMsg)

      {

      case WM_CHAR:     // 用户按下字符键时...收到WM_CHAR消息通过Translatemessage函数转换ASCII值。

      char szChar[20];

      sprintf(szChar,"char code is %d",wParam);

      MessageBox(hwnd,szChar,"char",0);

      break;

      case WM_LBUTTONDOWN: // 接收窗口按下鼠标左键 会产生 WM_LBUTTONDOWN 消息.

      MessageBox(hwnd,"mouse clicked","message",0);

      HDC hdc;

      hdc=GetDC(hwnd);

      TextOut(hdc,0,50,"程序员之家",strlen("程序员之家"));

      //ReleaseDC(hwnd,hdc);

      break;

      case WM_PAINT:   // 对 WM_PAINT 消息进行处理。当窗口客户区部分或全部无效时,系统发生 WM_PAINT 消息

      // 通知应用程序重新绘制窗口。

      HDC hDC;

      PAINTSTRUCT ps;

      hDC=BeginPaint(hwnd,&ps);

      TextOut(hDC,0,0,"http://www.sunxin.org",strlen("http://www.sunxin.org"));

      EndPaint(hwnd,&ps);

      break;

      case WM_CLOSE:   // 用户点击关闭按钮时 系统会接收 WM_CLOSE

      if(IDYES==MessageBox(hwnd,"是否真的结束?","message",MB_YESNO))

      {

      DestroyWindow(hwnd); // 当用户在对话框上选择 是时~~会调用DestroyWindow销毁窗口。

      }

      break;

      case WM_DESTROY:   // 要想让程序正常退出,必须响应 WM_DESTROY 消息~~并在消息代码中调用 PostQuitMessage 函数

      PostQuitMessage(0);

      break;

      default:

      return DefWindowProc(hwnd,uMsg,wParam,lParam); // 函数调用默认的窗口过程,对程序没有处理的其他消息提供默认处理。

      }


       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    ---人之所以能,是相信能!!

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2010/11/24 15:32:00
     
     GoogleAdSense水瓶座1984-2-14
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 C/C++编程思想 』的所有贴子 点击这里发送电邮给Google AdSense 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/11/28 13:23:46

    本主题贴数1,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    46.875ms