⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 win32编程基础知识.htm

📁 win32编程宝典,很好的文档哦,真是太复杂了,呵呵呵呵呵呵呵
💻 HTM
📖 第 1 页 / 共 3 页
字号:
	</TD>
</TR>
<tr><td  height=1 bgcolor=#D6D6D6></td></tr>
<tr ><td height=25 bgcolor=#F1F1F1 align=center>
	作者:<font color="0E3E92">未知</font>
	时间:<font color="0E3E92">2003-08-14 12:12</font>
	出处:<font color="0E3E92">互联网</font>
	责编:<font color="0E3E92">chinaitpower</font>
</td></tr><tr><td  height=1 bgcolor=#D6D6D6></td></tr>
<tr><td bgcolor="#FFFFFF" height=25>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;摘要:暂无</td></tr>
<tr><td  height=1 bgcolor=#D6D6D6></td></tr>

</TABLE>

<table width="760" border="0" align="center" cellpadding="0" cellspacing="0" class="border2" bgcolor="#FFFFFF">
<tr><td height=25 align=center>
	<TABLE width=95% >
<tr><Td colspan="9" align=center ><script language="JavaScript" src="/images/headad.js"></script></td></tr>
<tr><td  height=1 bgcolor=#D6D6D6></td></tr>
	<TR>
		<TD><table border="0" align="left">
            <tr>
              <td>
              <iframe src="/images/ad.htm" width=336 height=280 border=0 frameborder=0 framespacing=0 marginheight=1 marginwidth=1 noResize scrolling=no vspace="0"></iframe>
            </td>
            </tr>
          </table><BR><BR>  尽管Windows应用程序千变万化,令人眼花缭乱,但,消息机制和窗口过程却始终它们的基础,掌握了这两项技术,也就相当于把握住了问题的关键。<BR><BR>  如果你以前是C程序员或是MFC的忠实用户,只要你学习过C语言的语法,自己亲手编过一些简短的C程序,理解以下的Win32编程基础也不是一件困难的事。<BR><BR>  <B>一个最简单的Win32程序</B> <BR><BR>  在以前的C语言编程中,一个最简单的程序可以只有两行。<BR><BR>
<TABLE cellspacing=0 cellpadding=0 border=0 align=center class=txcode>
<TBODY>
<TR>
<TD>void main(void)<BR><BR>{ printf "Hello World!"; } </TD></TR></TBODY></TABLE><BR>  而要实现同样功能的Windows程序却最少也要写几十行,这并不是说明Windows应用程序效率低下,难于掌握,只是说明程序在Windows环境下有更丰富的内涵。Windows程序的效率其实不低,在所有的Windows应用程序中,都有一个程序初始化的过程,这得用上几十条语句,这段初始化的代码对于任何Windows应用程序而言,都是大同小异的。下面以一个实现最简单功能的程序EasyWin为例,说明Windows程序的基本框架。<BR><BR>  打开Visual C++ 6.0。 <BR><BR>  选择File菜单的New,在出现的对话框中,选择Projects栏目(新建工程),并点取其下的Win32 Application项,表示使用Win32环境创建应用程序。先在Locatin(路径)中填入“c:\”,然后在Project Name(项目名称)中填入“EasyWin”,其它按照缺省设置)。单击OK按钮。<BR><BR>  再次选择File菜单的New,在出现的对话框中,选择Files栏目(新建文件),并点取其下的C++ Source File项,表示新建一个C++源文件。在右边的File栏中输入“EasyWin”,最后确定让Add to project检查框打上勾 )。单击OK按钮。 <BR><BR><br><br>  在EasyWin.cpp文件中输入以下源程序代码。  <BR> <BR>
<TABLE cellspacing=0 cellpadding=0 border=0 align=center class=txcode>
<TBODY>
<TR>
<TD>//*******************************************************************<BR>// 工程:easywin<BR>// 文件:easywin.cpp<BR>// 内容:一个基本的Win32程序//*******************************************************************<BR><BR>#include &lt;windows.h&gt;<BR><BR>#include &lt;windowsx.h&gt;<BR><BR>//函数声明<BR><BR>BOOL InitWindow( HINSTANCE hInstance, int nCmdShow );<BR><BR>LRESULT CALLBACK WinProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam );<BR><BR>//*******************************************************************<BR><BR>//函数:WinMain()<BR><BR>//功能:Win32应用程序入口函数。创建主窗口,处理消息循环<BR><BR>//*******************************************************************<BR><BR>int PASCAL WinMain( HINSTANCE hInstance, //当前实例句柄<BR><BR>HINSTANCE hPrevInstance, //前一个实例句柄<BR><BR>LPSTR lpCmdLine, //命令行字符<BR><BR>int nCmdShow) //窗口显示方式<BR><BR>{<BR><BR>MSG msg;<BR><BR>//创建主窗口<BR><BR>if ( !InitWindow( hInstance, nCmdShow ) )<BR><BR>return FALSE;<BR><BR>//进入消息循环:<BR><BR>//从该应用程序的消息队列中检取消息,送到消息处理过程,<BR><BR>//当检取到WM_QUIT消息时,退出消息循环。<BR><BR>while (GetMessage(&amp;msg, NULL, 0, 0))<BR><BR>{<BR><BR>TranslateMessage(&amp;msg);<BR><BR>DispatchMessage(&amp;msg);<BR><BR>}<BR><BR>//程序结束<BR><BR>return msg.wParam;<BR><BR>}<BR><BR>//******************************************************************<BR><BR>//函数:InitWindow()<BR><BR>//功能:创建窗口。<BR><BR>//******************************************************************<BR><BR>static BOOL InitWindow( HINSTANCE hInstance, int nCmdShow )<BR><BR>{<BR><BR>HWND hwnd; //窗口句柄<BR><BR>WNDCLASS wc; //窗口类结构<BR><BR>//填充窗口类结构<BR><BR>wc.style = CS_VREDRAW | CS_HREDRAW;<BR><BR>wc.lpfnWndProc = (WNDPROC)WinProc;<BR><BR>wc.cbClsExtra = 0;<BR><BR>wc.cbWndExtra = 0;<BR><BR>wc.hInstance = hInstance;<BR><BR>wc.hIcon = LoadIcon( hInstance, IDI_APPLICATION );<BR><BR>wc.hCursor = LoadCursor( NULL, IDC_ARROW );<BR><BR>wc.hbrBackground = GetStockObject(WHITE_BRUSH);<BR><BR>wc.lpszMenuName = NULL;<BR><BR>wc.lpszClassName = "EasyWin";<BR><BR>//注册窗口类<BR><BR>RegisterClass( &amp;wc );<BR><BR> <BR><BR>//创建主窗口<BR><BR>hwnd = CreateWindow(<BR><BR>"EasyWin", //窗口类名称<BR><BR>"一个基本的Win32程序", //窗口标题<BR><BR>WS_OVERLAPPEDWINDOW, //窗口风格,定义为普通型<BR><BR>100, //窗口位置的x坐标<BR><BR>100, //窗口位置的y坐标<BR><BR>400, //窗口的宽度<BR><BR>300, //窗口的高度<BR><BR>NULL, //父窗口句柄<BR><BR>NULL, //菜单句柄<BR><BR>hInstance, //应用程序实例句柄<BR><BR>NULL ); //窗口创建数据指针<BR><BR>if( !hwnd ) return FALSE;<BR><BR>//显示并更新窗口<BR><BR>ShowWindow( hwnd, nCmdShow );<BR><BR>UpdateWindow( hwnd );<BR><BR>return TRUE;<BR><BR>}<BR><BR>//******************************************************************<BR><BR>//函数:WinProc()<BR><BR>//功能:处理主窗口消息<BR><BR>//******************************************************************<BR><BR>LRESULT CALLBACK WinProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )<BR><BR>{<BR><BR>switch( message )<BR><BR>{<BR><BR>case WM_KEYDOWN://击键消息<BR><BR>switch( wParam )<BR><BR>{<BR><BR>case VK_ESCAPE:<BR><BR>MessageBox(hWnd,"ESC键按下了!","Keyboard",MB_OK);<BR><BR>break;<BR><BR>}<BR><BR>break;<BR><BR>case WM_RBUTTONDOWN://鼠标消息<BR><BR>{<BR><BR>MessageBox(hWnd,"鼠标右键按下了!","Mouse",MB_OK);<BR><BR>break;<BR><BR>}<BR><BR>case WM_PAINT://窗口重画消息<BR><BR>{<BR><BR>char hello[]="你好,我是EasyWin !";<BR><BR>HDC hdc;<BR><BR>PAINTSTRUCT ps;<BR><BR>hdc=BeginPaint( hWnd,&amp;ps ); //取得设备环境句柄<BR><BR>SetTextColor(hdc, RGB(0,0,255)); //设置文字颜色<BR><BR>TextOut( hdc, 20, 10, hello, strlen(hello) );//输出文字<BR><BR>EndPaint( hWnd, &amp;ps ); //释放资源<BR><BR>break;<BR><BR>}<BR><BR>case WM_DESTROY://退出消息<BR><BR>PostQuitMessage( 0 );//调用退出函数<BR><BR>break;<BR><BR>}<BR><BR>//调用缺省消息处理过程<BR><BR>return DefWindowProc(hWnd, message, wParam, lParam);<BR><BR>}</TD></TR></TBODY></TABLE><BR>  程序输入完毕,即可编译执行。在窗口中击鼠标键或按ESC键时,会弹出一个对话框以表示你的操作。<BR><BR>  其实,这个程序可以看成是所有Win32应用程序的框架,在以后所有的程序中,你会发现它们都是在这个程序的基础之上再添加代码。<BR><BR><br>  <B>WinMain()函数 </B><BR> <BR>  WinMain()函数是应用程序开始执行时的入口点,通常也是应用程序结束任务退出时的出口点。它与DOS程序的main()函数起同样的作用,有一点不同的是,WinMain()函数必须带有四个参数,它们是系统传递给它的。WinMain()函数的原型如下:<BR><BR>
<TABLE cellspacing=0 cellpadding=0 border=0 align=center class=txcode>
<TBODY>
<TR>
<TD>int PASCAL WinMain( HINSTANCE hInstance, //当前实例句柄<BR><BR>HINSTANCE hPrevInstance, //前一个实例句柄<BR><BR>LPSTR lpCmdLine, //命令行字符<BR><BR>int nCmdShow) //窗口显示方式 </TD></TR></TBODY></TABLE><BR>  第一个参数hInstance,是标识该应用程序当前的实例的句柄。它是HINSTANCE类型,HINSTANCE是Handle of Instance的缩写,表示实例的句柄。hInstance是一个很关键的数据,它唯一的代表该应用程序,在后面初始化程序主窗口的过程中需要用到这个参数。<BR><BR>  这里有两个概念,一个是实例,一个是句柄。实例代表的是应用程序执行的整个过程和方法,一个应用程序如果没有被执行,只是存在于磁盘上,那么就说它是没有被实例化的;只要一执行,则说该程序的一个实例在运行。句柄,顾名思义,指的是一个对象的把柄。在Windows中,有各种各样的句柄,它们都是32位的指针变量,用来指向该对象所占据的内存区。句柄的使用,可以极大的方便Windows管理其内存中的各种对象。 <BR><BR>  第二个参数是hPrevInstance,它是用来标识该应用程序的前一个实例句柄。对于基于Win32的应用程序来说,这个参数总是NULL。这是因为在Win95操作系统中,应用程序的每个实例都有各自独立的地址空间,即使同一个应用程序被执行了两次,在内存中也会为它们的每一个实例分配新的内存空间,所以一个应用程序被执行后,不会有前一个实例存在的可能。也就是说,hPrevInstance这个参数是完全没有必要的,只是为了提供与16位Windows的应用程序形式上的兼容性,才保留了这个参数。在以前的16位Windows环境下(如Windows3.2),hPrevInstance用来标识与hInstance相关的应用程序的前一个句柄。<BR><BR>  第三个参数是lpCmdLine,是指向应用程序命令行参数字符串的指针。如在Win95的“开始”菜单中单击“运行”,输入“easywin hello”,则此参数指向的字符串为“hello”。<BR><BR>  最后一个参数是nCmdShow,是一个用来指定窗口显示方式的整数。这个整数值可以是SW_SHOW、SW_HIDE、SW_SHOWMAXIMIZED、SW_SHOWMINIMIZED等,关于这些值的含义,将在下一节说明。<BR><BR><br>  <B>注册窗口类 </B><BR><BR>  一个应用程序可以有许多窗口,但只有一个是主窗口,它是与该应用程序的实例句柄唯一关联的。上面的例程中,创建主窗口的函数是InitWindow()。 <BR><BR>  通常要对填充一个窗口类结构WNDCLASS,然后调用RegisterClass()对该窗口类进行注册。每个窗口都有一些基本的属性,如窗口边框、窗口标题栏文字、窗口大小和位置、鼠标、背景色、处理窗口消息函数的名称等等。注册的过程也就是将这些属性告诉系统,然后再调用CreateWindow()函数创建出窗口。这也就象你去裁缝店订做一件衣服,先要告诉店老板你的身材尺寸、布料颜色、以及你想要的款式,然后他才能为你做出一件让你满意的衣服。<BR><BR>  在VC的帮助中,可以看到WNDCLASS结构是这样定义的:<BR><BR>
<TABLE cellspacing=0 cellpadding=0 border=0 align=center class=txcode>
<TBODY>
<TR>
<TD>typedef struct _WNDCLASS {<BR><BR>UINT style; //窗口的风格*<BR><BR>WNDPROC lpfnWndProc; //指定窗口的消息处理函数的远指针*<BR><BR>int cbClsExtra; //指定分配给窗口类结构之后的额外字节数*<BR><BR>int cbWndExtra; //指定分配给窗口实例之后的额外字节数<BR><BR>HANDLE hInstance; //指定窗口过程所对应的实例句柄*<BR><BR>HICON hIcon; //指定窗口的图标<BR><BR>HCURSOR hCursor; //指定窗口的鼠标<BR><BR>HBRUSH hbrBackground; //指定窗口的背景画刷<BR><BR>LPCTSTR lpszMenuName; //窗口的菜单资源名称<BR><BR>LPCTSTR lpszClassName; //该窗口类的名称*<BR><BR>} WNDCLASS;</TD></TR></TBODY></TABLE><BR>  在Win95和WinNT的具有新界面特性的系统中,为了支持新的窗口界面特性,还有一种扩展的窗口类型WNDCLASSEX,它的定义如下:<BR><BR>
<TABLE cellspacing=0 cellpadding=0 border=0 align=center class=txcode>
<TBODY>
<TR>
<TD>typedef struct _WNDCLASSEX {<BR><BR>UINT cbSize; //指定WNDCLASSEX结构的大小<BR><BR>UINT style; <BR><BR>WNDPROC lpfnWndProc; <BR><BR>int cbClsExtra;<BR><BR>int cbWndExtra;<BR><BR>HANDLE hInstance; <BR><BR>HICON hIcon; <BR><BR>HCURSOR hCursor;<BR><BR>HBRUSH hbrBackground; <BR><BR>LPCTSTR lpszMenuName; <BR><BR>LPCTSTR lpszClassName;<BR><BR>HICON hIconSm; //窗口的小图标<BR><BR>} WNDCLASSEX;</TD></TR></TBODY></TABLE><BR>  WNDCLASS和WNDCLASSEX这两个结构基本上是一致的,只是WNDCLASSEX结构中多了cbSize和hIconSm这两个成员。WNDCLASS结构的各成员中,其注释后打了星号的表示该项应特别注意。<BR><BR>  WNDCLASS结构的第一个成员style表示窗口类的风格,它往往是由一些基本的风格通过位的“或”操作(操作符位“|”)组合而成。下表列出了一些常用的基本窗口风格:<BR><BR>
<TABLE cellSpacing=0 width="91%" border=1>
<TBODY>
<TR>
<TD>风格</TD>
<TD>含义 </TD></TR>
<TR>
<TD>CS_HREDRAW</TD>
<TD>如果窗口客户区宽度发生改变,重绘整个窗口 </TD></TR>
<TR>
<TD>CS_VREDRAW</TD>
<TD>如果窗口客户区高度发生改变,重绘整个窗口</TD></TR>
<TR>
<TD>CS_DBLCLKS</TD>
<TD>能感受用户在窗口中的双击消息 </TD></TR>
<TR>
<TD>CS_NOCLOSE</TD>
<TD>禁用系统菜单中的“关闭”命令 </TD></TR>
<TR>
<TD>CS_OWNDC</TD>
<TD>为该窗口类的各窗口分配各自独立的设备环境 </TD></TR>
<TR>
<TD>CS_CLASSDC</TD>
<TD>为该窗口类的各窗口分配一个共享的设备环境 </TD></TR>
<TR>
<TD>CS_PARENTDC</TD>
<TD>指定子窗口继承其父窗口的设备环境</TD></TR>
<TR>
<TD>CS_SAVEBITS</TD>
<TD>把被窗口遮掩的屏幕图象部分作为位图保存起来。当该窗口被移动时,Windows使用被保存的位图来重建屏幕图象 </TD></TR></TBODY></TABLE><BR>  在EasyWin应用程序中,是按如下方式对WNDCLASS结构进行填充和注册的:<BR><BR>
<TABLE cellspacing=0 cellpadding=0 border=0 align=center class=txcode>
<TBODY>
<TR>
<TD>wc.style = CS_VREDRAW | CS_HREDRAW;<BR><BR>wc.lpfnWndProc = (WNDPROC)WinProc;<BR><BR>wc.cbClsExtra = 0;<BR><BR>wc.cbWndExtra = 0;<BR><BR>wc.hInstance = hInstance;<BR><BR>wc.hIcon = LoadIcon( hInstance, IDI_APPLICATION );<BR><BR>wc.hCursor = LoadCursor( NULL, IDC_ARROW );<BR><BR>wc.hbrBackground = GetStockObject(WHITE_BRUSH);<BR><BR>wc.lpszMenuName = NULL;<BR><BR>wc.lpszClassName = "EasyWin"; </TD></TR></TBODY></TABLE><BR>  可以看到,wc.style被设为CS_VREDRAW | CS_HREDRAW,表示只要窗口的高度或宽度发生变化,都会重画整个窗口。<BR><BR>  第二个成员lpfnWndProc的值为(WNDPROC)WinProc。表明该窗口类的消息处理函数是WinProc()函数。这里,要指定窗口的消息处理函数的远指针,输入消息处理函数的函数名称即可,必要时应该进行强制类型转换,将其转换成WNDPROC型。<BR><BR>  接下来的cbClsExtra和wc.cbWndExtra在大多数情况下都会设为0。<BR><BR>  然后的hInstance成员,给它的值是由WinMain()传来的应用程序的实例句柄,表明该窗口与该实例是相关联的。事实上,只要是注册窗口类,该成员的值始终是该程序的实例句柄,你应该象背书一样记住它。<BR><BR>  下面的hIcon,是让你给这个窗口指定一个图标,调用 LoadIcon( hInstance, IDI_APPLICATION ),可以调用系统内部预先定义好的标志符为IDC_APPLICATION的图标作为该窗口的图标。<BR><BR>  同样,调用LoadCursor( NULL, IDC_ARROW )为该窗口调用系统内部预先定义好的箭头型鼠标。<BR><BR>  hbrBackground成员用来定义窗口的背景画刷颜色,也就是该窗口的背景色。调用GetStockObject(WHITE_BRUSH)可以获得系统内部预先定义好的白色画刷作为窗口的背景色。<BR><BR>  上面的LoadIcon()、LoadCursor()、GetStockObject()都是Windows的API函数,它们的用法可以参看VC的帮助,这里就不多介绍了。<BR><BR>  lpszMenuName成员的值我们给它NULL,表示该窗口将没有菜单。如果你想让你的窗口拥有菜单,就把lpszMenuName成员赋值为标志菜单资源的字符串。<BR><BR>  WNDCLASS结构的最后一个成员lpszClassName是让你给这个窗口类起一个唯一的名称,因为Windows操作系统中有许许多多的窗口类,必须用一个独一无二的名称来代表它们。通常,你可以用你的程序名来命名这个窗口类的名称。这个名称将在创建窗口的CreateWindow()函数中用到。<BR><BR>  填充完毕后,对于WNDCLASS结构,调用RegisterClass()函数进行注册;对于WNDCLASSEX结构,调用RegisterClassEx()函数进行注册,它们的原型分别如下:<BR><BR>
<TABLE cellspacing=0 cellpadding=0 border=0 align=center class=txcode>
<TBODY>
<TR>
<TD>ATOM RegisterClass( CONST WNDCLASS *lpWndClass ); <BR><BR>ATOM RegisterClassEx( CONST WNDCLASSEX *lpwcx ); </TD></TR></TBODY></TABLE><BR>  该函数如调用成功,则返回一个非0值,表明系统中已经注册了一个名为EasyWin的窗口类。如果失败,则返回0。<BR><BR><br>  <B>创建窗口</B> <BR><BR>  当窗口类注册完毕之后,并不会有窗口显示出来,因为注册的过程仅仅是为创建窗口所做的准备工作。实际创建一个窗口的是通过调用CreateWindow()函数完成的。窗口类中已经预先定义了窗口的一般属性,而CreateWindow()中的参数可以进一步指定一个窗口的更具体的属性,在EasyWin程序中,是如下调用CreateWindow()函数来创建窗口的: <BR><BR>
<TABLE cellspacing=0 cellpadding=0 border=0 align=center class=txcode>
<TBODY>
<TR>
<TD>hwnd = CreateWindow(<BR><BR>"EasyWin", //创建窗口所用的窗口类的名称*<BR><BR>"一个基本的Win32程序", //窗口标题<BR><BR>WS_OVERLAPPEDWINDOW, //窗口风格,定义为普通型*<BR><BR>100, //窗口位置的x坐标<BR><BR>100, //窗口位置的y坐标<BR><BR>400, //窗口的宽度<BR><BR>300, //窗口的高度<BR><BR>NULL, //父窗口句柄<BR><BR>NULL, //菜单句柄<BR><BR>hInstance, //应用程序实例句柄*<BR><BR>NULL ); //一般都为NULL</TD></TR></TBODY></TABLE><BR>  CreateWindow()函数的参数的含义在上面的注释中已有介绍,注释后打了星号标记的参数应该着重注意,其它的参数都很简单,不多做介绍,可参看VC的帮助。<BR><BR>  第一个参数是创建该窗口所使用的窗口类的名称,注意这个名称应与前面所注册的窗口类的名称一致。<BR><BR>  第三个参数为创建的窗口的风格,下表列出了常用的窗口风格:<BR><BR>
<TABLE cellSpacing=0 width="100%" border=1>
<TBODY>
<TR>
<TD width="23%">风格</TD>
<TD width="77%">含义 </TD></TR>
<TR>
<TD width="23%">WS_OVERLAPPEDWINDOW</TD>
<TD width="77%">创建一个层叠式窗口,有边框、标题栏、系统菜单、最大最小化按钮,是以下几种风格的集合:WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX, WS_MAXIMIZEBOX </TD></TR>
<TR>
<TD width="23%">WS_POPUPWINDOW </TD>
<TD width="77%">创建一个弹出式窗口,是以下几种风格的集合: WS_BORDER,WS_POPUP,WS_SYSMENU。WS_CAPTION与WS_POPUPWINDOW风格必须一起使用才能使窗口菜单可见 </TD></TR>
<TR>
<TD width="23%">WS_OVERLAPPED</TD>
<TD width="77%">创建一个层叠式窗口,它有标题栏和边框,与WS_TILED风格一样 </TD></TR>
<TR>
<TD width="23%">WS_POPUP</TD>
<TD width="77%">该窗口为弹出式窗口,不能与WS_CHILD同时使用 </TD></TR>
<TR>
<TD width="23%">WS_BORDER</TD>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -