您的位置:首页 > 编程语言 > C语言/C++

Windows程序内部运行机制

2014-08-07 17:57 281 查看
1、API(application programming interface) windows操作系统提供给应用程序编程的接口
2、SDK(software development kit)软件开发包
3、常用句柄:
    窗口句柄(HWND)        位图句柄(HBITMAP)
           图标句柄(HICON)            菜单句柄(HMENU)、
    文件句柄(HFILE)       当前实例句柄 (HINSTANCE)
   全局内存对象句柄(HGLOBAL)   局部内存对象句柄(HLOCAL)
    设备环境句柄(HDC)
    光标句柄(HCURSOR)            字体句柄(HFONT)            画笔句柄(HPEN)、
    画刷句柄(HBRUSH) 
4、常用数据类型
   BYTE    WORD    LONG    DWORD    UINT    BOOL    
   PSTR   32位字符指针
   COLORREF    32位整数,表示一个颜色
   HANDLE   句柄
   LPSTR    32位指针,指向字符
   LPCSTR   32位指针,指向字符串常量
   LPTSTR   32位指针,指向字符串,此字符串可移植到Unicode和DBCS双字符集
   LTCTSTR  32位指针,指向字符串常量,此字符串可移植到Unicode和DBCS双字符集
   LPVOID   32位指针,可指向任何类型数据
   LPRESULT 32位数值,作为窗口函数或CALLBACK函数的返回类型
   WNDPROC  32位指针,指向一个窗口函数 
   LPARAM   32位数值,作为窗口函数和CALLBACK函数的参数
   WPARAM   作为窗口函数和CALLBACK函数的参数,在Win 16中是16位,在Win32中是32位
5、消息是由MSG结构体来表示的,MSG定义如下
    typedef struct tagMSG
    {
        HWND     hwnd;
        UINT     message;    //在Windows中消息是有数值表示的,由于数值不便于记忆,所以将其定义为WM_XXX宏(WM为window message的缩写)
        WPARAM   wParam;    //WPARAM类型就是unsigned int
        LPARAM   1Param;    //LPARAM类型就是long
        DWORD    time;
        POINT    pt;        //鼠标当前位置
    }MSG;
6、消息可分为“进队消息”和“不进队消息”,进队消息将由系统放入应用程序的消息队列中,然后由应用程序取出并发送。不进队的消息在系统调用窗口过程时直接发送个给窗口。不管是进队消息还是不进队消息,最终都有系统调用窗口过程函数对消息进行处理。
7、完整的Win32程序实现步骤:
    (1)WinMain函数的定义

        WinMain函数的原型声明:
            int WINAPI WinMain
            {
                HINSTANCE hInstance. //当前运行的实例的句柄
                HINSTANCE hPrevInstance, //前一个实例的句柄(在Win32环境下,这个参数总是NULL)
                LPSTR lpCmdLine, //一个以空终止的字符串,指定传递给应用程序的命令行参数
                int nCmdShow    //指定程序的窗口应该如何显示(最大化、最小化、隐藏...)
            };

    (2)创建一个窗口
        一、设计一个窗口
            窗口特征结构体WNDCLASS
            typedef struct _WNCLASS
            {
                UINT style; //类型窗口的样式:CS_HREDRAW当在水平方向上的宽度发生变化时,将重绘整个窗口   (CS_被定义为16位的常量,只有一位为1)
                                              CS_VREDRAW当在垂直方向上的高度发生变化时,将重绘整个窗口
                                              CS_NOCLOSE禁用系统菜单的Close命令,这将导致窗口没有关闭按钮
                                              CS_DBLCLKS当用户在窗口中双击鼠标时,向窗口过程发送鼠标双击消息
                WNDPROC lpfnWndProc; //窗口过程函数指针(窗口过程函数是个回调函数)
                int cbClsExtra;    //Windows为系统中的每个窗口类管理一个WNDCLASS结构,一个字节数的附加内存空间,用于存储类的附加信息
                int cbWndExtra;    //Windows系统为每个窗口管理一个内部数据结构
                HANDLE hInstance;   //指定包含窗口过程的程序的实例句柄
                HICON hIcon;      //窗口类的图标句柄(为NULL的话,系统会提供默认图标),可调用LoadIcon函数加载一个图标资源
注:VC++中,自定义的菜单、图标、光标等都保存在资源脚本(.rc)
                HCURSOR hCURSOR;    //指定窗口类的光标句柄,可调用LoadCursor函数加载一个光标资源
                HBRUSH hbrBackground;    //指定窗口类的背景画刷句柄,可以调用GetStockObject函数来得到系统的标准画刷(GetStockObject函数还可以用于获取画笔、字体和调色板的句柄)
                LPCTSTR lpszMenuName;    //一个以空终止的字符串,指定菜单资源的名字。(设为NULL将没有默认的菜单)
                LPCTSTR ipszClassName;    //一个以空终止的字符串,指定窗口类的名字。
             }WNDCLASS;    
        二、注册一个窗口
            调用RegisterClass函数对其进行注册,注册成功后才可以创建该类型的窗口。
        三、创建窗口
            用CreatWindow函数产生这种类型的窗口
            HWND CreatWindow
            {
                LPCTSTR lpClassName,    //指定窗口类的名称
                LPCTSTR lpWindowName,   //指定窗口的名字 
                DWORD dwStyle,    //指定创建窗口的样式(注意与WNDCLASS中style区别,style指定窗口类的样式,这里是指定某个具体的窗口的样式。
                int x,    //窗口左上角的x        注:x设定为CW_USEDEFAULT,默认的坐标,
                int y,
                int nWidth,                      注:nWidth设定为CW_USEDEFAULT,默认的宽度和高度 
   
                int nHeight,
                HWND hWndParent,    //指定被创建窗口的父窗口句柄
                HMENU hMenu,    //指定窗口菜单的句柄
                HANDLE hInstance,    //指定窗口所属的应用程序实例的句柄
                LPVOID lpParam    //作为WM_CREATE消息的附加参数lParam传入的数据指针
            };
        四、显示及更新窗口
            ShowWindow函数(显示窗口)
            BOOL ShowWindow
           (
                HWND hWnd,    //成功创建窗口后返回的那个窗口句柄
                intn CmdShow    //指定了窗口显示的状态  常见的几种:SW_HIDE 隐藏窗口并激活其他窗口
dc6b

                                                                    SW_SHOW 在窗口原来的位置以原来的尺寸激活和显示窗口
                                                                    SW_SHOWMAXMIZED 激活窗口并将其最大化显示
                                                                    SW_SHOWMINIMIZED 激活窗口并将其最小化显示
                                                                    SW_SHOWNORMAL 激活并显示窗口
            );
           
           BOOL UpdataWindow
          (
                HWND hWnd //
           )

    (3)进行消息循环
        我们需要一个消息循环,不断从消息队中取出消息,并进行响应。
        用GetMessage()函数(接收WM_QUIT返回非零,出错返回-1,其他为0)
        BOOL GetMessage
       (
            LPMSG lpMsg,  //指向一个消息结构体,GetMessage从线程的消息队列中取出的消息信息将保存在该结构体对象中
            HWND hWnd,    //指定接收属于哪个窗口的消息。(通常设为NULL,用于接收属于线程的所有窗口的窗口消息
            UINT wMsgFilterMin,    //获取的消息的最小值(通常设为0)
            UINT wMsgFileterMax    //获取的消息的最大值(两个值都设为0,则接收所有消息
        )

        获取消息还可以调用PeekMessage函数
        BOOL PeekMessage
       (
            LPMSG
lpMsg,  //指向一个消息结构体,GetMessage从线程的消息队列中取出的消息信息将保存在该结构体对象中
            HWND hWnd,    //指定接收属于哪个窗口的消息。(通常设为NULL,用于接收属于线程的所有窗口的窗口消息
            UINT wMsgFilterMin,    //获取的消息的最小值(通常设为0)
            UINT wMsgFileterMax,    //获取的消息的最大值(两个值都设为0,则接收所有消息
            UINT wRemoveMsg    //指定消息获取方式 PM_NOREMOVE表示不会从消息队列移除,PM_REMOVE会移除(和GetMessage一致)
        )

        发送消息可以用SendMessage函数,将消息直接发送给窗口,不进消息队列
                      PostMessage函数,将消息放入与创建窗口的线程相关联的消息队列后立即返回
                      PostThredMessage函数,用于向线程发送消息
    (4)编写窗口过程函数
        LRESULT CALLBACK WindowPRoc
       (
            HWND hwnd,
            UINT uMsg,//消息代码
            WPARAM wParam,
            LPARAM lParam 
        )
8、TranslateMessage(&msg)函数用于将虚拟键消息转换为字符信息
   DispatchMessage(&msg) 函数分配一个一个消息到窗口过程,由窗口过程函数对消息进行处理(实际中间还有给操作系统环节)
9、为什么要重绘?因为保存窗口中的图形数据涉及的数据量太大,为了节省内存,提高效率,我们采用重绘的方式。
10、变量的命名约定(匈牙利表示法)
    a    数组
    b    布尔值
    by   无符号字符
    c    字符
    cb   字节记数
    rgb  保存RGB颜色值的长整型
    cx,cy 短整型(计算x,y的长度)
    dw   无符号长整型
    fn   函数
    h    句柄
    i    整数
    m_   类的数据成员
    n    短整型或整型
    np   近指针
    p    指针
    l    长整型
    lp   长指针
    s    字符串
    sz   以零结束的字符串
    tm   正文大小
    w    无符号整数
    x,y  无符号整数(表示x或y坐标)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息