win32Api 消息 IO

来源:互联网 发布:数据库查询软件密码 编辑:程序博客网 时间:2024/05/18 02:36

创建一个窗体得过程
         //1    注册
         //2  创建
         //3  处理消息
            用户一般也是把消息取出来(GetMessage),调用WindowProc处理.(只能
        使用CallWindowProc调用,但一般调用他的封装函数DispatchMessage)
        DispatchMessage首先解析lpmsg的窗口过程,然后在调用CallWindowProc。
    int MessageBox(
      HWND hWnd,          //提示窗体的父窗体
      LPCTSTR lpText,     //提示的文本
      LPCTSTR lpCaption,  //标题
      UINT uType          //按钮样式
    );
   
    int WINAPI WinMain(
      HINSTANCE hInstance,      //程序的初始化地址
      HINSTANCE hPrevInstance,  //永远不用
      LPSTR lpCmdLine,          //命令行
      int nCmdShow              //窗体显示的样式
    );
    1.先定义后注册。   
    typedef struct _WNDCLASS {
            UINT       style;         //窗体的样式(*)    CS_VREDRAW | CS_HREDRAW
            WNDPROC    lpfnWndProc;     //处理窗体的交互事件(*)
            int        cbClsExtra;         //注册类的系统分配空间 0
            int        cbWndExtra;         //系统为窗口数据分配的空间 0
            HINSTANCE  hInstance;         //程序的内存地址(WinMain传递)
            HICON      hIcon;         //窗口图标    (0/NULL)
            HCURSOR    hCursor;         //鼠标光标(0/NULL)
            HBRUSH     hbrBackground;     //背景颜色(*)
            LPCTSTR    lpszMenuName;    //菜单 (0/NULL)
            LPCTSTR    lpszClassName;     //注册名(*)
    } WNDCLASS, *PWNDCLASS;
    ATOM RegisterClass(
          CONST WNDCLASS *lpWndClass  // 注册窗口类的数据参数
        );     
    2.创建   
    HWND CreateWindow(
      LPCTSTR lpClassName,  // 使用RegisterClass注册的名字
      LPCTSTR lpWindowName, // 窗体的标题文本
      DWORD dwStyle,        // 窗体样式
      int x,                // 窗体的x-坐标
      int y,                // 窗体的y-坐标
      int nWidth,           // 窗体宽度
      int nHeight,          // 窗体的高度
      HWND hWndParent,      // 窗体的父窗体
      HMENU hMenu,          // 窗体菜单
      HINSTANCE hInstance,  // 应用程序的句柄
      LPVOID lpParam        // 创建窗体的数据(对MDI窗体有意义)0
    );
    3.消息处理
    先获取,在发送
    BOOL GetMessage(
      LPMSG lpMsg,         // 返回消息
      HWND hWnd,           // 指定消息所属的窗体,如果是NULL,则取所有消息
      UINT wMsgFilterMin,  // 消息最小值  0
      UINT wMsgFilterMax   // 消息最大值        0
    );
    LRESULT DispatchMessage(
      CONST MSG *lpmsg   // message information
    );
    DispatchMessage首先解析lpmsg的窗口过程,然后在调用CallWindowProc
******************
控制台输出的应用   
*****************************************************************************************************
    1.创建控制台
            BOOL AllocConsole(void);创建控制台
            BOOL FreeConsole(VOID);用完释放控制台
    2.获取需要的IO句柄
                HANDLE GetStdHandle(
                  DWORD nStdHandle   // input, output, or error device
                );
                返回:控制台IO句柄
                参数:指定控制台IO的类型:标准输入/标准输出/标准错误输出
                STD_INPUT_HANDLE Standard input handle
                STD_OUTPUT_HANDLE Standard output handle
                STD_ERROR_HANDLE Standard error handle
    3.控制台输出
                BOOL WriteConsole(
                  HANDLE hConsoleOutput,           // 控制台句柄
                  CONST VOID *lpBuffer,            // 输出数据的缓冲
                  DWORD nNumberOfCharsToWrite,     // 输出数据大小
                  LPDWORD lpNumberOfCharsWritten,  // 返回实际输出的数据个数
                  LPVOID lpReserved                // 永远不使用
                );
***********
消息处理               
****************************************************************************************************
一、WM_PAINT的工作原理:
            BeginPaint    InvalidateRect  ValidateRect
             EndPaint     InvalidateRgn      ValidateRgn    
        1.WM_PAINT没有参数,但是依赖一个绘制区数据结构.PAINTSTRUCT
                他们之间的关系:WM_PAINT触发,必须存在PAINTSTRUCT结构
                如果存在PAINTSTRUCT结构,则系统回自动发送WM_PAINT消息
        2.BeginPaint/EndPaint与WM_PAINT的关系
                BeginPaint/EndPaint获取WM_PAINT对应的绘制结构PAINTSTRUCT
                返回HDC.
                如果WM_PAINT对应的PAINTSTRUCT是空,则BeginPaint返回0
        3.强制调用WM_PAINT的消息处理:
                PostMessage发送消息
                UpdateWindow完成
                RedrawWindow完成
                前面两个函数可以强制发送消息,但是没有绘制结构PAINTSTRUCT   
                推荐:InvalidateRect/InvalidateRgn产生一个绘制区.
        4.动画编程模型:
                1.在定时器过程改变数据y+=3,并且设置绘制的无效区InvalidateRect,
                    同时强制更新窗体UpdateWindow
                2.在WM_PAINT主要根据数据进行绘制工作
    =================================================================================================
    1.WM_PAINT://当窗体大小/位置改变的时候,该消息被系统使用PostMessage发送   
        a.WM_PAINT不能使用SendMessage发送
        b.WM_PAINT优先级别比较低的消息
        c.WM_PAINT的参数(没有使用)
        d.WM_PAINT的返回值:0:表示已经处理
    2.利用WM_PAINT绘制图形与文本
        在WIN32设备指针 HDC.所有绘制函数都需要一个HDC参数.
    每个窗都有一个HDC.可以通过CS_OWNDC来指定. 否则所有公用DC.
        2.1.得到窗口的HDC
                HDC BeginPaint(
                  HWND hwnd,            // 绘制所在窗口句柄
                  LPPAINTSTRUCT lpPaint // 结构体指针(地址)
                );
                返回:HDC/有效绘制区域LPPAINTSTRUCT lpPaint
                该函数必要与EndPaint匹配使用                   
        2.2.TextOut文本绘制
            BOOL TextOut(
              HDC hdc,           // 绘制设备(隶属于某个窗口)
              int nXStart,       // 绘制的位置
              int nYStart,       // 绘制的位置
              LPCTSTR lpString,  // 绘制的字符串
              int cbString       // 绘制的字符串长度
            );   
        3.3释放HDC及绘制区域结构体
            ReleaseDC(hwnd,hDc);
            EndPaint(hwnd,&ps);           
@文本绘制
***************************************************************************************************
1.背景颜色
    COLORREF SetBkColor(
      HDC hdc,           // handle to DC
      COLORREF crColor   // background color value
    );
        其返回值为原来背景颜色
    并可设置背景模式:默认为透明
    int SetBkMode(
      HDC hdc,      // handle to DC
      int iBkMode   // background mode
    );
    设置背景模式:透明TRANSPARENT  不透明OPAQUE
2.创建字体
    HFONT CreateFont(
      int nHeight,               // 字体高度
      int nWidth,                // 字体的宽度(平均)
      int nEscapement,           // 角度(1/10度)
      int nOrientation,          // 角度(1/10度)
      int fnWeight,              // 字体的粗细(系统规定)
      DWORD fdwItalic,           // 斜体
      DWORD fdwUnderline,        // 下划线
      DWORD fdwStrikeOut,        // 中划线
      DWORD fdwCharSet,          // 字符集(系统固定)
      DWORD fdwOutputPrecision,  // 输出精度
      DWORD fdwClipPrecision,    // 裁减精度
      DWORD fdwQuality,          // 输出质量
      DWORD fdwPitchAndFamily,   // pitch and family
      LPCTSTR lpszFace           // "字体名"
    );
    创建完成,选择为设备,设置字体:SelectObject
    HGDIOBJ SelectObject(
      HDC hdc,          // handle to DC
      HGDIOBJ hgdiobj   // handle to object
    );
    HGDIOBJ:HFONT  HBRUSH  HPEN HBITMAP    
3.文本颜色
    COLORREF SetTextColor(
      HDC hdc,           // handle to DC
      COLORREF crColor   // text color
    );
4.坐标系以及坐标的单位度量
    默认坐标轴:单位象素,下,右(设备坐标)
    坐标轴修改使用SetMapMode.(逻辑坐标/设备坐标)   
    绘制中使用逻辑坐标系,设置坐标模式
    int SetMapMode(
      HDC hdc,        // handle to device context
      int fnMapMode   // new mapping mode
    );
    下面两个是用户自定义坐标(坐标系方向/单位)
    MM_ANISOTROPIC  MM_ISOTROPIC   
    下面六种情况不能修改坐标系,不能修改单位
    MM_HIENGLISH  0.001 inch      上 右
    MM_HIMETRIC   0.01  mm       上 右
    MM_LOENGLISH   0.01 inch       上 右   
    MM_LOMETRIC    0.1 mm       上 右
    MM_TWIPS       1/1440 inch     上 右   
    MM_TEXT    与设备坐标系一直     下 右

5.文本的对齐方式
    SetTextAlign
6.位置(在    TextOut函数参数指定)
    下面六个函数受文本对齐影响
    a.TextOut
    b.ExtTextOut
        BOOL ExtTextOut(
          HDC hdc,          // 绘制DC
          int X,            // 绘制的开始位置-x
          int Y,            // 绘制的开始位置-y
          UINT fuOptions,   // 控制文本输出的方式:ETO_OPAQUE  ETO_CLIPPED
          CONST RECT* lprc, // 绘制的区域
          LPCTSTR lpString, // 绘制的字符串
          UINT cbCount,     // 绘制的字符串的长度
          CONST INT* lpDx   // 输出的字符之间的间距
        );
    c.DrawText  (比较上面的函数,多一个主要功能:支持tab键,并且可以控制tab的宽度)
        int DrawText(
          HDC hDC,          // handle to DC
          LPCTSTR lpString, // 绘制的字符串
          int nCount,       // 绘制的长度
          LPRECT lpRect,    // 绘制区域
          UINT uFormat      // 绘制选项
        );
    UINT uFormat      // 绘制选项
        控制位置:
                DT_CENTER
                DT_LEFT
                DT_RIGHT
               
            只有加上DT_SINGLELINE选项有效
                DT_VCENTER
                DT_TOP
                DT_BOTTOM
        控制/n与/t
                DT_SINGLELINE不支持/n
                默认不支持/t但支持/n.               
    d.DrawTextEx
        int DrawTextEx(
          HDC hdc,                     // handle to DC
          LPTSTR lpchText,             // 绘制字符串
          int cchText,                 // 绘制长度
          LPRECT lprc,                 // 绘制区域
          UINT dwDTFormat,             // 格式选项
          LPDRAWTEXTPARAMS lpDTParams  // 扩展格式
        );   
    typedef struct {
      UINT cbSize; //结构体大小
      int  iTabLength; //tab键的长度   
                  //(不能小于默认的tab的字符个数)
                  //受DT_TABSTOP影响
      int  iLeftMargin;         左边界
      int  iRightMargin;         有边界
      UINT uiLengthDrawn;     //返回实际的长度
    } DRAWTEXTPARAMS, *LPDRAWTEXTPARAMS;
    e.PolyTextOut
            可以输出多个不同位置的字符串
            在TextOut基础上可以输出多个字符串           
    f.TabbedTextout
            在TextOut基础上增强/t的输出
@图型绘制
****************************************************************************************************           
1.点的绘制SetPixel   
            COLORREF SetPixel(
              HDC hdc,           // handle to DC
              int X,             // x-coordinate of pixel
              int Y,             // y-coordinate of pixel
              COLORREF crColor   // pixel color
            );
2.线的绘制(受Pen影响)
    定位MoveToEx  如果不定位,默认的位置是(0,0) 或者当前位置
    BOOL MoveToEx(
      HDC hdc,          // handle to device context
      int X,            // x-coordinate of new current position
      int Y,            // y-coordinate of new current position
      LPPOINT lpPoint   // 返回原来的当前点,不返回则设置为NULL/0
    );           
    a.直线LineTo
    BOOL LineTo(
      HDC hdc,    // device context handle
      int nXEnd,  // x-coordinate of ending point
      int nYEnd   // y-coordinate of ending point
    );
    线段Polyline  PolylineTo
    b.弧线Arc  ArcTo
    BOOL Arc(
      HDC hdc,         // handle to device context
      int nLeftRect,   // 弧外切的矩形的左上角顶点-x
      int nTopRect,    // 弧外切的矩形的左上角顶点-y
      int nRightRect,  // 弧外切的矩形的右下角顶点-x
      int nBottomRect, // 弧外切的矩形的右下角顶点-y
      int nXStartArc,  // x-coord of first radial ending point
      int nYStartArc,  // y-coord of first radial ending point
      int nXEndArc,    // x-coord of second radial ending point
      int nYEndArc     // y-coord of second radial ending point
    );
    角度的方向:逆时针,改变角度方向
        int SetArcDirection(
          HDC hdc,           // handle to device context
          int ArcDirection   // new arc direction
        );
            AD_COUNTERCLOCKWISE 反时针
            AD_CLOCKWISE 顺时针
    c.曲线PolyBezier  PolyBezierTo
    BOOL PolyBezier(
      HDC hdc,            //
      CONST POINT* lppt,  // 贝塞儿曲线的控制点
      DWORD cPoints       // count of endpoints and control points
    );   
3.区域的填充绘制(受Brush影响)
    HDC=BeginPaint
    HDC=GetDC
    HDC=GetWindowDC
    Brush的创建与设置        CreateSolidBrush实心刷子    CreateHatchBrush形状刷子
    HBRUSH CreateSolidBrush(
      COLORREF crColor   // brush color value
    );
    HGDIOBJ SelectObject(
      HDC hdc,          // handle to DC
      HGDIOBJ hgdiobj   // handle to object
    );
    =============================================   
    补充:
            创建Pen    :CreatePen
            HPEN CreatePen(
              int fnPenStyle,    // 系统定义的样式
              int nWidth,        // 宽度
              COLORREF crColor   // 颜色
            );
            设置Pen    :SelectObject       
    =============================================
    a.矩形区域    Ellipse   
        BOOL Ellipse(
          HDC hdc,        // handle to DC
          int nLeftRect,  // x-coord of upper-left corner of rectangle
          int nTopRect,   // y-coord of upper-left corner of rectangle
          int nRightRect, // x-coord of lower-right corner of rectangle
          int nBottomRect // y-coord of lower-right corner of rectangle
        );       
        背景颜色的影响    PEN的影响    BRUSH的影响
        int FillRect(
          HDC hDC,           //
          CONST RECT *lprc,  // 绘制区域
          HBRUSH hbr         // 区域填充刷子
        );       
        HDC的刷子对FillRect没有影响,而对参数指定的刷子有影响.
            FrameRect
            InvertRect
            RoundRect
       
    b.弧        Chrod        Pie       
        BOOL Chord(
          HDC hdc,         // handle to DC
          int nLeftRect,   // x-coord of upper-left corner of rectangle
          int nTopRect,    // y-coord of upper-left corner of rectangle
          int nRightRect,  // x-coord of lower-right corner of rectangle
          int nBottomRect, // y-coord of lower-right corner of rectangle
          int nXRadial1,   // x-coord of first radial's endpoint
          int nYRadial1,   // y-coord of first radial's endpoint
          int nXRadial2,   // x-coord of second radial's endpoint
          int nYRadial2    // y-coord of second radial's endpoint
        );           
        BOOL Pie(
          HDC hdc,         // handle to DC
          int nLeftRect,   // x-coord of upper-left corner of rectangle
          int nTopRect,    // y-coord of upper-left corner of rectangle
          int nRightRect,  // x-coord of lower-right corner of rectangle
          int nBottomRect, // y-coord of lower-right corner of rectangle
          int nXRadial1,   // x-coord of first radial's endpoint
          int nYRadial1,   // y-coord of first radial's endpoint
          int nXRadial2,   // x-coord of second radial's endpoint
          int nYRadial2    // y-coord of second radial's endpoint
        );   
               
    c.多边形区域    Polygon(一个多边形)    PolyPolygon(多个多边形)   
        BOOL Polygon(
          HDC hdc,                // handle to DC
          CONST POINT *lpPoints,  // polygon vertices
          int nCount              // count of polygon vertices
        );   
        BOOL PolyPolygon(
          HDC hdc,                  // handle to DC
          CONST POINT *lpPoints,    // 顶点
          CONST INT *lpPolyCounts,  // 顶点分组以及每组个数
          int nCount                // 多边形的个数
        );
4.用户自定义坐标轴
        坐标轴原点SetWindowOrgEx   设置设备坐标的原点在窗口的位置
                        SetViewportOrgEx     设置逻辑坐标的原点在设备坐标中的位置
        坐标轴单位SetWindowExtEx   SetViewportExtEx
        坐标轴方向SetWindowExtEx   SetViewportExtEx (通过正负决定方向)
           

    修改坐标轴的函数    SetMapMode  SetWindowExtEx     SetWindowOrgEx   
    SetViewportExtEx  SetViewportOrgEx   

    BOOL SetWindowOrgEx(
      HDC hdc,        //
      int X,          // 新的原点
      int Y,          // 新的原点
      LPPOINT lpPoint // 返回就的原点
    );
   
    BOOL SetViewportExtEx(
      HDC hdc,       // handle to device context
      int nXExtent,  // x坐标单位
      int nYExtent,  // y坐标单位
      LPSIZE lpSize  // original viewport extent
    );
*********************************************************************************************
二、WM_TIMER定时器   
    1.创建一个定时器(一般在创建消息WM_CREATE里创建)
    2.处理定时器发生的过程    SetTimer
            UINT_PTR SetTimer(
                HWND hWnd,              // handle to window
                UINT_PTR nIDEvent,      // timer identifier
                UINT uElapse,           // time-out value
                TIMERPROC lpTimerFunc   // timer procedure
            );
            删除定时器KillTimer

*********************************************************************************************
三、鼠标消息
1.类型:
    WM_CAPTURECHANGED
    M_MOUSEACTIVATE
2.返回值及参数:
    鼠标消息的返回值:0表示已经处理消息
    鼠标消息的参数:WPARAM:鼠标消息触发的时候按键状态:SHIFT/CONTROL
        LPARAM:存放的鼠标的x,y坐标.高的2个字节存放的是y坐标,低的2个字节存放的是x坐标
        WM_NCLBUTTONDBLCLK消息缺省处理的时候,发送WM_CLOSE的消息
    所有的鼠标消息都是由WM_NCHITEST发出的.
    ===============================================================
    #pragma 指令
        C标准定义预处理指令,考虑编译器厂商的扩展.扩展由#pragma实现.
    ===============================================================
    判定系统的鼠标支持:
    int GetSystemMetrics(
      int nIndex   // system metric or configuration setting
    );
    SM_CMOUSEBUTTONS//返回鼠标的支持的按键的个数
    SM_CXSCREEN,//获得屏幕的大小width
    SM_CYSCREEN//获得屏幕的大小height
    SM_MOUSEPRESENT //系统是否安装鼠标
    SM_MOUSEWHEELPRESENT//鼠标是否支持滚轮   
****************************************************************************************************
四、键盘消息
        WM_KEYDOWN    WM_SYSCHAR            WM_ACTIVATE   
        WM_KEYUP        WM_SYSKEYDOWN        WM_KILLFOCUS
        WM_CHAR            WM_SYSKEYU        WM_SETFOCUS
        ===============================================
        实验1:体会WM_ACTIVATE       
                            WM_KILLFOCUS
                            WM_SETFOCUS消息触发的条件
        Activate(Click)->Focus->Inactivate->KillFocus
        实验2:体会
            WM_SYSCHAR       
            WM_SYSKEYDOWN  alt/alt+key
            WM_SYSKEYUP消息触发条件
        实验3:
            理解WM_KEYDOWN/WM_KEYUP/WM_CHAR 消息的数据
        ================================================       
        虚拟键:大部分的键的ASCII与Virtual Key一一对应.
        windows.h为各个虚拟键定义了各自的宏VK_*.
                            wParam  short     --WM_KEYDOWN的键值
                            lParam    int            --存放的按键的状态
           
        可以通过wParam得到键盘的按键.
            WM_KEYDOWN/WM_CHAR中键值的区别.

        1.VK_***把所有虚拟键值定义宏    viturl key       
        2.CTRL+shift键的处理
                GetKeyState()    <0 按下、   >=0 释放
********************               
使用资源创建对话框.   
*****************************************************************************************************

    1.创建对话框资源
        a.CLASS设置与ID名一致
        b.STYLE设置:对话框样式/窗体样式(CreateWindow)
        按钮的扩展样式
                决定按钮类型的扩展样式,只能选一
                    BS_PUSHBUTTON            (空格)        BS_DEFPUSHBUTTON(回车都会触发消息)               
                    BS_CHECKBOX(程序员处理选择)    BS_AUTOCHECKBOX(自动选择)
                    BS_RADIOBUTTON(程序员处理选择)    BS_AUTORADIOBUTTON(自动选择)
                    BS_3STATE(三维样式)    BS_AUTO3STATE               
                    BS_GROUPBOX分组控件(主要对收音机按钮设计)
                下面样式可以随意选择   
                    BS_LEFTTEXT    (主要对单选与多选按钮)    BS_RIGHTBUTTON           
                    BS_FLAT    BS_TOP    BS_LEFT    BS_RIGHT    BS_CENETER    BS_VCEENTER
                    BS_BITMAP    BS_BOTTOM    BS_TEXT    BS_ICON           
                    BS_MULTILINE  默认不支持/n字符,该样式支持/n字符
    2.写代码使用资源注册窗体
    3.创建窗体
        HWND CreateDialog(
              HINSTANCE hInstance,  // 实例句柄
              LPCTSTR lpTemplate,   // 注册类名
              HWND hWndParent,      // 父窗体句柄
              DLGPROC lpDialogFunc  // 消息处理过程
        );

    资源创建的控件        没有HWND,有ID
    运行时创建的控件        没有ID,有HWND   
****************   
对话框与菜单资源
****************************************************************************************************
对话框的创建的方法:
            1.运行时创建(函数)
            2.设计时创建(资源)           
对话框的创建:CreateWindow不适合创建对话框.
                CreateDialog (非模式对话框   主窗体)
                DialogBox(模式对话框)
                MessageBox(特殊用途的模式对话框)
对话框类型:    模式对话框    非模式对话框       
    编程模式:
            1.CreateDialog+资源=创建主窗体       
                1.1.制作对话框资源
                1.2.使用RegisterClass注册主窗体类
                1.3.使用CreateDialog产生主窗体
               
                CreateDialog+资源=创建非模式对话框
                1.1.制作对话框资源
                1.2.直接使用CreateDialog产生非模式对话框
               
            2.DialogBox+资源=模式对话框
                2.1.制作对话框资源
                2.2.使用DialogBox创建模式对话框   
窗体消息处理与对话框消息处理的区别:               
            1.主窗体必须注册,消息处理函数在注册的时候指定。
            2.对话框处理函数与窗体的消息处理函数不同的。
                case WM_CREATE:
                INT_PTR CALLBACK DialogProc(
                    HWND hwndDlg,  // handle to dialog box
                    UINT uMsg,     // message
                    WPARAM wParam, // first message parameter
                    LPARAM lParam  // second message parameter
                );
                return DefWindowProc;
               
                case WM_INITDIALOG:
                LRESULT CALLBACK MainWinProc(
                    HWND hwnd,
                    UINT uMsg,
                    WPARAM wParam,
                    LPARAM lParam
                );
                return DefDlgProc;                       
           
            3.窗体的缺省处理与对话框的缺省处理不一样的。
            比如:
            WM_CLOSE:关闭窗体/    发送WM_DESTROY消息
            在对话框中,不进行任何处理:用户自己决定destroy还是隐藏
            建议对话框的处理尽量用户自己处理。
            而不是调用DefDlgProc处理    .
            4.对话框不需要注册。
            5.对话框创建的消息是WM_INITDIALOG不是WM_CREATE
            6.CreateDialog的时候,这个函数马上返回。而且返回对话框的HWND
           
            7.CreateDialog与DialogBox的函数区别
            INT_PTR DialogBox(
                HINSTANCE hInstance,  // handle to module
                LPCTSTR lpTemplate,   // dialog box template
                HWND hWndParent,      // handle to owner window
                DLGPROC lpDialogFunc  // dialog box procedure
            );
            这个函数创建对话框以后不马上返回,而是在对话框消息处理函数
            中调用EndDialog才返回。
            BOOL EndDialog(
                HWND hDlg,        // handle to dialog box
                INT_PTR nResult   // 与DialogBox的返回值一样
            );
           
            HWND CreateDialog(
                HINSTANCE hInstance,  // handle to module
                LPCTSTR lpTemplate,   // dialog box template name
                HWND hWndParent,      // handle to owner window
                DLGPROC lpDialogFunc  // dialog box procedure
            );
           
            对话框的操作:
            GetDlgItemText    SetDlgItemText    GetDlgItem    GetDlgItemInt
            SendDlgItemMessage    SetDlgItemInt   
**********************************
Win32的IO操作(文件与目录管理, IO)
****************************************************************************************************

    编程模型:
        写文件                    读文件 CreateFile
                创建/打开文件
        写文件                    读文件
                  关闭文件                             
    HANDLE CreateFile(
      LPCTSTR lpFileName,                         // 文件名
      DWORD dwDesiredAccess,                      // 访问模式
      DWORD dwShareMode,                          // 共享
      LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 安全属性,建议采用默认属性 0
      DWORD dwCreationDisposition,                // 创建与打开方式
      DWORD dwFlagsAndAttributes,                 // 属性
      HANDLE hTemplateFile                        // 临时备份,建议为NULL/0
    );
    ======================================================       
    访问模式
                0 非读写,只能获取文件属性
                GENERIC_READ      GENERIC_WRITE               
    共享模式
                FILE_SHARE_READ    FILE_SHARE_WRITE(建议不要使用)
                       
    创建与打开方式
                CREATE_NEW    CREATE_ALWAYS
                OPEN_EXISTING    OPEN_ALWAYS
                TRUNCATE_EXISTING(建议不要使用)
    文件属性
                FILE_ATTRIBUTE_NORMAL(建议使用)
    ======================================================           
    BOOL WriteFile(
      HANDLE hFile,                    // 写的文件
      LPCVOID lpBuffer,                // 写的数据
      DWORD nNumberOfBytesToWrite,     // 写的数据大小
      LPDWORD lpNumberOfBytesWritten,  // 返回实际写的数据大小(必须返回)
      LPOVERLAPPED lpOverlapped        // 建议为0,只有当CreateFile时候指定FILE_FLAG_OVERLAPPED
    );           
               
    BOOL ReadFile(
      HANDLE hFile,                // 文件句柄
      LPVOID lpBuffer,             // 读取缓冲
      DWORD nNumberOfBytesToRead,  // 缓冲大小
      LPDWORD lpNumberOfBytesRead, // 实际读取的大小
      LPOVERLAPPED lpOverlapped    // 0
    );、
******************************
WIN32虚拟内存与文件映射
****************************************************************************************************
        Win32采用虚拟地址
        虚拟地址只有映射到物理存储才能访问,否则段错误.
        可以映射哪些物理存储:内存/磁盘文件/匿名映射
        编程步骤:
                1.打开文件CreateFile
                2.创建内核映射对象CreateFileMapping
                3.把映射对象转换为虚拟地址    MapViewOfFile
                4.卸载虚拟地址与文件映射UnmapViewOfFile
                5.删除释放内核映射对象CloseHandle
                6.关闭文件CloseHandle
        LPVOID VirtualAlloc(
          LPVOID lpAddress,        // 申请内存的开始位置,如果为NULL,则由系统随机指定
          SIZE_T dwSize,           // 申请的内存空间大小
          DWORD flAllocationType,  // 申请内存的方式MEM_COMMIT等
          DWORD flProtect          // 内存的保护模式PAGE_READONLY
        );               
        HANDLE CreateFileMapping(
          HANDLE hFile,                       // 文件句柄
          LPSECURITY_ATTRIBUTES lpAttributes, // 默认为NULL
          DWORD flProtect,                    // 保护模式
          DWORD dwMaximumSizeHigh,            // 文件映射的大小(对32系统永远是0)
          DWORD dwMaximumSizeLow,             // 文件映射的大小(32) 0:映射全部文件
          LPCTSTR lpName                      // 文件映射的内核内部名
        );           
        可以根据名字查找内核对象:OpenFileMapping
        LPVOID MapViewOfFile(
          HANDLE hFileMappingObject,   // 内核映射对象
          DWORD dwDesiredAccess,       // 访问模式
          DWORD dwFileOffsetHigh,      // 永远是0
          DWORD dwFileOffsetLow,            
怎么判定读取到文件尾巴
            1.ReadFile返回False
            2.使用GetLastError返回错误码:ERROR_HANDLE_EOF读取文件尾巴