(全)windows+sdk编程系列文章

上传人:小** 文档编号:57350412 上传时间:2018-10-21 格式:DOC 页数:301 大小:2.20MB
返回 下载 相关 举报
(全)windows+sdk编程系列文章_第1页
第1页 / 共301页
(全)windows+sdk编程系列文章_第2页
第2页 / 共301页
(全)windows+sdk编程系列文章_第3页
第3页 / 共301页
(全)windows+sdk编程系列文章_第4页
第4页 / 共301页
(全)windows+sdk编程系列文章_第5页
第5页 / 共301页
点击查看更多>>
资源描述

《(全)windows+sdk编程系列文章》由会员分享,可在线阅读,更多相关《(全)windows+sdk编程系列文章(301页珍藏版)》请在金锄头文库上搜索。

1、windows sdk 编程系列文章 - 消息框在本课中,我们将用 C 语言写一个 Windows 程序,程序运行时将弹出一个消息框并显示“hello world“。理论:Windows 为编写应用程序提供了大量的资源。其中最重要的是 Windows API (Application Programming Interface)。 Windows API 是一大组功能强大的函数,它们本身驻扎在 Windows 中供人们随时调用。这些函数的大部分被包含在几个动态 链接库(DLL)中,譬如:kernel32.dll、 user32.dll 和 gdi32.dll。 Kernel32.dll 中的函

2、数主要处理内存管理和进程调度; user32.dll 中的函数主要控制用户界面;gdi32.dll 中的函数则负责图形方面的操作。除了上面主要的三个动态链接库,您还 可以调用包含在其他动态链接库中的函数,当然您必须要有关于这些函数的足够的资料。动态链接库,顾名思义,这些 API 的代码本身并不包含在 Windows 可执行文件中,而是当要使用时才被加载。为了让应用程 序在运行时能找到这些函数,就必须事先把有关的重定位信息嵌入到应用程序的可执行文件中。这些信息存在于引入库中,由 链接器把相关信息从引入库中找出插入到可执行文件中。您必须指定正确的引入库,因为只有正确的引入库才会有正确的重定 位信息

3、。当应用程序被加载时 Windows 会检查这些信息,这些信息包括动态链接库的名字和其中被调用的函数的名字。若检查到这样 的信息,Windows 就会加载相应的动态链接库,并且重定位调用的函数语句的入口地址,以便在调用函数时控制权能转移到函 数内部。如果从和字符集的相关性来分,API 共有两类:一类是处理 ANSI 字符集的,另一类是处理 UNICODE 字符集的。前一类函数 名字的尾部带一个“A“字符,处理 UNICODE 的则带一个“W“字符(我想“W“也许是代表宽字符的意思吧)。我们比较熟悉的 ANSI 字 符串是以 NULL 结尾的一串字符数组,每一个 ANSI 字符是一个 BYTE

4、宽。对于欧洲语言体系,ANSI 字符集已足够了,但对于 有成千上万个唯一字符的几种东方语言体系来说就只有用 UNICODE 字符集了。每一个 UNICODE 字符占有两个 BYTE 宽,这样 一来就可以在一个字符串中使用 65336 个不同字符了。几乎每一个 API 都有处理这两种字符集的形式,例如:MessageBoxA 和 MessageBoxW, 其中 MessageBoxA 是适用于处理 ANSI 字 符集的 API。MessageBoxW 是适用于 UNICODE 字符集的 API。在 c 中为了调用方便,对这两个 API 进行了宏定义。统一使用 MessageBox 。编译的时候会

5、根据编译设置决定是使用 MessageBoxA 还是使用 MessageBoxW。下面摘自 WINUSER.H 中关于 MessageBox 的定义。WINUSERAPI int WINAPI MessageBoxA(HWND hWnd ,LPCSTR lpText,LPCSTR lpCaption,UINT uType);WINUSERAPI int WINAPI MessageBoxW(HWND hWnd ,LPCWSTR lpText,LPCWSTR lpCaption,UINT uType); #ifdef UNICODE #define MessageBox MessageBoxW

6、#else #define MessageBox MessageBoxA #endif 其中 WINUSERAPI 是一个宏,该宏定义了其修饰的函数是从其他库中导入的,还是自身定义的。 #if !defined(_USER32_) #define WINUSERAPI DECLSPEC_IMPORT #else #define WINUSERAPI #endif为了两种字符集都可以支持,在处理字符时,我们使用_T(“)宏。该宏会根据你的设置,将你的字符串转变为相应的字符集。例子:(见光盘 Helloword)#include “windows.h“ #include “tchar.h“int

7、_stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ) MessageBox(NULL,_T(“hello world“),_T(“My First Windows Program“),MB_OK);return 1; 分析: 当我们在工程中 Settings 里面设置如下图所示的 UNICODE,_UNICODE 时,代码中的_T(“hello world“)和_T(“My First Windows Program“)编译时都转化为 unicode 字符。M

8、essageBox 也会使用 MessageBoxW 函数。如果按照下图的设置,使用_MBCS. 代码中的_T(“hello world“)和_T(“My First Windows Program“)编译时都转化为 ANSI 字符。MessageBox 也会 使用 MessageBoxA 函数。windows sdk 编程系列文章 - 简单窗口程序理论:Windows 程序中,在写图形用户界面时需要调用大量的标准 Windows Gui 函数。其实这对用户和程序员来说都有好处,对于 用户,面对的是同一套标准的窗口,对这些窗口的操作都是一样的,所以使用不同的应用程序时无须重新学习操作。对程序员

9、来说,这些 Gui 源代码都是经过了微软的严格测试,随时拿来就可以用的。当然至于具体地写程序对于程序员来说还是有难 度的。为了创建基于窗口的应用程序,必须严格遵守规范。作到这一点并不难,只要用模块化或面向对象的编程方法即可。下面我就列出在桌面显示一个窗口的几个步骤:1. 得到您应用程序的句柄(对于 C 程序,可选); 2. 得到命令行参数(如果您想从命令行得到参数,可选); 3. 注册窗口类(必需,除非您使用 Windows 预定义的窗口类,如 MessageBox 或 dialog box; 4. 产生窗口(必需); 5. 在桌面显示窗口(必需,除非您不想立即显示它); 6. 刷新窗口客户区

10、; 7. 进入无限的获取窗口消息的循环; 8. 如果有消息到达,由负责该窗口的窗口回调函数处理; 9. 如果用户关闭窗口,进行退出处理。 相对于单用户的 DOS 下的编程来说,Windows 下的程序框架结构是相当复杂的。但是 Windows 和 DOS 在系统架构上是截然 不同的。Windows 是一个多任务的操作系统,故系统中同时有多个应用程序彼此协同运行。这就要求 Windows 程序员必须严 格遵守编程规范,并养成良好的编程风格。例子:(见光盘 FirstWindow)#include “Windows.h“#include “tchar.h“HWND hWinMain; TCHAR

11、szClassName = _T(“MyClass“); TCHAR szCaptionMain = _T(“My First Window!“); TCHAR szText = _T(“Win32 program, Simple and powerful !“); WNDCLASSEX stdWndClass;/如果有消息到达,由负责该窗口的窗口回调函数处理LRESULT CALLBACK ProcWinMain( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam ) switch(Msg)/如果用户关闭窗口,进行退出处理case WM_CL

12、OSE:DestroyWindow(hWinMain);PostQuitMessage(NULL);break;default:return DefWindowProc(hWnd, Msg, wParam, lParam ); return 0; int WINAPI WinMain( HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow ) MSG stMsg;WNDCLASSEX stdWndClass;RtlZeroMemory(stdWndClass.hCursor = LoadCursor(0

13、,IDC_ARROW);stdWndClass.cbSize = sizeof(stdWndClass);stdWndClass.style = CS_HREDRAW|CS_VREDRAW;stdWndClass.lpfnWndProc = ProcWinMain;stdWndClass.hbrBackground = (HBRUSH)COLOR_WINDOW;stdWndClass.lpszClassName = szClassName;stdWndClass.hInstance = hInstance;/注册窗口RegisterClassEx(/产生窗口hWinMain = CreateW

14、indowEx(WS_EX_CLIENTEDGE,szClassName,szCaptionMain,WS_OVERLAPPEDWINDOW,100,100,600,400,NULL,NULL,hInstance,NULL);if(!hWinMain)return 0;/在桌面显示窗口ShowWindow(hWinMain,SW_SHOWNORMAL);/刷新窗口客户区UpdateWindow(hWinMain);/进入无限的获取窗口消息的循环while(GetMessage(DispatchMessage(return stMsg.wParam; 分析:看到一个简单的 Windows 程序有

15、这么多行,您是不是有点想撤? 但是您必须要知道的是上面的大多数代码都是模板而已,模 板的意思即是指这些代码对差不多所有标准 Windows 程序来说都是相同的。在写 Windows 程序时您可以把这些代码拷来拷去, 当然把这些重复的代码写到一个库中也挺好。其实真正要写的代码集中在 WinMain 中。这和一些 C 编译器一样,无须要关心 其它杂务,集中精力于 WinMain 函数。唯一不同的是 C 编译器要求您的源代码有必须有一个函数叫 WinMain。否则 C 无法 知道将哪个函数和有关的前后代码链接。相对 C,汇编语言提供了较大的灵活性,它不强行要求一个叫 WinMain 的函数。下面我们

16、开始分析,您可得做好思想准备,这可不是一件太轻松的活。头文件: windows.h 是编写 windows 程序必须要包含的,因为其中包含大量要用到的常量和结构的定义, windowd.h 还没有 包含 windows 所有的常量和结构定义,对于程序中我们用到的在 windows.h 定义之外的,我们可以通过察看 msdn,找到该结构 和函数所在的头文件和库文件,包含进来就行。tchar.h 定义了我们用得宏 _T(x).我们的程序调用的 API 在 user32.dll (譬如:CreateWindowEx, RegisterWindowClassEx) 和 kernel32.dll (ExitProcess) 中的函数,所以必须链接这两个库。接下来我如果问:您需要把什么库链入您的程序呢 ? 答案是:先查到您要调用的函数在 什么库中,然后包含进来。在 VC6 的 settings 中已经包含了常用的 lib.如图所示。因此,我们在代码中就无需显式的加载用 到的库。显式加载的方法是在代码中

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 商业/管理/HR > 管理学资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号