ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Windows程序内部运行原理

Windows程序内部运行原理

原创 Linux操作系统 作者:Hemes 时间:2010-07-23 12:11:36 0 删除 编辑

1.输入输出设备<---->操作系统
2.操作系统<---->应用程序
3.应用程序----消息队列

句柄(资源的标识,类似于指针)
1.图标句柄(HICON)
2.光标句柄(HCURSOR)
3.窗口句柄(HWND)
4.应用程序实例句柄(HINSTANCE)

typedef struct tagMSG{
 HWND   hwnd;       //窗口句柄
 UINT   message;    //消息本身
 WPARAM   wParam;     //first 消息的附加信息
       LPARAM   lParam;     //second 消息的附加信息
 DWORD    time;       //消息被传递出去的时间
       POINT    pt;         //点的结构体,光标的位置
}MSG, *PMSG;

Windows程序的入口函数
int WINAPI WinMain(
 HINSTANCE hInstance;               //当前应用程序实例句柄
       HINSTANCE hPrevInstance;           //下一个应用程序实例句柄
 LPSTR     lpCmdLine;               //命令行参数
       int       nCmdShow;                //窗口显示的状态
){};

创建一个完整的窗口:
1.设计一个窗口类
2.注册窗口类
3.创建窗口
4.显示及更新窗口

窗口类
typedef struct _WNDCLASS{
 UINT         style;           //窗口类型
       WNDPROC      lpfnWndProc;     //指定了这一类型窗口的过程函数
       int          cbClsExtra;      //窗口类的附加内存
       int          cbWndEXtra;      //窗口的附加内存
       HINSTANCE    hInstance;
       HICON        hIcon;
       HCURSOR      hCursor;
       HBRUSH       hbrBackground;   //话刷句柄
       LPCTSTR      lpszMenuName;    //菜单的名字
       LPCTSTR      lpszClassName;   //类的名字
}WNDCLASS, *PWNDCLASS;

WNDCLASS wndclass;
wndclass.style=CS_HREDRAW | CS_VREDRAW;       //窗口水平重画和垂直重画
wndclass.lpfnWndProc=WinSunProc;              //回调函数
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);              //Windows的标准图标
wndclass.hInstance=hInstance;
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);                //Windows的标准光标
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); //窗口背景颜色
wndclass.lpszMenuName=NULL;     
wndclass.lpszClassName="maliang";

RegisterClass(&wndclass);//注册窗口类
HWND hwnd;
hwnd=CreateWindow("maliang","上海易宝软件公司(南京分公司)",WS_OVERLAPPEDWINDOW,
                  CW_USEDDEFAULT,NULL,NULL,hInstance,NULL);

ShowWindow(hwnd,SW_SHOWNORMAL);
UpdateWindow(hwnd);

MSG msg;    //定义一个消息变量
while(GetMessage(&msg,NULL,0,0))   //从消息队列取出一条一条具体消息
{
 TranslateMessage(&msg);  //捕获WM_CHAR消息
       DispatchMessage(&msg);   //将消息路由给操作系统,操作系统调用回调函数对消息进行处理
}
return 0;

LRESULT CALLBACK WindowProc(
 HWND   hwnd,
       UINT   uMsg,
       WPARAM wParam,
       LPARAM lParam
)
{
 HDC hdc;  //设备上下文,也是一个句柄
       PAINTSTRUCT ps;
 switch(uMsg){
       case WM_PAINT:   //窗口重画
     hdc=BeginPaint(hwnd,&ps);
           TextOut(hdc,0,0,"上海易宝软件公司(南京分公司)",strlen("上海易宝软件公司(南京分公司)"));
           EndPaint(hwnd,&ps);
           break;
       case WM_CHAR:          //KEYDOWN or KEYUP
           char szChar[20];
           sprintf(szChar,"char is %d",wParam);
           MessageBox(hwnd,szChar,"maliang",MB_OK);
           break;
       case WM_LBUTTONDOWN:   //捕获鼠标左键单击
           MessageBox(hwnd,"mouse click","maliang",MB_OK);
           hdc=GetDC(hwnd);
           TextOut(hdc,0,50,"鼠标左键单击窗口",strlen("鼠标左键单击窗口"));
           ReleaseDC(hwnd,hdc);
       case WM_CLOSE:
           if(IDYES==MessageBpx(hwnd,"你是否退出程序?","maliang",MB_YESNO)){
   DestroyWindow(hwnd);
      }
            break;
       case WM_DESTROY:
           PostQuitMessage(0);
           break;
       default:      //必不可少的,将不感兴趣的消息交给系统进行默认处理
           return DefWindowProc(hwnd,uMsg,wParam,lParam);
       }
       return 0;
};

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/23366483/viewspace-668846/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: COM组件
下一篇: C++面试题(2)
请登录后发表评论 登录
全部评论

注册时间:2010-07-19

  • 博文量
    18
  • 访问量
    11269