VB编程基础课教程
API是Windows系统DLL文件中的预定义函数集合,是32位应用程序编程接口。掌握API能帮助理解Windows体系结构,提升编程水平。API声明需用Declare语句指定所在DLL文件和别名。数据类型与VB类似,但注意类型安全。常数和结构需预先声明,结构按引用传递。
先从最基础的讲起。很多接触VB编程的朋友,迟早会遇到一个绕不开的名词——API。这到底是什么?说穿了,API就是一组预先写好的函数,它们藏在Windows系统目录下那些以DLL为后缀的动态链接库文件里。标准定义是:API是Windows的32位应用程序编程接口,包含一系列相当复杂的函数、消息和结构,它让不同编程语言写出来的程序,都能在Windows 95和NT上跑起来。
如果你以前学过VC,那API对你来说不算陌生。但如果你对Windows的体系结构不太熟悉,那学习API确实会是一件挺辛苦的事。
打开Windows的System文件夹,你会看到一大堆DLL文件。别以为一个DLL里就只有一个函数——几十个甚至几百个都很常见。我们能把它们全掌握吗?答案很明确:不可能,也没那个必要。关键是要抓住Windows系统自带的那些API,同时把那些和VB自带函数重复的剔除掉。举个例子,VB的GetAttr和SetAttr能读写文件属性,API里对应的GetFileAttributes和SetFileAttributes功能也差不多。这么一筛选,剩下来的大概还有五六百个。看起来还是不少,但可以确定的是,只要你扎实掌握其中一百个,编程水平就能比现在高出一大截。
话说回来,API和VB哪个更贴近Windows?答案是API。学会API,最大的收获不是多背了几个函数名,而是真正开始理解Windows的体系结构——这个收获确实来之不易。
如果不靠API,你会遇到什么情况?市面上几乎所有的高级编程书——注意,不是名字叫“高级”才算数,而是那些在序言里写着“本书面向有一定VB基础的读者”的书——它们开篇讨论的,往往都是从API开始的。换句话说,不学API,你可能就卡在初级水平,很难再往上走。唯一的出路可能就是到处求人:“这个怎么办?那个怎么弄?”虽然现在网上愿意帮忙的人不少,但说实话,靠这种方式是出不了好作品的。因为你脑子里缺少全局的设计思路,这才是根本问题。
API文本游览器
很多API函数的名称长得吓人。不信?来看看DdeClientTransaction这个函数:
Declare Function DdeClientTransaction Lib "user32" (pData As Byte, ByVal cbData As Long, ByVal hConv As Long, ByVal hszItem As Long, ByVal wFmt As Long, ByVal wType As Long, ByVal dwTimeout As Long, pdwResult As Long) As Long
哇,这么长?第一次接触的话,可能不少人会被吓住,甚至开始犹豫要不要继续学下去。不过不用慌,有个好东西能帮上大忙——API文本查看器。
通过API文本查看器,你可以很方便地查找程序需要的函数声明、结构类型和常数,然后直接复制到剪贴板,再粘贴到VB的代码段里。大多数情况下,只要你确定了这三个要素——函数、结构、常数——就能通过这个工具把它们加入程序,然后正常使用。当然,这只是API的入门操作,远不是它的全部。真正需要花功夫琢磨的是:什么时候该用什么函数,什么时候该用什么结构,什么时候该用什么常数。
API函数声明
先回想一下,在VB里怎么声明一个函数?如果你正在看这篇文章,应该能轻松回答这个问题。比如:
Function SetFocus (ByVal hwnd As Long) As Long
这行代码定义了一个名为SetFocus的函数,它接受一个Long型的参数(按值传递),返回一个Long型结果。
API函数的声明长得差不多,但稍微复杂一点。比如API版的SetFocus是这样写的:
Declare Function SetFocus Lib "user32" Alias "SetFocus" (ByVal hwnd As Long) As Long
看起来复杂了一些对吧?但除了多出来的那几部分,其他还是老样子。调用方式也一样:
Dim dl As Long
dl = SetFocus(Form1.hwnd)
不过有一点很清楚:API函数不像你自己写的代码那样能看到内部逻辑,也不像VB自带的函数那样能从联机帮助里查到用法。唯一的方法就是去学、去查VB以外的资料。
Declare语句用来在模块级别声明对DLL中外部过程的引用。记住一点:任何API函数的声明都必须以Declare开头。
Lib指明函数来自哪个DLL文件。比如SetFocus Lib "user32"说明它来自user32.dll。主要的DLL文件有:
user32.dll:Windows管理,负责生成和管理应用程序的用户接口。GDI32.dll:图形设备接口,负责Windows设备的图形输出。Kernel32.dll:系统服务,提供对操作系统计算机资源的访问。
注意,如果DLL文件不在Windows或System文件夹里,必须在声明中写明路径。比如:SetFocus Lib "c:\Mydll\user32"。
Alias是可选的,表示函数在DLL里还有另一个名称。比如Alias "SetFocus",说明SetFocus在user32.dll里还有一个名字也叫SetFocus。当然,也可能不同——很多情况下,别名末尾会有一个字母“A”,比如SetWindowsTextA,表示这是ANSI版本。这只是设计者们的习惯命名。
别名到底有什么用?简单说,它允许你用一个不同的名字来调用同一个API函数。如果你指定了别名,虽然你在代码里按Declare后面的函数名调用,但实际执行时会优先用别名。下面两个声明都是有效的,调用的其实是同一个函数:
Declare Function SetFocus Lib "user32" Alias "SetFocus" (ByVal hwnd As Long) As Long
Declare Function ABCD Lib "user32" Alias "SetFocus" (ByVal hwnd As Long) As Long
有一点需要注意:如果用Alias,要留意别名的大小写;如果不使用Alias,函数名本身的大小写必须准确,不能随意改动。当然,大多数情况下函数声明是从API文本游览器直接拷贝的,这种错误发生的几率很小,但了解总没坏处。
最后提醒一句:API声明(包括结构、常数)必须放在窗体或模块的“通用”(General Declarations)段。
数据类型与“类型安全”
API函数里用的数据类型和VB大致相同。但Win32的API里没有Integer数据类型,也看不到Boolean。VB里的Variant类型在API里会以Any的形式出现,比如Data As Any。虽然这么写意味着可以传任意类型的参数,但这有个隐患——它会关闭对目标参数的所有类型检查,容易给各种类型的参数调用带来错误。
为了强制执行严格的类型检查,避免上述问题,可以用前面提到的Alias技术。来看GetDIBits函数的两种声明方式:
原型声明:
Public Declare Function GetDIBits Lib "gdi32" Alias "GetDIBits" (ByVal aHDC As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI As BITMAPINFO, ByVal wUsage As Long) As Long
改型声明:
Public Declare Function GetDIBitsLong Lib "gdi32" Alias "GetDIBits" (ByVal aHDC As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Long, lpBI As BITMAPINFO, ByVal wUsage As Long) As Long
通过之前的知识可以判断,不管用原型还是改型,实际调用的都是Alias指定的GetDIBits函数。区别在于,改型把lpBits强制指定为Long型,这样出错的几率就被大大降低了。这种声明方法就叫“安全类型”声明。
API函数里常见的数据类型无非这么几种:Long、String、Byte、Any……基本就这些了。
常数
API常数这部分没什么太特别的。看VB里的代码:
Msg = MsgBox("您好", vbOKCancel)
我们知道vbOKCancel这个常数的值等于1。上面的代码完全可以写成:
Msg = MsgBox("您好", 1)
但估计没人愿意这么写——读起来太费劲了。API也是用的这个思路,只不过API常数必须在使用前先做好初始化声明,VB自己看不懂。内容还是来自API文本游览器,形式大概是这样:
Public Const ABM_ACTIVATE = &H6
Public Const RIGHT_CTRL_PRESSED = &H4
Public Const RPC_E_SERVER_DIED = &H80010007
Private Const RPC_S_CALL_FAILED_DNE = 1727&
有些程序会用Global来定义常数,比如Global Const ABM_ACTIVATE = &H6。但用Public完全可以替代它。过去也用过Global,但现在不这么做了——一会儿用这个,一会儿用那个,各个程序之间没法保持一致,看着就别扭。
结构
“结构”是C和C++里的说法,在VB里通常叫“自定义数据类型”。很多朋友应该已经认识它了。不过,在API领域里更愿意叫它“结构”,因为API里的各种结构类型,严格来说不是我们自己“自定义”的。
在VB里,API结构同样用Type...End Type语句来定义。比如API中的点(Point)结构:
Public Type POINTAPI
X As Long '点在X坐标上的值
Y As Long '点在Y坐标上的值
End Type
再比如矩形(Rect)结构:
Public Type RECT
Left As Long '矩形左上角的X坐标
Top As Long '矩形左上角的Y坐标
Right As Long '矩形右下角的X坐标
Bottom As Long '矩形右下角的Y坐标
End Type
这些内容同样可以从API文本游览器里拷过来。结构里的变量名可以随意改动,不会影响结构本身——它们本质上是虚拟的。比如POINTAPI可以改成:
Public Type POINTAPI
MyX As Long
MyY As Long
End Type
不过,通常没有这个必要。
结构本身就是一种数据类型,所以在用之前需要先声明一个变量为该结构类型。声明方法和普通数据一样:
Dim MyPoint As POINTAPI
引用结构里的成员变量也很简单——在结构名后面加一个点,然后写成员变量名。这很像VB里引用对象的某个属性。比如把MyPoint里的X值赋给Temp&:
Temp& = MyPoint.X
但要特别留意:别以为上面的MyPoint是一个“值”——它其实是一个地址(指针)。值和地址是完全不同的概念。结构要求按引用传递给Windows函数,也就是说,所有API函数里的结构都是按ByRef传递的(这在Declare语句里是默认值)。不要试图用ByVal传结构,那样什么都拿不到。因为结构名本身就是指向这个结构的指针(也就是结构的首地址),所以你只需要传结构名就行。
由于传的是指针,函数会直接对结构进行读写操作。这个特性很适合用来把函数执行的结果装进结构里。
小结
下面这个例子是为了总结本课内容。启动VB,新建一个项目,加一个命令按钮,把下面的代码拷贝进去,运行看看:
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Type POINTAPI
X As Long
Y As Long
End Type
Sub PrintCursorPos()
Dim dl As Long
Dim MyPoint As POINTAPI
dl = GetCursorPos(MyPoint) '调用函数,获取屏幕鼠标坐标
Debug.Print "X=" & Str(MyPoint.X) & " and " & "Y=" & Str(MyPoint.Y)
End Sub
Private Sub Command1_Click()
PrintCursorPos
End Sub
输出结果(每次都可能不同,取决于鼠标在屏幕上的位置)大致像这样:
X= 240 and Y= 151
在这个例子里,GetCursorPos函数用来获取鼠标指针在屏幕上的位置。你会发现,作为参数传递的MyPoint结构,在函数调用之后内容发生了实质性的变化——这正是因为结构是按ByRef方式传递的。
一些API函数集
1. 控件与消息函数
- AdjustWindowRect:给定一种窗口样式,计算获得目标客户区矩形所需的窗口大小
- AnyPopup:判断屏幕上是否存在任何弹出式窗口
- ArrangeIconicWindows:排列一个父窗口的最小化子窗口
- AttachThreadInput:连接线程输入函数
- BeginDeferWindowPos:启动构建一系列新窗口位置的过程
- BringWindowToTop:将指定的窗口带至窗口列表顶部
- CascadeWindows:以层叠方式排列窗口
- ChildWindowFromPoint:返回父窗口中包含了指定点的第一个子窗口的句柄
- ClientToScreen:判断窗口内以客户区坐标表示的一个点的屏幕坐标
- CloseWindow:最小化指定的窗口
- CopyRect:矩形内容复制
- DeferWindowPos:为特定的窗口指定一个新窗口位置
- DestroyWindow:清除指定的窗口以及它的所有子窗口
- DrawAnimatedRects:描绘一系列动态矩形
- EnableWindow:在指定的窗口里允许或禁止所有鼠标及键盘输入
- EndDeferWindowPos:同时更新DeferWindowPos调用时指定的所有窗口的位置及状态
- EnumChildWindows:为指定的父窗口枚举子窗口
- EnumThreadWindows:枚举与指定任务相关的窗口
- EnumWindows:枚举窗口列表中的所有父窗口
- EqualRect:判断两个矩形结构是否相同
- FindWindow:寻找窗口列表中第一个符合指定条件的顶级窗口
- FindWindowEx:在窗口列表中寻找与指定条件相符的第一个子窗口
- FlashWindow:闪烁显示指定窗口
- GetActiveWindow:获得活动窗口的句柄
- GetCapture:获得一个窗口的句柄,这个窗口位于当前输入线程,且拥有鼠标捕获
- GetClassInfo:取得WNDCLASS结构(或WNDCLASSEX结构)的一个副本
- GetClassLong:取得窗口类的一个Long变量条目
- GetClassName:为指定的窗口取得类名
- GetClassWord:为窗口类取得一个整数变量
- GetClientRect:返回指定窗口客户区矩形的大小
- GetDesktopWindow:获得代表整个屏幕的一个窗口(桌面窗口)句柄
- GetFocus:获得拥有输入焦点的窗口的句柄
- GetForegroundWindow:获得前台窗口的句柄
- GetLastActivePopup:获得在一个给定父窗口中最近激活过的弹出式窗口的句柄
- GetLastError:针对之前调用的API函数,取得扩展错误信息
- GetParent:判断指定窗口的父窗口
- GetTopWindow:搜索内部窗口列表,找到隶属于指定窗口的第一个窗口的句柄
- GetUpdateRect:获得一个矩形,描述指定窗口中需要更新的那部分
- GetWindow:获得一个窗口的句柄,该窗口与某源窗口有特定关系
- GetWindowContextHelpId:取得与窗口关联的帮助场景ID
- GetWindowLong:从指定窗口的结构中取得信息
- GetWindowPlacement:获得指定窗口的状态及位置信息
- GetWindowRect:获得整个窗口的范围矩形(包括边框、标题栏、滚动条、菜单等)
- GetWindowText:取得窗体的标题文字或控件的内容
- GetWindowTextLength:调查窗口标题文字或控件内容的长度
- GetWindowWord:获得指定窗口结构的信息
- InflateRect:增大或减小一个矩形的大小
- IntersectRect:在lpDestRect里载入一个矩形,它是lpSrc1Rect与lpSrc2Rect两个矩形的交集
- InvalidateRect:屏蔽一个窗口客户区的全部或部分区域
- IsChild:判断一个窗口是否为另一窗口的子或隶属窗口
- IsIconic:判断窗口是否已最小化
- IsRectEmpty:判断一个矩形是否为空
- IsWindow:判断一个窗口句柄是否有效
- IsWindowEnabled:判断窗口是否处于活动状态
- IsWindowUnicode:判断一个窗口是否为Unicode窗口
- IsWindowVisible:判断窗口是否可见
- IsZoomed:判断窗口是否最大化
- LockWindowUpdate:锁定指定窗口,禁止它更新
- MapWindowPoints:将一个窗口客户区坐标的点转换到另一窗口的客户区坐标系
- MoveWindow:改变指定窗口的位置和大小
- OffsetRect:通过应用一个指定的偏移,让矩形移动起来
- OpenIcon:恢复一个最小化的程序并将其激活
- PtInRect:判断指定的点是否位于矩形内部
- RedrawWindow:重画全部或部分窗口
- ReleaseCapture:为当前应用程序释放鼠标捕获
- ScreenToClient:判断屏幕上一个指定点的客户区坐标
- ScrollWindow:滚动窗口客户区的全部或一部分
- ScrollWindowEx:根据附加选项,滚动窗口客户区的全部或部分
- SetActiveWindow:激活指定的窗口
- SetCapture:将鼠标捕获设置到指定的窗口
- SetClassLong:为窗口类设置一个Long变量条目
- SetClassWord:为窗口类设置一个条目
- SetFocusAPI:将输入焦点设到指定的窗口,必要时会激活窗口
- SetForegroundWindow:将窗口设为系统的前台窗口
- SetParent:指定一个窗口的新父
- SetRect:设置指定矩形的内容
- SetRectEmpty:将矩形设为一个空矩形
- SetWindowContextHelpId:为指定的窗口设置帮助场景ID
- SetWindowLong:在窗口结构中为指定的窗口设置信息
- SetWindowPlacement:设置窗口状态和位置信息
- SetWindowPos:为窗口指定一个新位置和状态
- SetWindowText:设置窗口的标题文字或控件的内容
- SetWindowWord:在窗口结构中为指定的窗口设置信息
- ShowOwnedPopups:显示或隐藏由指定窗口所有的全部弹出式窗口
- ShowWindow:控制窗口的可见性
- ShowWindowAsync:与ShowWindow相似
- SubtractRect:装载矩形lprcDst,它是从矩形lprcSrc1中减去lprcSrc2得到的结果
- TileWindows:以平铺顺序排列窗口
- UnionRect:装载lpDestRect目标矩形,它是lpSrc1Rect和lpSrc2Rect的并集
- UpdateWindow:强制立即更新窗口
- ValidateRect:校验窗口的全部或部分客户区
- WindowFromPoint:返回包含了指定点的窗口的句柄,忽略屏蔽、隐藏以及透明窗口
2. 硬件与系统函数
- ActivateKeyboardLayout:激活一个新的键盘布局
- Beep:生成简单的声音
- CharToOem:将字串从ANSI字符集转换到OEM字符集
- ClipCursor:将指针限制到指定区域
- CreateCaret:根据指定信息创建一个插入符(光标),并选定为指定窗口的默认插入符
- DestroyCaret:清除一个插入符
- EnumCalendarInfo:枚举在指定“地方”环境中可用的日历信息
- EnumDateFormats:列举指定“当地”设置中可用的长、短日期格式
- EnumSystemCodePages:枚举系统中已安装或支持的代码页
- EnumSystemLocales:枚举系统已安装或支持的“地方”设置
- EnumTimeFormats:枚举指定地方适用的时间格式
- ExitWindowsEx:退出Windows,并用特定选项重新启动
- ExpandEnvironmentStrings:扩充环境字串
- FreeEnvironmentStrings:翻译指定的环境字串块
- GetACP:判断当前生效的ANSI代码页
- GetAsyncKeyState:判断函数调用时指定虚拟键的状态
- GetCaretBlinkTime:判断插入符光标的闪烁频率
- GetCaretPos:判断插入符的当前位置
- GetClipCursor:取得描述当前鼠标指针剪切区域的矩形
- GetCommandLine:获得指向当前命令行缓冲区的指针
- GetComputerName:取得计算机名称
- GetCPInfo:取得与指定代码页有关的信息
- GetCurrencyFormat:针对指定“地方”设置,按货币格式格式化数字
- GetCursor:获取当前选择的鼠标指针句柄
- GetCursorPos:获取鼠标指针的当前位置
- GetDateFormat:针对指定“当地”格式,格式化一个系统日期
- GetDoubleClickTime:判断连续两次鼠标单击之间会被处理成双击事件的间隔时间
- GetEnvironmentStrings:为包含当前环境字串的内存块分配并返回句柄
- GetEnvironmentVariable:取得环境变量的值
- GetInputState:判断是否存在待决的鼠标或键盘事件
- GetKBCodePage:由GetOEMCP取代,功能相同
- GetKeyboardLayout:取得描述指定应用程序键盘布局的句柄
- GetKeyboardLayoutList:获得系统适用的所有键盘布局列表
- GetKeyboardLayoutName:取得当前活动键盘布局的名称
- GetKeyboardState:取得键盘上每个虚拟键的当前状态
- GetKeyboardType:了解与正在使用的键盘有关的信息
- GetKeyNameText:在给出扫描码的前提下判断键名
- GetKeyState:针对已处理的按键,在最近一次输入信息时判断指定虚拟键的状态
- GetLastError:针对之前调用的API函数,取得扩展错误信息
- GetLocaleInfo:取得与指定“地方”有关的信息
- GetLocalTime:取得本地日期和时间
- GetNumberFormat:针对指定“地方”,按特定格式格式化数字
- GetOEMCP:判断在OEM和ANSI字符集间转换的Windows代码页
- GetQueueStatus:判断应用程序消息队列中待决的消息类型
- GetSysColor:判断指定Windows显示对象的颜色
- GetSystemDefaultLangID:取得系统的默认语言ID
- GetSystemDefaultLCID:取得当前的默认系统“地方”
- GetSystemInfo:取得与底层硬件平台有关的信息
- GetSystemMetrics:返回与Windows环境有关的信息
- GetSystemPowerStatus:获得与当前系统电源状态有关的信息
- GetSystemTime:取得当前系统时间(UTC格式,即GMT)
- GetSystemTimeAdjustment:使内部系统时钟与外部时钟信号源同步
- GetThreadLocale:取得当前线程的地方ID
- GetTickCount:获取自Windows启动以来经历的时间长度(毫秒)
- GetTimeFormat:针对当前指定“地方”,按特定格式格式化系统时间
- GetTimeZoneInformation:取得与系统时区设置有关的信息
- GetUserDefaultLangID:为当前用户取得默认语言ID
- GetUserDefaultLCID:取得当前用户的默认“地方”设置
- GetUserName:取得当前用户的名字
- GetVersion:判断当前运行的Windows和DOS版本
- GetVersionEx:取得与平台和操作系统有关的版本信息
- HideCaret:在指定窗口隐藏插入符(光标)
- IsValidCodePage:判断一个代码页是否有效
- IsValidLocale:判断地方标识符是否有效
- keybd_event:模拟键盘行动
- LoadKeyboardLayout:载入一个键盘布局
- MapVirtualKey:根据指定映射类型,执行不同的扫描码和字符转换
- MapVirtualKeyEx:同上,但提供额外功能
- MessageBeep:播放一个系统声音(在控制面板里设定)
- mouse_event:模拟一次鼠标事件
- OemKeyScan:判断OEM字符集中一个ASCII字符的扫描码和Shift键状态
- OemToChar:将OEM字符集的一个字串转换到ANSI字符集
- SetCaretBlinkTime:指定插入符(光标)的闪烁频率
- SetCaretPos:指定插入符的位置
- SetComputerName:设置新的计算机名
- SetCursor:将指定的鼠标指针设为当前指针
- SetCursorPos:设置指针的位置
- SetDoubleClickTime:设置连续两次鼠标单击之间被认为是双击事件的间隔时间
- SetEnvironmentVariable:将环境变量设为指定的值
- SetKeyboardState:设置每个虚拟键当前在键盘上的状态
- SetLocaleInfo:改变用户“地方”设置信息
- SetLocalTime:设置当前地方时间
- SetSysColors:设置指定窗口显示对象的颜色
- SetSystemCursor:改变任何一个标准系统指针
- SetSystemTime:设置当前系统时间
- SetSystemTimeAdjustment:定时添加校准值,使内部系统时钟与外部时钟信号源同步
- SetThreadLocale:为当前线程设置地方
- SetTimeZoneInformation:设置系统时区信息
- ShowCaret:在指定窗口里显示插入符(光标)
- ShowCursor:控制鼠标指针的可视性
- SwapMouseButton:决定是否互换鼠标左右键功能
- SystemParametersInfo:获取和设置众多Windows系统参数
- SystemTimeToTzSpecificLocalTime:将系统时间转换成地方时间
- ToAscii:根据当前扫描码和键盘信息,将虚拟键转换成ASCII字符
- ToUnicode:根据当前扫描码和键盘信息,将虚拟键转换成Unicode字符
- UnloadKeyboardLayout:卸载指定的键盘布局
- VkKeyScan:针对Windows字符集中的ASCII字符,判断虚拟键码和Shift键的状态
3. 菜单函数
- AppendMenu:在指定的菜单里添加一个菜单项
- CheckMenuItem:复选或撤消复选指定的菜单条目
- CheckMenuRadioItem:指定一个菜单条目被复选成“单选”项目
- CreateMenu:创建新菜单
- CreatePopupMenu:创建一个空的弹出式菜单
- DeleteMenu:删除指定的菜单条目
- DestroyMenu:删除指定的菜单
- DrawMenuBar:为指定的窗口重画菜单
- EnableMenuItem:允许或禁止指定的菜单条目
- GetMenu:取得窗口中一个菜单的句柄
- GetMenuCheckMarkDimensions:返回菜单复选符的大小
- GetMenuContextHelpId:取得菜单的帮助场景ID
- GetMenuDefaultItem:判断菜单中的哪个条目是默认条目
- GetMenuItemCount:返回菜单中条目的数量
- GetMenuItemID:返回位于菜单中指定位置处的条目的菜单ID
- GetMenuItemInfo:取得与一个菜单条目有关的特定信息
- GetMenuItemRect:在一个矩形中装载指定菜单条目的屏幕坐标信息
- GetMenuState:取得与指定菜单条目状态有关的信息
- GetMenuString:取得指定菜单条目的字串
- GetSubMenu:取得一个弹出式菜单的句柄,它位于菜单中指定的位置
- GetSystemMenu:取得指定窗口的系统菜单的句柄
- HiliteMenuItem:控制顶级菜单条目的加亮显示状态
- InsertMenu:在菜单的指定位置处插入一个菜单条目,并将其他条目向下移动
- InsertMenuItem:插入一个新菜单条目
- IsMenu:判断指定的句柄是否为一个菜单的句柄
- LoadMenu:从指定的模块或应用程序实例中载入一个菜单
- LoadMenuIndirect:载入一个菜单
- MenuItemFromPoint:判断哪个菜单条目包含了屏幕上指定的点
- ModifyMenu:改变菜单条目
- RemoveMenu:删除指定的菜单条目
- SetMenu:设置窗口菜单
- SetMenuContextHelpId:设置菜单的帮助场景ID
- SetMenuDefaultItem:将一个菜单条目设为默认条目
- SetMenuItemBitmaps:设置位图,在指定菜单条目中代替标准的复选符号
- SetMenuItemInfo:为一个菜单条目设置指定的信息
- TrackPopupMenu:在屏幕任意地方显示一个弹出式菜单
- TrackPopupMenuEx:与TrackPopupMenu相似,但提供额外功能
以下是几个与菜单函数相关的类型定义:
- MENUITEMINFO:包含菜单条目的信息
- TPMPARAMS:用于TrackPopupMenuEx函数,支持额外功能
4. 绘图函数
- AbortPath:抛弃选入指定设备场景中的所有路径,同时取消正在进行的任何路径创建工作
- AngleArc:用一个连接弧画一条线
- Arc:画一个圆弧
- BeginPath:启动一个路径分支
- CancelDC:取消另一个线程里的长时间绘图操作
- Chord:画一个弦
- CloseEnhMetaFile:关闭指定增强型图元文件设备场景,并返回新建图元文件的句柄
- CloseFigure:描绘到一个路径时,关闭当前打开的图形
- CloseMetaFile:关闭指定的图元文件设备场景,并向新建图元文件返回句柄
- CopyEnhMetaFile:制作指定增强型图元文件的副本
- CopyMetaFile:制作指定(标准)图元文件的副本
- CreateBrushIndirect:在LOGBRUSH数据结构基础上创建刷子
- CreateDIBPatternBrush:用与设备无关的位图创建刷子
- CreateEnhMetaFile:创建增强型图元文件设备场景
- CreateHatchBrush:创建带有阴影图案的刷子
- CreateMetaFile:创建图元文件设备场景
- CreatePatternBrush:用指定位图图案创建刷子
- CreatePen:用指定样式、宽度和颜色创建画笔
- CreatePenIndirect:根据LOGPEN结构创建画笔
- CreateSolidBrush:用纯色创建刷子
- DeleteEnhMetaFile:删除指定的增强型图元文件
- DeleteMetaFile:删除指定的图元文件
- DeleteObject:删除GDI对象,释放所有系统资源
- DrawEdge:用指定样式描绘矩形边框
- DrawEscape:换码函数,将数据直接发至显示设备驱动程序
- DrawFocusRect:画一个焦点矩形
- DrawFrameControl:描绘一个标准控件
- DrawState:为图像或绘图操作应用各种效果
- Ellipse:描绘一个椭圆,由指定的矩形围绕
- EndPath:停止定义路径
- EnumEnhMetaFile:针对增强型图元文件,列举其中单独的图元文件记录
- EnumMetaFile:为标准Windows图元文件枚举单独的图元文件记录
- EnumObjects:枚举可随同指定设备场景使用的画笔和刷子
- ExtCreatePen:创建一个扩展画笔(装饰或几何)
- ExtFloodFill:在指定设备场景里,用当前选择的刷子填充区域
- FillPath:关闭路径中任何打开的图形,并用当前刷子填充
- FillRect:用指定刷子填充矩形
- FlattenPath:将路径中所有曲线转换成线段
- FloodFill:用当前选定的刷子在指定设备场景中填充区域
- FrameRect:用指定的刷子围绕矩形画边框
- GdiComment:为指定增强型图元文件设备场景添加注释信息
- GdiFlush:执行任何未决的绘图操作
- GdiGetBatchLimit:判断有多少个GDI绘图命令位于队列中
- GdiSetBatchLimit:指定有多少个GDI绘图命令能进入队列
- GetArcDirection:画圆弧时,判断当前绘图的方位
- GetBkColor:取得指定设备场景当前的背景颜色
- GetBkMode:针对指定设备场景,取得当前背景填充模式
- GetBrushOrgEx:判断指定设备场景中当前选定刷子的起点
- GetCurrentObject:获得指定类型的当前选定对象
- GetCurrentPositionEx:在指定的设备场景中取得当前的画笔位置
- GetEnhMetaFile:取得磁盘文件中包含的一个增强型图元文件的句柄
- GetEnhMetaFileBits:将指定增强型图元文件复制到内存缓冲区
- GetEnhMetaFileDescription:返回增强型图元文件的说明
- GetEnhMetaFileHeader:取得增强型图元文件的文件头
- GetEnhMetaFilePaletteEntries:取得增强型图元文件的全部或部分调色板
- GetMetaFile:取得磁盘文件中包含的一个图元文件的句柄
- GetMetaFileBitsEx:将指定图元文件复制到内存缓冲区
- GetMiterLimit:取得设备场景的斜率限制设置
- GetNearestColor:根据设备显示能力,取得与指定颜色最接近的纯色
- GetObjectAPI:取得对指定对象进行说明的结构
- GetObjectType:判断由指定句柄引用的GDI对象的类型
- GetPath:取得对当前路径进行定义的数据
- GetPixel:在指定设备场景中取得一个像素的RGB值
- GetPolyFillMode:针对指定设备场景,获得多边形填充模式
- GetROP2:针对指定设备场景,取得当前的绘图模式
- GetStockObject:取得一个固有对象
- GetSysColorBrush:为任何一种标准系统颜色取得一个刷子
- GetWinMetaFileBits:将增强型图元文件转换成标准Windows图元文件
- InvertRect:通过反转每个像素的值,反转设备场景中指定的矩形
- LineDDA:枚举指定线段中的所有点
- LineTo:用当前画笔画一条线,从当前位置连到一个指定的点
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















