科创园

科创园地,分享技术知识,为科技助力发展,贡献一己之力。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Windows 程序运行原理

Posted on 2012-02-22 21:03  科创园  阅读(415)  评论(0编辑  收藏  举报

在window 中应用程序编程,重要的是明白应用程序、操作系统、消息之间的关系,一句话总结就是:事件驱动消息的机制。操作系统通过消息的机制来传递给应用程序

不同的消息代表用户不同的操作和状态,特定的消息让操作系统来响应某一个特定功能来响应消息。

MSG结构定义如下:

typedef struct tagMSG {      

      HWND   hwnd;     

      UINT   message;

      WPARAM wParam;

      LPARAM lParam;

      DWORD  time;(双十六位即32位)

      POINT  pt;(结构体)

} MSG;

 

句柄(HANDLE),资源的标识。(有点类似于指针,占着内存一部分资源)

操作系统要管理和操作这些资源,都是通过句柄来找到对应的资源。按资源的类型,又可将句柄细分成图标句柄(HICON),光标句柄(HCURSOR),窗口句柄(HWND),应用程序实例句柄(HINSTANCE)等等各种类型的句柄。操作系统给每一个窗口指定的一个唯一的标识号即窗口句柄

 

Windows程序的入口函数(相当于C语言中main()函数)

int WINAPI WinMain(

  HINSTANCE hInstance,      // handle to current instance(当前实例)

  HINSTANCE hPrevInstance,  // handle to previous instance(前一个实例,一般为NULL)

  LPSTR lpCmdLine,          // command line(lp开头为长指针,指向字符串)

  int nCmdShow              // show state

);

      创建一个完整的窗口需要经过下面四个操作步骤:

n设计一个窗口类;
n注册窗口类;
n创建窗口;
n显示及更新窗口。

1、设计窗口类

typedef struct _WNDCLASS {

   UINT      style;

   WNDPROC  lpfnWndProc; (函数处理)

   int       cbClsExtra; (额外信息,一般为0)

   int       cbWndExtra;

   HANDLE   hInstance; (当前应用程序实例)

   HICON     hIcon;

   HCURSOR   hCursor;

   HBRUSH    hbrBackground;

   LPCTSTR   lpszMenuName; (指向32位字符串,菜单名)

   LPCTSTR   lpszClassName; 

} WNDCLASS; 

下面以一个简单的实例程序来作为window程序原理的分析:

#include <windows.h>
#include <stdio.h>

//函数声明
LRESULT CALLBACK WinSunProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);

 

//主函数入口
int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // command line
int nCmdShow // show state
)
{
WNDCLASS wndcls;//定义一个设计窗口类的实例化
wndcls.cbClsExtra=0;
wndcls.cbWndExtra=0;
wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);//定义一个窗口的背景,这里要强制转换?查看msdn可以得知函数返回的是神马类型的
wndcls.hCursor=LoadCursor(NULL,IDC_CROSS);//光标
wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);//应用程序图标
wndcls.hInstance=hInstance;
wndcls.lpfnWndProc=WinSunProc;//注册处理函数,这个很重要,注意与C语言中的区别
wndcls.lpszClassName="yangyong";
wndcls.lpszMenuName=NULL;
wndcls.style=CS_HREDRAW | CS_VREDRAW;//水平和垂直类型
RegisterClass(&wndcls);//注册设计类

HWND hwnd;//创建一个窗口,首先要定义一个句柄
hwnd=CreateWindow("yangyong","常熟理工",WS_OVERLAPPEDWINDOW,0,0,600,400,NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,SW_SHOWNORMAL);
UpdateWindow(hwnd);

MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}

 

LRESULT CALLBACK WinSunProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
switch(uMsg)
{
case WM_CHAR:
char szChar[20];
sprintf(szChar,"char is %d",wParam);
MessageBox(hwnd,szChar,"weixin",0);
break;
case WM_LBUTTONDOWN:
MessageBox(hwnd,"Mouse Click","weixin",0);
HDC hdc;
hdc=GetDC(hwnd);
TextOut(hdc,0,50,"计算机编程",strlen("计算机编程"));
ReleaseDC(hwnd,hdc);
break;
case WM_PAINT:
HDC hDc;
PAINTSTRUCT ps;
hDc=BeginPaint(hwnd,&ps);
TextOut(hDc,0,0,"wei xin peix un ",strlen("wei xin peix un "));
EndPaint(hwnd,&ps);
break;
case WM_CLOSE:
if(IDYES==MessageBox(hwnd,"真的结束?","weixin",MB_YESNO))
{
DestroyWindow(hwnd);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);

}
return 0;
}

 

 

在写这些程序过程中,我们不可能记住所有API的函数类型和参数等,这里我们主要下载msdn帮助手册,通过手册查询熟悉常用的即可,本人是初学msdn,这里只是作为我学习的一个记录心得,与朋友一起分享学习的过程。这是第一篇,以后会不断的更新自己的学习过程。嘿嘿!!!!!

注明:本系列的学习知识参考孙鑫老师 的C++编程,里面含有一些个人的思想与学习总结,绝无抄袭之用,仅供学习。