win32 API编程入门

所需积分/C币:50 2018-01-10 14:11:48 665KB PDF
收藏 收藏
举报

Win32编程入门API,要想使用Microsoft 32位平台的应用程序编程接口,拥有一个齐全的api是至关重要的,Win32 API是从事Windows应用程序开发所必备的
开始学习 这篇教程讲什么 这篇教程试图向你展现使用Win32API写程序的一些基础知识(还有常见的扩展知识) 使用C语言,大多数的C艹工具也可以编译.事实上从大多数语言的介绍文章可知,大多数 语言皆可调用API,包括Java,汇编语言以及 Visual basic.但是我将不会提到这些语言的代 码例子,你想仗用其它语言的话,请自己参考相关资料,不过有好几个使用过此教程的人都 对我说用上面的这些语言都是可行的 本教程不会教你C语言,也不会教你怎么使用你喜欢的编译器( Borland c++,Ⅴ isual c +,ICC-win32,等等).但是我将在附表中就我对编译器的所知提供一些说明 如果你不知道 macro或 typedef是什么,或 switchC语句如何工作,那你要先回去找 本好的C语言的教程学习一下 重要说明 在此文档的某些部分我将指出某些地方很重要.因为很多人在不閱读它们情況下造成理 解困难,你如果不閱读,你很可能也陷入困难.第一个就是: 以zi打包的源代码范例不是可选可不选的!我沒有把所有的代码放在教程中,只放了 那些与我正在讨论问题相关的.要想知道这里的代码怎么与貝它部分配合,就必须去看zip 文件中的源代码 好!第二个: 把整个文档看完.如果你在读某章节遇到了问题,请耐心一点,很可能在后面一点就可 以找到答案.如果你实在不能忍受这种无知的状态,请在到IRC频道上去提问或发出求助邮 件之前至少跳过一点或在余下的文档中搜一下(是的,计算机可以搜索) 另外一点就是一个关于话题A的问题很可能在关于话题B或C的讨论中得到解答,也 有可能是话题L.所以多看看,找一下 好,东扯西拉暂时告一段落,我们来试些实际代码 最简单的Win32程序 如果你是一个完全的新手,就让我们米确认一下你可以编译一个基木的 windows程序 把下闻这些代码弄到你的编译器中去编译一下,如果一切正常你就得到有史以来最简易的程 序之一. 记得以C来编译,不是以C++可能沒有关系,但这里的代码都是C,在正确的轨道, 行驶还是好些.大多数情況,你要做的就是把文件的扩展名写成。c而不是.cpp.如果这些话 伤了你的脑筋的话,就把文件名写成 test. c并用它就行了 #include<windows.h>> int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance LPSTR lpCmdLine, int nCmdShow) Message BOX(NULL, "Goodbye, cruel world! ,"Note, MB OK) return O 如果不行,首先閱读得到的任何错误提示,并在帮助文档或任何其它跟你编译器配套的 文档中査找它们.确定你是以一个win32GUI(不是 Console)的工程/ makefile/目标来编译的 不幸的是,这一点上我也帮不了什么,对于不同的编译器(不同的人),解決方法不同 你可能得到一些警告说你沒有使用 WinMail传递的那些参数.这沒关系.现在我们确 定你能编译一个程序了,我们来看下代码 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance LPSTR IpCmdLine, int nCmdShow) WinMail是 Windows中与DOS或UNⅨX的main(的等价物.这是你的程开始执行的入 口.参数如下 HINSTANCE hInstance 程序可执行模块的句柄(內存屮的.exe文件). HINSTANCE hPrevInstancc 在Win32程序中总是为NUL PSTR lpCmdline 命令行参数组成的一个单字符串.不包括程序名字. int nCmdShow 个将要传递给 Show window的整数,我们在后由进行讨论 hInstance用作装入资源或其它的以模块为单位的任务.一个模块是一个装入到你程序的 exe或dl-对于本教程的大多数部分(如果不是全部的话),我们只关心一种模块,就是exe 模块 h PrevInstance在win16时代曾经用作你程序的前面已经运行的实例(如果有的话).现 在已经不用了,在Win32中你忽略它就行了 调用规则 WINAPI指定调用规则并被定义为 stdcall.要是你不知道它是干什么用的,先不管它, 在我们的这个教程中它对我们沒有影响.记住在这个位冒我们需要它就是了 Win32数据类型 你会发现很多普通的关键字或类型在 windows中有特定的定义.UNT是 unsigned int, LPSTR是char等等...你怎么用完全取決于你自己你要是喜欢char*超过了 LPSTR,那就用就是了.当然在你替換一个数据类型前你要确定你知道它是什么 就记住一些容易记住的东西就夠了.LP前缀代表 Long Pointer.在Win32中,Long这 个部分已经是过时的概念,不要管它.要是不知道指针是什么的话,你可以1)去找一本好的 C语言教程,或2)直接往下读,弄得头脑混乱.我是推荐第一种方案的,但很多人使用第二 种(我也是:).到时候別说我沒有提醒你 接下来,一个C接在LP后亩表示是常量指针. LPCSTR表示一个指向不会也不能被修 改的常量字符串的指针. LPSTR指向的就不是常量的,可以被修改 你可能还会看到一个T混在里面.现在不要管它,除非你打算与 Unicode打交道,它沒 有其它的意义 CopyrightC 1998-2003, Brook Miles(the Forger ) All rights reserved 一个简单的窗口 范例: simple window 口 The title of my window - OX 有时候有人在IRC上问:”我怎么才实现一个窗口? 我觉得不是一句两句能说得清楚.虽然一旦你 搞清楚你要做什么后并不难,但是你的确需要做一些事 情来使显小一个窗口;这些事情不是在聊大室中一下子 说得清楚的. 我总是喜欢先做一件事情然后米理解它 所以先给出一个简单窗口的代码稍后再做解释. #includc <windows. h> const char g sz Name[="my Window Class / Step 4: the Window Procedure RESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM WParam, LPARAM IParam) switch(msg) case WM CLOSE Destroy Window(hwnd break case WM DESTROY PostQuitMessage(o) break default return Def Window Proc(hwnd, msg, w Param, IParam) return o: int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance LPSTR lpCmdLine, int nCmdShow) WNDCLASSEX WC HWND hwnd MSG MSg //Step l: Registering the Window Class wccbSize -sizeof(WNDCLASSEX wc style 0 wc.lpfn WndProc - WndProc wc.cbClsExtra =0 wc.cbWndExtra =0 wc hInstance hInstance wchIcon- LoadIcon(NULL, IDI APPLICATION) wc.hCursor-Load Cursor(NULL, IDC ARROW) wc.hbrBackground-(HBRUSH(COLOR WINDOW+1) wc.lpszMenuName=NULL wc.lpszClassName-g SzclassName wchIcon Sm= LoadIcon(NULL, IDI APPLICATION) if(.Register ClassEx(&wc)) MessageBOx(NULL, Window registration Failed! ,"Error! MB ICONEXCLAMATION MB OK) return 0 l Step 2: Crcating the Window hwnd=Create WindowEx( WS EX CLIENTEDGE g SZClassName, The title of my window WS OVERLAPPEDWINDOW 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 Show Window(hwnd, nCmdShow) Update Window(hwnd) l Step 3: The Message Loop while(Getmessage(&Msg, NULL, 0, 0)>0) TranslateMessage(&Msg) DispatchMessage(&Msg) return Msg.wParam; 简单来说这是你想创建一个窗口能写的最简单的程序,大致上70行左右的代码.如果 第一个范例你通过了编译,这个也应该不成问题. 第一步:注册窗口类 个窗口类存储关于一个窗口的消息,包括控制窗口的窗口过程,窗口的大小图标,以 及背景顏色用这种方式,你可以先注冊一个窗口类,然后从它创建任意数目的窗口,而不 需要一次次的指定这些参数.如果需要,大多数属性能针对单个的窗口米改变. 这里说的窗凵类与C+中的类是完全不同的概念 const char g szClassName[]="my Window Class" 上面的变量存储了我们窗口类的名字,马上会用米向系统注冊窗口类 WNDCLASSEX WC wccbSize =sizeof(WNDCLaSSeX) wc style wc.lpfn WndProc -WndProc wc.cbCls Extra =0 wc.cb WndExtra=0 wc hInstance- hInstance wc. hIcon LoadIcon(NULL, IDI APPLICATION) wc.hCursor-LoadCursor (NULL, IDC ARROW) wc. hbrBackground =(HBRUSH)(COLOR WINDOW+1) wc.lpszMenuName -NUL wc.lpszClassName-g szClassName wc.hIconSm- LoadIcon(NULL, IDI APPLICATION) if(.Register ClassEx(&wc)) MessageBOX(NULL, " Window Registration Failed! " ,"Error! MB ICONEXCLAMATION MB OK) return 0 这是我们在 WinMail中注冊我们的窗口类的代码.我们填写一个 WNDCLASSEX结构 体的成员并调用 Register ClassExO 结构体的成员对窗凵类的影响如 cbsize 结构体的大小 style 类的式样(CS_*),不要跟窗口式样(WS_*)混淆了这个一般没置为0 lpfn wndproc 指向这个窗口类的窗口过程的指针 cbClsextra 配置给这个类的额外內存一般为0 cbWndExtra 配置给这个类的每个窗口的额外內存.一般为0 iNstance 应用程序实例的句柄.(从 WinMail第一个参数传递来,) hIcon 当用戶按下Alt-Tab组合时候显示的大图标(一般为32*32) cUrsor 在我们的窗口上显示的光标 hbrbackground 设置我们窗口背景顏色的背景刷子 IpszMenuName 这个类的窗口所用的菜单资源的名字 lpszclassName 类的名字 hIcon Sm 在任务栏和窗口的左上角显示的小图标(一般为16*16) 如果看得不很明白先不要担心,马上会冇讲解.另外要记住的一件事情是不要试图去记 下这些东西.我基本上不(从来不)记结构体或函数的参数,这样做是浪费精力和更重要的 时间.如果你知道要调用的函数你就去花几秒钟在你的帮助文档中查一下.要是沒有帮助文 档,就是想法弄到.沒有它们是很郁闷的.随著你使用多次后也许你会记住那些最常用的函 数的参数 然后我们调用 RegisterClass EXO并检查是否成功,如果失败我们弹出一条提示消息并从 WinMail数退出程序 第二步:创建窗口 旦类注冊完,我们即可从它创建一个窗口,你应该去合一下 Create WindOwExo的参数 列表(在你要用一个新API的时候你总是要这样做),但是我会在这里做个简单的介绍 HWND hwnd hwnd- Create WindowEx( WS EX CLIENTEDGE g SzClassName The title of my window WS OVERLAPPEDWINDOW CW USEDEFAULT CW USEDEFAULT 240 120 NULL, NULL, hInstance, NULL) 第一个参数( WS EX CLIENTEDGE)是扩展的窗口式样,这里我设置它想得到一个內 部下陷的边框效果.你可以设成0看看效果.要习惯于试不同的值看效果 接下来我设置了类的名字( g SzClassName),告诉系统我们要创建什么样的窗口.因 为我们要从刚刚注冊的类创建窗口,我们使用了该类的名字.之后我们指定了我们窗口的名 字或是标题,用来显示在我们窗口的外观或是标题栏 我们设置的 WS OVERLAPPEDWINDOW是一个窗口式样参数.这里有很多东西你可 以查找并做试验.在下文中将详加说明. 接下来的四个参数( CW USEDEFAULT, CW USEDEFAULT,320,240)是我们窗口 的左上角的ⅹ,Y坐标和其宽度和高度.我把ⅹ,Y坐标设为 CW USEDEFAULT来让系统 自己选择在屏幕的哪个地方来放置窗凵.记住屏幕的最左边的Ⅹ坐标为0并向右加:屏幕的 顶部的Y坐标为0并向底加单位是像素,这是屏幕在特定的分辨率下能显示的最小单位 再接下来的四个(NULL,NULL, g hInst,NULL)分別是父窗口的句柄,菜单句柄, 应川程序实例句柄,和窗口创建数据的指针在 windows系统中,你屏幕上的窗口是以分层 次的父窗口,子窗口的形式来组织的.当你看到一个窗∏屮有一个按钮时候,按钮就是子窗 口,包含它的窗口就是父窗口我们的例子中,父窗口的句柄为NULL,因为这里沒有父窗口, 这个是是我们的主窗口或是顶层窗口菜单也是NULL,因为我们现在也沒有菜单实例句柄 设为我们从 Winmain(O得到的第个参数窗山的创建数据(我们几乎沒有使用)可以用来向创 建的窗口发送额外数据在这里也设为NULL 如果你想知道神奇的NUL是什么,它实际上被定义为0(零)而且在C中,它是被定义 为(oid")0)的,因为是用来作指针用的所以你有可能在把NULL当整数使用吋会得到警告, 跟你的编译器的警告级別设置有关.你可以忽略这个警告,也可以用0来代替. 不检査调用是岙成功几乎是程序员为找不来程序究竟错在哪里而烦恼的最常发生的情況. Create Window可能会调用失败,即使你是一个用经验的程序员,原因就是可能犯错误的地 方实在太多了.除非你学会了如何快速查出错误,最少你应该给自己一个机会知道是哪里出 了错,一定记住检查返回值! if(hwnd== NULL Message BOx(NULL, "Window Creation Failed! " ,"Error MB ICONEXCLAMATION MB OK) return 0 在我们创建了窗口并作检查以确定我们有一个正确的句柄后,我们使用 Win main最后 的参数来显示窗口,再更新它以确认它在屏幕上正确地重画了自己 Show Window (hwnd, nCmdShow) Update Window(hwnd) n DshOw是可选的参数,你可以简单地传递 SW SHOWNORMAL即可但是用从 Winmail(传米的参数可给予运行此程序的用戶选择以可视,最大化,最小化等选项. 来引导程序的自由.你可以在 windows快捷方式的属性中看到这些选项,参数由选项来決定 第三步:消息循环 这是整个程序的心臟,程序中几乎所有的控制都从这个点传递 while(GetMessage(&Msg, NULL, 0,0)>0) TranslateMessage(&Msg) DispatchMessage(&Msg); return Msg. wParam; GctMcssagcO从你应用的消息队列中取一个消息任何时候用戶移动鼠标,敲击键盘,点 击你窗口的菜单,或做別的什么事,系统会产生消息并输入到你的程序的消息队列中去.调

...展开详情
试读 92P win32 API编程入门
立即下载 低至0.43元/次 身份认证VIP会员低至7折
一个资源只可评论一次,评论内容不能少于5个字
chenxiaoshou 不值,我说怎么这么小,原来网上都有了
2019-12-04
回复
Qode 不值,我说怎么这么小,原来网上都有了
2018-08-23
回复
上传资源赚积分or赚钱
最新推荐
win32 API编程入门 50积分/C币 立即下载
1/92
win32 API编程入门第1页
win32 API编程入门第2页
win32 API编程入门第3页
win32 API编程入门第4页
win32 API编程入门第5页
win32 API编程入门第6页
win32 API编程入门第7页
win32 API编程入门第8页
win32 API编程入门第9页
win32 API编程入门第10页
win32 API编程入门第11页
win32 API编程入门第12页
win32 API编程入门第13页
win32 API编程入门第14页
win32 API编程入门第15页
win32 API编程入门第16页
win32 API编程入门第17页
win32 API编程入门第18页
win32 API编程入门第19页

试读结束, 可继续读1页

50积分/C币 立即下载 >