Win32 Api编程指南

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
WinMain( )函数等价于 DOS 或者 UNIX 编程中的 main( )函数。这是我们程序执行的入口点。参数的含义 如下:
HINSTANCE hInstance 程序执行模块的句柄。( 内存中的.exe 文件 )。
HINSTANCE hPrevInstance 在 Win32 程序中总为 NULL。
LPSTR lpCmdLine 一个字符串的命令行参数。不包括程序名。
int nCmdShow 会解释。
hInstance 主要用来装载资源和执行一些基于其它模块的功能。模块是指装载到程序中的 exe 或者 dll 文 件。在本书的大部分( 不是全部 )内容中,它们都是指 exe 文件。
重要的说明
在全书中,通常我会指出一些非常重要的东西,这些都是必读的。因为它们常常把人弄得糊里糊涂,如果 您不读这些东西,很有可能也会身陷其中。
首先: 范例压缩包里的源代码是必读的!我没有在书中包含全部的代码,而只包含了那些与我们当前讨论的内容 有关的代码片断。如果您想详细了解代码在程序中的体现,就必须去参看压缩包内提供的源代码。 其次: 通读所有的内容!如果您在书中的某个部分有什么疑问,请耐心的读下去,也许不久,在后面的部分中就 会找到答案。如果您非想要立刻就弄清楚这个问题,至少也要保证,在通过 IRC 或者 Email 来寻求答案之前, 你已经浏览或者搜索了其余的部分了。 另外,请记住,题目 A 中涉及的问题,有可能在 B 或者 C 甚至 L 中才会做出解答,所以还是先泛读一遍比 较好。 好了,以上就是我想说的全部注意事项了,接下来让我们看一些实际的例子吧。
接下来是跟在 LP 后面的一个表示常量的字符 C,LPCSTR 表示一个指向字符串常量的长指针,它指向的内容 是不可修改的。LPSTR 是指向字符串的长指针,没有 const 关键字,它指向的内容是可以修改的。
Win32 API 编程指南( 2 )
一个简单的窗口
范例:simple_window
许多人到 IRC 里询问,“如何创建一个窗口?”...其实,这并不是一件非常容易的小事。但一旦您明白 了我们正在学的东西,也就不那么困难了。为了创建一个能够正常显示的窗口,确实需要做很多事情;这不是 在聊天室里三言两语能说得清楚的。
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
WNDCLASSEX wc;
HWND hwnd;
MSG Msg;
//Step 1: Registering the Window Class
CW_USEDEFAULT, CW_USEDEFAULT, 240, 120, NULL, NULL, hInstance, NULL ); if ( hwnd == NULL ) { MessageBox( NULL, "Window Creation Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK ); return 0; }
窗口类和 C++中的类没有任何关系。
const char g_szClassName[] = "myWindowClass";
上面的数组中存储着我们要创建的窗口类的名字,我们将用它向系统注册我们的窗口类。
WNDCLASSEX wc;
wc.cbSize
= sizeof( WNDCLASSEX );
wc.style
wc.hbrBackground = ( HBRUSH )( COLOR_WINDOW+1 );
wc.lpszMenuName = NULL;
wc.lpszClassName = g_szClassName;
wc.hIconSm
= LoadIcon( NULL, IDI_APPLICATION );
其实只要记住几个要点也就很容易理解了。LP 前缀代表指向长整形的指针( long pointer )。在 Win32 中,long 是一种古老的类型了,这里不用细说。如果您不知道指针是什么,您有两种选择:1 )去找本 C 的书
读一读。 2 )继续读下去,可能会弄得一团糟。我强烈建议您选择第一种,但还是有很多人坚持选择第二种( 我 已经给了您建议哦: ) 别怪我没提醒您! )
hPrevInstance 在过去的 Win16 程序中,用来指向一个已经运行了的程序的实例。现在已经不再使用了, 在 Win32 中,您完全可以忽略这个参数。
调用方式
WINAPI 指明了调用的方式,它被定义为_stdcall。即使您不明白,也不用担心。这并不影响我们的学习。 记住在这里它是必需的就行了。
switch( msg ) {
case WM_CLOSE: DestroyWindow( hwnd );
break; case WM_DESTROY:
PostQuitMessage( 0 ); break; default:
return DefWindowProc( hwnd, msg, wParam, lParam ); } return 0; }
//步骤 1: 注册窗口类
wc.cbSize
= sizeof( WNDCLASSEX );
wc.style
= 0;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon
这段代码能够创建一个真正具有窗口功能的最简单的 windows 程序,仅仅 70 左右行代码。如果第一个范 例能够正常编译通过,这个也应该没有什么问题。
步骤 1: 注册窗口类
窗口类中保存着窗口类型的相关信息,包括控制窗口行为的窗口过程函数、窗口最大化和最小化时的图标、 窗口的背景颜色等等。利用这种方法,您就能够基于创建的这个窗口类,创建多个窗口,而不需要在创建每一 个窗口的时候都重新设置这些属性。我们设置的大多数的属性的值都可以在窗口创建之前进行更改。
return 0; }
// Step 2: Creating the Window // 步骤 2: 创建窗口
hwnd = CreateWindowEx ( WS_EX_CLIENTEDGE, g_szClassName, "The title of my window", WS_OVERLAPPEDWINDOW,
= LoadIcon( NULL, IDI_APPLICATION );
wc.hCursor
= LoadCursor( NULL, IDC_ARROW );
wc.hbrBackground = ( HBRUSH )( COLOR_WINDOW+1 );
wc.lpszMenuName = NULL;
wc.lpszClassName = g_szClassName;
Win32 API 编程指南( 1 )
起步
本书的内容
本书将会展示给您使用 Win32 API 来开发 windows 程序的基本方法。开发语言采用 C 语言,大多数 C++编 译器也都能够正常编译 C 语言的程序。事实上,书中的绝大部分内容对于任何调用 API 的语言都是有效的,像 JAVA,汇编语言,以及 Visual Basic。但我不会用这些语言来编写范例代码,先前也有一些人尝试用其它的 语言来实现本书中的例子,很可惜,没有几个人成功。
ShowWindow( hwnd, nCmdShow ); UpdateWindow( hwnd ); // Step 3: The Message Loop // 步骤 3: 消息循环 while( GetMessage( &Msg, NULL, 0, 0 ) > 0 ) {
TranslateMessage( &Msg ); DispatchMessage( &Msg ); } return Msg.wParam; }
= 0;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra
= 0;
wc.cbWndExtra
= 0;
wc.hInstance
= hInstance;
wc.hIcon
= LoadIcon( NULL, IDI_APPLICATION );
wc.hCursor
= LoadCursor( NULL, IDC_ARROW );
#include <windows.h> int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) {
MessageBox( NULL, "Goodbye, cruel world!", "Note", MB_OK ); return 0; }
我总是倾向于先实际的做点什么,然后再进行分析讨论。...先给出一段创建简单窗口的代码,稍后再对 其进行说明。
#include <windows.h> const char g_szClassName[] = "myWindowClass"; // Step 4: the Window Procedure // 步骤 4: 窗口过程函数 LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) {
程序编译时也可能会有一些警告,例如没有使用 WinMain( )函数中的参数,这是正常现象,不用理会。 至此,我们已经建立了一个能正常运行的程序,接下来让我们来分析一下这段代码....
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
如果程序报错,首先请看一看您是否理解错误的提示信息,在您的编译器的帮助或者联机文档中搜索一下 这个错误的详细描述。有一点需特别注意,确保已将您的程序指明为 Win32 GUI 程序,而不是控制台程序。 很抱歉,对于排错的问题,我也没什么好办法。因为根据编译器的不同,错误提示的信息也不同( 而且人与人 也不同 )。
wc.hIconSm
= LoadIcon( NULL, IDI_APPLICATION );
if ( !RegisterClassEx( &wc ) ) {
MessageBox( NULL, "Window Registration Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK );
本书不会教您什么是 C 语言,也不会教您如何使用特定的编译器( Borland C++, Visual C++,LCC-Win32, 等等 )。最后,我会在附录中提供一些我个人的使用编译器的经验。
如果您不知道宏或 typedef 是什么,不知道 switch 语句是如何工作的,请现在就放下本书,先找一本介 绍 C 语言的书读一读。
Win32 数据类型
您可能发现了,许多关键字在 windows 下面都被重新定义了,例如 UINT 是 unsigned int,LPSTR 是 char* 等等。至于用哪种写法完全取决于您自己。如果您觉得用 char* 比用 LPSTR 更爽,您尽可以自由的使用。只 要确定您所使用的数据类型能够正确的匹配重新定义的数据类型就行了。
最简单的 Win32 程序
即使您完全是个初学者,至少也要保证能够正确编译一个最基本的 windows 程序。将下面的代码敲入编辑 器,如果一切正常,您就能创建一个最基本的程序了。
切记,要将它作为一个 C 源文件来编译,而不是 C++源文件。虽然这可能没什么关系,但是,既然我们的 代码完全是用 C 写的,就保证它从一开始的时候就朝着一个有益的方向前进吧。本书中,绝大多数情况下,都 要求将代码保存为 a.c 而不是 a.cpp。如果您觉得这个名字很不爽,那就将它保存为 test.c 吧。
相关文档
最新文档