半球体:Windows 程序内部运行机制

来源:百度文库 编辑:偶看新闻 时间:2024/05/01 12:27:31

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); // 函数调用默认的窗口过程,对程序没有处理的其他消息提供默认处理。

  }

用汇编语言了解机器内部运行机制 Windows Media player10内部程序错误 windows madie player程序内部错误怎么办? windows media player“内部程序错误” XP附带的Windows Media内部程序出错,怎么修复? windows media 10 为什么老是出现内部程序错误! Windows Madia Player显示内部程序出现问题 打开windows Media Player 说内部程序出错 windows media playar 出现内部程序错误怎么办 windows player 提示内部程序错误,无法打开? Windows Media Player出现内部程序错误用不鸟了. 内部程序错误 mp3内部运行程序 点击windows media player,显示“出现内部程序错误”,该怎么办? 我的WINDOWS MEDIA PLAYER 老提示 内部程序出现错误,怎么回事??!! Windows Media Pliayer打不开(内部程序出错)光区不读牒:(哪位大哥大姐能帮帮我 Windows Media Player不能用了!卸载了重新安装也不行!提示内部程序出错! 我的Windows Media Player打开后怎么是内部程序出错 啊 windows madia player10安装之后为什么会有内部程序错误啊~? 电脑的windows media player打不开,提示“内部程序错误”,怎么解决呀? 我点Windows Media Player怎么总显示内部程序错误问题 为什么我的电脑Windows Medla Play内部程序出错啊 Windows Media Player出现的问题“出现了内部应运程序错误” 电脑内部的各配置的频率之间有什么相互限制吗,里面的运行机制是怎么样的?