VC学习日志--摘录(12.10)

1. VCwinmain()函数的定义

WinMain函数的定义WinMain函数的原型声明如下:
int WINAPI WinMain(
    HINSTANCE hInstance,        // handle to current instance
    HINSTANCE hPrevInstance, // handle to previousinstance
    LPSTR lpCmdLine,              //command line
    int nCmdShow                  //show state
);
WinMain
函数接收4个参数,这些参数都是在系统调用WinMain函数时,传递给应用程序的。
一个参数hInstance表示该程序当前运行的实例的句柄,这是一个数值。当程序在Windows下运行时,它唯一标识运行中的实例(注意,只有运行中 的程序实例,才有实例句柄)。一个应用程序可以运行多个实例,每运行一个实例,系统都会给该实例分配一个句柄值,并通过hInstance参数传递给WinMain函数。
第二个参数hPrevInstance表示当前实例的前一个实例的句柄。通过查看MSDN我们可以知道,在Win32环境下,这个参数总是NULL,即在Win32环境下,这个参数不再起作用。
第三个参数lpCmdLine 一个以空终止的字符串,指定传递给应用程序的命令行参数。例如:在D盘下有一个sunxin.txt文件,当我们用鼠标双击这个文件时将启动记事本程序 notepad.exe),此时系统会将D:/sunxin.txt作为命令行参数传递给记事本程序的WinMain函数,记事本程序在得到这个文件的 全路径名后,就在窗口中显示该文件的内容。要在VC++开发环境中向应用程序传递参数,可以单击菜单【ProjectSettings】,选择“Debug”选项卡,在“Program arguments”编辑框中输入你想传递给应用程序的参数。
第四个参数nCmdShow指定程序的窗口应该如何显示,例如最大化、最小化、隐藏等。这个参数的值由该程序的调用者所指定,应用程序通常不需要去理会这个参数的值。
2. WNDCLASS
结构体的定义(经常用到类似于WNDCLASS hwind)
WNDCLASS
是一个由系统支持的结构,用来储存某一类窗口的信息,ClassStyle,消息处理函数,Icon,Cursor,背景Brush等。也就是说,CreateWindow只是将某个WNDCLASS定义的窗体变成实例。
3. WNDCLASS
应该如何应用
Windows中运行的程序,大多数都有一个或几个可以看得见的窗口,而在这些窗口被创建起来之前,操作系统怎么知道该怎样创建该窗口,以及用户操作该窗 口的各种消息交给谁处理呢?所以VC在调用WindowsAPICreateWindow或者CreateWindowEx)创建窗口之前,要求程序 员必须定义一个窗口类(不是传统C++意义上的类)来规定所创建该窗口所需要的各种信息,主要包括:窗口的消息处理函数、窗口的风格、图标、  鼠标、菜单等。其定义如下:  
  typedef   struct   tagWNDCLASSA(
注:该结构为ANSII版本)  
    
  {  
    
                    UINT                    style   ;  
    
                    WNDPROC              lpfnWndProc   ;  
    
                    int                      cbClsExtra   ;  
    
                    int                      cbWndExtra   ;  
    
                    HINSTANCE        hInstance   ;  
    
                    HICON                  hIcon   ;  
    
                    HCURSOR            hCursor   ;  
    
                    HBRUSH                hbrBackground   ;  
    
                    LPCSTR      lpszMenuName   ;  
    
                    LPCSTR        lpszClassName   ;  
    
  }  
    
  WNDCLASSA,   *   PWNDCLASSA,  NEAR   *   NPWNDCLASSA,   FAR  *   LPWNDCLASSA   ;  
    
  style                
表示该类窗口的风格,如style  =   CS_VREDRAW|CS_HREDRAW表示窗口在运动或者调整大小时需要重画,关于其它风格可在  MSDN中查到。  
    
  lpfnWndProc
为一指针,指向用户定义的该窗口的消息处理函数。  
    
  cbClsExtra    
用于在窗口类结构中保留一定空间,用于存在自己需要的某些信息。  
    
  cbWndExtra
用于在Windows内部保存的窗口结构中保留一定空间。  
    
  hInstance      
表示创建该窗口的程序的运行实体代号(WinMain的参数之一)。  
    
  hIcon
hCursorhbrBackgroundlpszMenuName分别表示该窗口的图标、鼠标形状、背景色以及菜单。  
    
  lpszClassName
表示该窗口类别的名称,即标识该窗口类的标志。  

          
从上面可以看出一个窗口类就对应一个WNDCLASSA结构(这里以ANSII为例),当程序员将该结构按自己要求 填写完成后,就可以调用RegisterClass(RegisterClassEx)函数将该类注册,这样以后凡是要创建该窗口,只需要以该类名 lpszClassName中指定)为参数调用CreateWindow,你看多方便呀,真是一举多得啊!
4. DECLARE_HANDLE()
宏定义的解释(哈哈,原来如此)
#define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef structname##__ *name

HBITMAP做为参数展开这个宏,发现HBITMAP的定义是这样一个形式:
                              structHBITMAP__ //
奇怪的是此处为什么用HBITMAP__,另个__作甚??
                          {
                              intunused;
                          };

                          typedefstruct HBITMAP__ *HBITMAP
5. CreatFile
的解释
先看CreatFile的定义:(typdefvoid* HANDLE)
HANDLE   CreateFile(  
      LPCTSTR  lpFileName,                  //  pointer   to   name   of  the   file  
      DWORD  dwDesiredAccess,              //   access   (read-write)   mode  
      DWORD  dwShareMode,                  //   share   mode  
      LPSECURITY_ATTRIBUTES  lpSecurityAttributes,  
                                            //   pointer   to   security  attributes  
      DWORD  dwCreationDisposition,        //   how   to   create  
      DWORD  dwFlagsAndAttributes,          //  file   attributes  
      HANDLE  hTemplateFile                //   handle   to   file  with   attributes   to
                                            //   copy
  );
再看一个引用例子:
m_hCom   =   CreateFile("COM1",
                        GENERIC_READ   |   GENERIC_WRITE,  
                        0,         /*  comm   devices   must   be  opened   w/exclusive   -access   *///
串口必须是打开的  
                        NULL,   /*   no   security  attrs   *///
没有安全属性FILE_ATTRIBUTE_NORMAL  |    
                        OPEN_EXISTING,   /*   comm   devices  must   use   OPEN_EXISTING   *///
必须用OPEN_EXISTING
                        FILE_FLAG_OVERLAPPED,        /*   overlapped   I/O   */  
                        NULL     /*   hTemplate  must   be   NULL   for  comm   devices   *///  
必须为NULL
                          );
更为详细的解释:
CreateFile
函数创建或打开下列对象,并返回一个可以用来访问这些对象的句柄。
文件
pipes
邮槽
通信资源
磁盘驱动器(仅适用于windowsNT
控制台
文件夹(仅用于打开)
HANDLE CreateFile(
LPCTSTR lpFileName,    //
指向文件名的指针
DWORD dwDesiredAccess,    //
访问模式(写 / 读)
DWORD dwShareMode,    //
共享模式
LPSECURITY_ATTRIBUTES lpSecurityAttributes, //
指向安全属性的指针
DWORD dwCreationDisposition,   //
如何创建
DWORD dwFlagsAndAttributes,   //
文件属性
HANDLE hTemplateFile    //
用于复制文件句柄
);
Parametes
参数列表
参数
类型及说明
lpFileName
String
,要打开的文件的名字
dwDesiredAccess
Long
,如果为 GENERIC_READ 表示允许对设备进行读访问;如果为GENERIC_WRITE 表示允许对设备进行写访问(可组合使用);如果为零,表示只允许获取与一个设备有关的信息
dwShareMode
Long
,零表示不共享; FILE_SHARE_READ / FILE_SHARE_WRITE 表示允许对文件进行共享访问
lpSecurityAttributes
SECURITY_ATTRIBUTES
,指向一个 SECURITY_ATTRIBUTES 结构的指针,定义了文件的安全特性(如果操作系统支持的话)
dwCreationDisposition
Long
,下述常数之一:
CREATE_NEW
创建文件;如文件存在则会出错
CREATE_ALWAYS
创建文件,会改写前一个文件
OPEN_EXISTING
文件必须已经存在。由设备提出要求
OPEN_ALWAYS
如文件不存在则创建它
TRUNCATE_EXISTING
讲现有文件缩短为零长度
dwFlagsAndAttributes
Long
,一个或多个下述常数
FILE_ATTRIBUTE_ARCHIVE
标记归档属性
FILE_ATTRIBUTE_COMPRESSED
将文件标记为已压缩,或者标记为文件在目录中的默认压缩方式
FILE_ATTRIBUTE_NORMAL
默认属性
FILE_ATTRIBUTE_HIDDEN
隐藏文件或目录
FILE_ATTRIBUTE_READONLY
文件为只读
FILE_ATTRIBUTE_SYSTEM
文件为系统文件
FILE_FLAG_WRITE_THROUGH
操作系统不得推迟对文件的写操作
FILE_FLAG_OVERLAPPED
允许对文件进行重叠操作
FILE_FLAG_NO_BUFFERING
禁止对文件进行缓冲处理。文件只能写入磁盘卷的扇区块
FILE_FLAG_RANDOM_ACCESS
针对随机访问对文件缓冲进行优化
FILE_FLAG_SEQUENTIAL_SCAN
针对连续访问对文件缓冲进行优化
FILE_FLAG_DELETE_ON_CLOSE
关闭了上一次打开的句柄后,将文件删除。特别适合临时文件
也可在Windows NT 下组合使用下述常数标记:
SECURITY_ANONYMOUS
SECURITY_IDENTIFICATION SECURITY_IMPERSONATION SECURITY_DELEGATION SECURITY_CONTEXT_TRACKING SECURITY_EFFECTIVE_ONLY
hTemplateFile
Long
,如果不为零,则指定一个文件句柄。新文件将从这个文件中复制扩展属性

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值