当前位置:文档之家› API函数详解

API函数详解

API函数详解
API函数详解

API函数详解

摘要:什么是API

你不学API,你大概将停留在初级水平,无法往上攀登

API文本游览器

什么时候使用什么函数,什么时候使用什么结构类型,什么时候使用什么常数

一些API函数集

正文:

API函数详解(转载自红尘如烟)

标签:

首先,有必要向大家讲一讲,什么是API。所谓API本来是为C和C++程序员写的。API说来说去,就是一种函数,他们包含在一个附加名为DLL的动态连接库文件中。用标准的定义来讲,API就是Windows的32位应用程序编程接口,是一系列很复杂的函数,消息和结构,它使编程人员可以用不同类型的编程语言编制出的运行在Windows95和Wi ndows NT操作系统上的应用程序。可以说,如果你曾经学过VC,那么API对你来说不是什么问题。但是如果你没有学过VC,或者你对Windows95的结构体系不熟悉,那么可以说,学习API将是一件很辛苦的事情。

如果你打开WINDOWS的SYSTEM文件夹,你可以发现其中有很多附加名为DLL的文件。一个DLL中包含的API函数并不只是一个,数十个,甚至是数百个。我们能都掌握它嘛?回答是否定的∶不可能掌握。但实际上,我们真的没必要都掌握,只要重点掌握Wi ndos系统本身自带的API函数就可以了。但,在其中还应当抛开掉同VB本身自有的函数重复的函数。如,VB的etAttr命令可以获得文件属性,SetAttr可以设置文件属性。对A PI来讲也有对应的函数GetFileAttributes和SetFileAttributes,性能都差不多。如此地一算,剩下来的也就5、600个。是的,也不少。但,我可以敢跟你说,只要你熟悉地掌握100个,那么你的编程水平比现在高出至少要两倍。尽管人们说VB和WINDOWS具有密切的关系,但我认为,API更接近WINDOWS。如果你学会了API,首要的收获便是对W INDOWS体系结构的认识。这个收获是来自不易的。

如果你不依靠API会怎么样?我可以跟你说,绝大多是高级编程书本(当然这不是书的名程叫高级而高级的,而是在一开始的《本书内容》中指明《本书的阅读对象是具有一定V B基础的读者》的那些书),首先提的问题一般大都是从API开始。因此可以说,你不学A PI,你大概将停留在初级水平,无法往上攀登。唯一的途径也许就是向别人求救∶我快死了,

快来救救我呀,这个怎么办,那个怎么办?烦不烦呢?当然,现在网上好人太多(包括我在内,嘻嘻),但,你应当明白,通过此途径,你的手中出不了好的作品。这是因为缺乏这些知识你的脑子里根本行不成一种总体的设计构思。

API文本游览器

很多API函数都是很长很长的。想看什么样子吗?如下就是作为例子的API DdeClien tTransaction函数∶

Declare Function DdeClientTransaction Lib "user32" (pData As Byte, ByVal cbData As Long, ByVal hConv As Long, ByVal hszItem As Long, ByVal wF mt As Long, ByVal wType As Long, ByVal dwTimeout As Long, pdwResult

As Long) As Long

哇!这么长?如果你从来没有接触过API,我想你肯定被吓住了。你也许考虑,该不该继续学下去。不过不要担心,幸运的是Microsoft的设计家们为我们提供了有用的工具,这便是API文本查看器。

通过API文本查看器,我们可以方便地查找程序所需要的函数声明、结构类型和常数,然后将它复制到剪贴板,最后再粘贴到VB程序的代码段中。在大多数情况下,只要我们确定了程序所需要的函数、结构和常数这三个方面后,就可以通过对API文本游览器的以上操作将他们加入到程序段中,从而程序中可以使用这些函数了。这些是学习API最基本的常识问题,它远远占不到API的庞大的体系内容。今后我们把精力浪费(这绝不是浪费)在哪里呢?那就是∶

什么时候使用什么函数,什么时候使用什么结构类型,什么时候使用什么常数。

API函数声明

让我们回想一下。在VB中,如何声明函数呢?我想,如果你正在看此文,那么你绝对能够回答得出这个问题。以下便是你应该很熟悉的函数声明∶

Function SetFocus (ByVal hwnd As Long) As Long

即,这行代码定义了名为SetFocus的函数,此函数具有一个Long型数据类型的参数,并按值传递(ByVal),函数执行后将返回一个Long型数据。

API函数的声明也很类似,如,API中的SetFocus 函数是这样写的∶

Declare Function SetFocus Lib "user32" Alias "SetFocus" (ByVal hwnd As L ong) As Long

有点复杂了一些。是的,是复杂了点。但我可以告诉你,除了这些多出来的部分,其他部分还是和你以前学到的东西是一样的。函数在程序中的调用也是一样。如:

Dim dl As Long

dl&=SetFoucs(Form1.Hwnd)

它不象你自己写的程序那样能够看到里面的运行机理,也不像VB自带的函数那样,能够从VB的联机帮助中查到其用法。唯一的方法就是去学、查VB以外的资料。

Declare 语句用于在模块级别中声明对动态链接库(DLL) 中外部过程的引用。对此,你只要记住任何API函数声明都必须写这个语句就可以了。

Iib 指明包含所声明过程或函数的动态链接库或代码资源。也就是说,它说明的是,函数或过程从何而来的问题。

如在上例中,SetFocus Lib "user32"说明函数SetFocus 来自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。怎么两个名都一样呢?当然,也可以是不同的。在很多情况下,Alias说明的函数名,即别名最后一个字符经常是字符A,如SetWindowsText函数的另一个名称是Set WindowsTextA,表示为Alias "SetWindowsTextA"。这个A只不过是设计家们的习惯的命名约定,表示函数属于ANSI版本。

那么,别名究竟有什么用途呢?从理论上讲,别名提供了用另一个名子调用API的函数方法。如果你指明了别名,那么尽管我们按Declare语句后面的函数来调用该函数,但在函数的实际调用上是以别名作为首要选择的。如,以下两个函数(Function,ABCD)声明都是有效的,他们调用的是同一个SetFocus函数∶

Declare Function SetFocus Lib "user32" "SetFocus" (ByVal hwnd As Long) As Long

Declare ABCD SetFocus Lib "user32" Alias "SetFocus" (ByVal hwnd As Long) As Long

需要注意的是,选用Alias的时候,应注意别名的大小写;如果不选用Alias 时的时候,函数名必须注意大小写,而且不能改动。当然,在很多情况下,由于函数声明是直接从AP I文本游览器中拷贝过来的,所以这种错误的发生机会是很少的,但您有必要知道这一点。最后提醒你一句,API声明(包括结构、常数)必须放在窗体或模块的"通用(General Decl arations)段。

数据类型与"类型安全"

API函数中使用的数据类型基本上和VB中的一样。但作为WIN32的API函数中,不存在Integer数据类型。另外一点是在API函数中看不到Boolean数据类型。Variant 数据类型在API函数中是以Any的形式出现,如Data As Any。尽管其含义是允许任意参数类型作为一个该API函数的参数传递,但这样做存在一定的缺点。其原因是,这将会使得对目标参数的所有类型检查都会被关闭。这自然会给各种类型的参数调用带来了产生错误的机会。

为了强制执行严格的类型检查,并避免上面提到的问题,一个办法是在函数里使用上面提到到Alias技术。如对API函数GetDIBits 可进行另外一种声明方法。如下∶GetDIBits函数的原型∶

Public Declare Function GetDIBits Lib "gdi32" Alias "GetDIBits" (ByVal aHD C As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNu mScans As Long, lpBits As Any, lpBI As BITMAPINFO, ByVal wUsage As Lo ng) As Long

GetDIBits函数的改型∶

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

通过本课程前面所学到的知识,我们已经可以得知原型GetDIBits函数也好,改型GetDIBitsLong函数也好,实际将调用的都是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中,点(P oint)结构的定义方法如下:

Public Type POINTAPI

X As Long '点在X坐标(横坐标)上的坐标值

Y As Long '点在Y坐标(纵坐标)上的坐标值

End Type

又如,API中矩形(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 '点在X坐标(横坐标)上的坐标值

MyY As Long '点在Y坐标(纵坐标)上的坐标值

End Type

不过,一般来讲,是没有这种必要的。结构本身是一种数据类型,因此,使用时必须声明具体变量为该结构型,才能在程序中真正使用到该结构。结构的声明方法和其他数据的声明方法一样,如,以下语句把变MyPoint声明为POINTAPI结构类型∶

MyPoint As POINTAPI

引用结构中的成员变量也十分简单,在结构名后面加上一个".",然后紧接着写要引用的成员变量即可。这很象VB中的引用一个对象的某个属性。如,假如我们把上面已经声明的MyPoint结构中的X变量的值赋给变量Temp&

则代码如下∶

Temp&=MyPoint.X

但需要特别注意的是,你千万不要认为上例中的MyPoint是一个值。它不是值,而是地址(指针)。值和地址是完全不同的概念。结构要求按引用传递给WINDOWS函数,即所有API函数中,结构都是按ByRef传递的(在Declare语句中ByRef是默认型)。对于结构的传递,你不要试图采用ByVal,你将一无所获。由于结构名实际上就是指向这个结构的指针(这个结构的首地址),所以,你也就传送特定的结构名就可以了(参见小结,我用红色字体来突出了这种传递方式)。

由于结构传送的是指针,所以函数将直接对结构进行读写操作。这种特性很适合于把函数执行的结果装载在结构之中。

小结

以下的程序是为了总结本课中学到的内容而给出的。启动VB,新建一个项目,添加一

个命令按钮,并把下面的代码拷贝到代码段中,运行它。

Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long

Private Type POINTAPI '定义点(Point)结构

X As Long '点在X坐标(横坐标)上的坐标值

Y As Long '点在Y坐标(纵坐标)上的坐标值

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函数用来获取鼠标指针在屏幕上的位置。

以上例子中,你可以发现,以参数传递的MyPpint结构的内容在函数调用后发生了实质性变化。这是由于结构是按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 取得一个窗体的标题(caption)文字,或者一个控件的内容GetWindowTextLength 调查窗口标题文字或控件内容的长短

GetWindowWord 获得指定窗口结构的信息

InflateRect 增大或减小一个矩形的大小

IntersectRect 这个函数在lpDestRect里载入一个矩形,它是lpSrc1Rect与lpSrc2Re ct两个矩形的交集

InvalidateRect 屏蔽一个窗口客户区的全部或部分区域

IsChild 判断一个窗口是否为另一窗口的子或隶属窗口

IsIconic 判断窗口是否已最小化

IsRectEmpty 判断一个矩形是否为空

IsWindow 判断一个窗口句柄是否有效

IsWindowEnabled 判断窗口是否处于活动状态

IsWindowUnicode 判断一个窗口是否为Unicode窗口。这意味着窗口为所有基于文本的消息都接收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 将指针限制到指定区域

ConvertDefaultLocale 将一个特殊的地方标识符转换成真实的地方ID

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 换码(Escape)函数将数据直接发至显示设备驱动程序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 取得设备场景的斜率限制(Miter)设置GetNearestColor 根据设备的显示能力,取得与指定颜色最接近的一种纯色GetObjectAPI 取得对指定对象进行说明的一个结构

GetObjectType 判断由指定句柄引用的GDI对象的类型

GetPath 取得对当前路径进行定义的一系列数据

GetPixel 在指定的设备场景中取得一个像素的RGB值

GetPolyFillMode 针对指定的设备场景,获得多边形填充模式

GetROP2 针对指定的设备场景,取得当前的绘图模式

GetStockObject 取得一个固有对象(Stock)

GetSysColorBrush 为任何一种标准系统颜色取得一个刷子

GetWinMetaFileBits 通过在一个缓冲区中填充用于标准图元文件的数据,将一个增强型图元文件转换成标准windows图元文件

InvertRect 通过反转每个像素的值,从而反转一个设备场景中指定的矩形

LineDDA 枚举指定线段中的所有点

LineTo 用当前画笔画一条线,从当前位置连到一个指定的点

-----------------------------------------

孙鑫深入详解MFC学习笔记

Windows编程 一、#define的几个注意点 ①#与##的用法; #xxx将后面的参数xxx字符串化 xxx##yyy,将两个参数连接 ②\的用法 一行结束使用,表示一行未结束。 二、函数调用约定_stdcall _stdcall是Pascal方式清理C方式压栈,通常用于Win32Api中,函数采用从右到左的压栈方式,堆栈由它自己清理。在win32应用程序里,宏APIENTRY,WINAPI,都表示_stdcall,非常常见。 相对应的_cdecl,堆栈由main()函数或者其他函数清理。 C和C++程序的缺省调用方式则为__cdecl,下图为VC++6.0的默认设置,因此在不显式写明调用约定的情况下,一般都是采用__cdecl方式,而在与Windows API打交道的场景下,通常都是显式的写明使用__stdcall,才能与Windows API保持一致。 另外,还要注意的是,如printf此类支持可变参数的函数,由于不知道调用者会传递多少个参数,也不知道会压多少个参数入栈,因此函数本身内部不可能清理堆栈,只能由调用者清理了。 三、防止头文件重复包含----预编译 在写好的类的首位加上预编译代码,例如: #ifndef xxx_h #define xxx_h Class xxx { ... }; #endif 四、HDC、CDC、CClientDC、CWindowDC HDC是平台SDK提供的全局类,与设备上下文相关 CDC则是类似于封装在CWnd中的一个HDC。 CClientDC:继承于CDC,构造函数完成获取DC,析构函数完成释放DC。 CWindowDC:继承于CDC,构造函数完成获取DC,析构函数完成释放DC,在整个窗口上绘图 CMetaFileDC:图元文件设备描述环境类 创建:CMetaFileDC dc; dc.Create(); 接下来用一般dc的绘图操作,绘图的内容均会保存至图元文件中; HMETAFILE m_hMetaFile=dc.Close();//图元文件赋予数据成员显示图元文件:用一般dc的PlayMetaFile(m_hMetaFile)显示图元文件 窗口销毁时删除图元文件 SDK函数::DeleteMetaFile(m_hMetaFile) 五、OnDraw函数、OnCreate函数 OnDraw函数:窗口重绘的时候被框架类FrameWnd调用,响应WM_PAINT消息。 OnCreate函数:窗口建立的时候调用的函数,响应WM_CREATE消息。

脉冲响应函数简析

3-2 脉冲响应函数 对于线性定常系统,其传递函数)(s Φ为 )() ()(s R s C s =Φ 式中)(s R 是输入量的拉氏变换式,)(s C 是输出量的拉氏变换式。 系统输出可以写成)(s Φ与)(s R 的乘积,即 )()()(s R s s C Φ= (3-1) 下面讨论,当初始条件等于零时,系统对单位脉冲输入量的响应。因为单位脉冲函数的拉氏变换等于1,所以系统输出量的拉氏变换恰恰是它的传递函数,即 )()(s s C Φ= (3-2) 由方程(3-2)可见,输出量的拉氏反变换就是系统的脉冲响应函数,用)(t k 表示,即 1 ()[()]k t s -=Φ 脉冲响应函数)(t k ,是在初始条件等于零的情况下,线性系统对单位脉冲输入信号的响应。可见,线性定常系统的传递函数与脉冲响应函数,就系统动态特性来说,二者所包含的信息是相同的。所以,如果以脉冲函数作为系统的输入量,并测出系统的响应,就可以获得有关系统动态特性的全部信息。在具体实践中,与系统的时间常数相比,持续时间短得很多的脉动输入信号就可以看成是脉冲信号。 设脉冲输入信号的幅度为11t ,宽度为1t ,现研究一阶系统对这种脉动信号的响应。如 果输入脉动信号的持续时间t )0(1t t <<,与系统的时间常数T 相比足够小,那么系统的响应将近似于单位脉冲响应。为了确定1t 是否足够小,可以用幅度为12,持续时间(宽度)为 21t 的脉动输入信号来进行试验。如果系统对幅度为11t ,宽度为1t 的脉动输入信号的响应,与系统对幅度为12t ,宽度为21t 的脉动输入信号的响应相比,两者基本上相同,那么1t 就可以认为是足够小了。图3-3(a)表示一阶系统脉动输入信号的响应曲线;图3-3(c)表示一阶系统对脉冲输入信号的响应曲线。应当指出,如果脉动输入信号T t 1.01<(图3-3(b)所示), 则系统的响应将非常接近于系统对单位脉冲信号的响应。 这样,当系统输入为一个任意函数)(t r 时,如图3-4所示。那么输入量)(t r 可以用n 个连续脉冲函数来近似。只要把每一个脉冲函数的响应求出来,然后利用叠加原理,把每个脉冲函数的响应叠加起来,就可得到系统在任意输入函数)(t r 作用下的响应。

CRichEditCtrl

CRichEditCtrl MFC Library Reference Using CRichEditCtrl(https://www.doczj.com/doc/3118021929.html,/tie/7576199.html)rich edit控件是用户能够输入和编辑文本的窗口。文本能被指定字符和段落格式,并且也能包含嵌入式OLE对象。rich edit 控件在MFC中通过CRichEditCtrl类描绘。关于哪些你想知道更多?RichEdit控件概述 如果你在对话框中使用rich edit控件(不管你的程序是SDI,MDI,还是基本对话框),你必须在对话框显示之前调用AfxInitRichEdit一次。调用此函数的典型位置 在你的程序的InitInstance成员函数中。你不必每次显示对话框时调用它,仅仅第一次就可以了。如果你使用CRichEditView你不必调用 AfxInitRichEdit.Rich edit控件(CRichEditCtrl)为格式化文本提供程序接口。然而,一个程序必须实现任一用户接口组件,这个组件对于用户格式化操作可用是必要 的。那就是,Rich edit控件支持选定文本的字符或段落属性的改变。字符属性

的一些例子就是黑粗体,斜体,字体系列,和点大小。段落属性的例子如对齐,页边空白,和移字键 (英文原文:tab stops.表示在rich edit中按下tab键光标会移动一段距离)。然而,这是给你提供的用户接口,不管那是一个工具条按钮,菜单项,或是一个格式化字符对话框。也有函数对目 前选择查询richedit控件。使用这些函数显示当前属性设置,比如,设置一个选定标记在用户接口上,如果当前选择是黑粗体字符格式属性。参见CharacterFomatting和paragraph formatting查看更多字符段落格式化信息。rich edit控件支持几乎所有多行编辑控件( multiline edit controls)的操作和通知消息。因此,使用EDIT控件的应用程序很容易的变换为使用RICH EDIT控件。附加的消息和通知(notifications)能使程序访问richedit的其它特性。参看CEdit查看编辑控件消息。与rich edit控件有关的类 CRichEditView, CRichEditDoc, 和CRichEditCntrItem类提供在MFC的文档/视图结构环境内的RICH EDIT控件的功能。CRichEditView保持着文本和文本的格式化特性。CRichEditDoc保持着视图中OLE客户项的序列。CRichEditCntrItem提供对OLE客户项的container-side

MATLAB图像处理函数大全

Matlab图像处理函数大全 目录 图像增强 (3) 1. 直方图均衡化的Matlab 实现 (3) 1.1 imhist 函数 (3) 1.2 imcontour 函数 (3) 1.3 imadjust 函数 (3) 1.4 histeq 函数 (4) 2. 噪声及其噪声的Matlab 实现 (4) 3. 图像滤波的Matlab 实现 (4) 3.1 conv2 函数 (4) 3.2 conv 函数 (5) 3.3 filter2函数 (5) 3.4 fspecial 函数 (6) 4. 彩色增强的Matlab 实现 (6) 4.1 imfilter函数 (6) 图像的变换 (6) 1. 离散傅立叶变换的Matlab 实现 (6) 2. 离散余弦变换的Matlab 实现 (7) 2.1. dct2 函数 (7) 2.2. dict2 函数 (8) 2.3. dctmtx函数 (8) 3. 图像小波变换的Matlab 实现 (8) 3.1 一维小波变换的Matlab 实现 (8) 3.2 二维小波变换的Matlab 实现 (9) 图像处理工具箱 (11) 1. 图像和图像数据 (11) 2. 图像处理工具箱所支持的图像类型 (12) 2.1 真彩色图像 (12) 2.2 索引色图像 (13) 2.3 灰度图像 (14) 2.4 二值图像 (14) 2.5 图像序列 (14) 3. MATLAB图像类型转换 (14) 4. 图像文件的读写和查询 (15) 4.1 图形图像文件的读取 (15) 4.2 图形图像文件的写入 (16) 4.3 图形图像文件信息的查询imfinfo()函数 (16) 5. 图像文件的显示 (16) 5.1 索引图像及其显示 (16) 5.2 灰度图像及其显示 (16) 5.3 RGB 图像及其显示 (17)

《网络程序设计》复习题

1、什么叫套接字?套接字按通信性质可以分为哪两类? 2、理解线程的创建与使用方法,并能应用到程序设计中。 3、异构环境下的网络程序设计需要考虑哪些问题? 4、为什么在数据结构struct sockaddr_in中,成员变量sin_addr和sin_port需要转换为网络字节顺序,而sin_family不需要呢? 5、从网络编程的角度来简述和比较IP地址和端口的作用。 6、为什么网络编程时需要考虑字节顺序问题? 7、WinSock编程中需要哪些文件? 8、UDP程序的工作模型隐含着通信标识五元组的建立过程。这五元组在UDP的客户与服务端是由哪些函数分别确定的? 9、什么是阻塞与非阻塞通信?请解释两者的区别。 10、简述各种类型数据的发送与接收处理的方法。 11、简述基于UDP的客户机/服务器端socket编程流程。 12、什么是通信三元组和五元组?三元组和五元组每个元素在网络连接中起到什么作用? 13、为什么服务端在TCP通信过程中需要调用bind( )函数而客户端不需要?为什么客户机通常不需要绑定自己的端口号? 14、简述套接字Select模型原理,以及select模型的优势和不足。 15、简述阻塞模式服务器和客户端工作流程,以及阻塞模式套接字的优势和不足。 16、在实际应用中,很多TCP服务器程序在非正常退出时,如果立即重启服务器进程则会发生绑定服务器端口失败的错误,从而无法启动服务器进程,但等待一段时间后就可以了。为什么会发生这种情况呢?如何解决这个问题(或采取什么措施可以立即重启服务器进程)?(要求掌握setsockopt()函数的用法) 17、TCP程序的工作模型隐含着通信标识五元组的建立过程。这五元组在TCP的客户与服务端是由哪些函数分别确定的? 18、accept( )为什么要返回一个套接口?或者说,为什么要为每一个连接创建一个套接口来处理?UDP 服务器端为什么不需要多个套接口? 19、理解生产者-消费者模型,理解线程的同步与互斥方法(event和critical-section),并能应用到程序设计中。 20、采用阻塞式I/O模型时,套接字函数recv()的返回值有哪几种?分别对应什么情况? 21、closesocket()函数和shutdown()函数有何差别? 22、什么是TCP的三次握手机制?为什么要使用TCP的三次握手机制? 23、服务器端并发的两种模型及编程实现。 考试形式:闭卷 考试时间:120分钟 考试题型:选择题(2’×10=20’)、简答题(10’×6=60’)、程序设计题(20’)

MATLAB中图像函数大全 详解及例子

图像处理函数详解——strel 功能:用于膨胀腐蚀及开闭运算等操作的结构元素对象(本论坛随即对膨胀腐蚀等操作进行讲解)。 用法:SE=strel(shape,parameters) 创建由指定形状shape对应的结构元素。其中shape的种类有 arbitrary' 'pair' 'diamond' 'periodicline' 'disk' 'rectangle' 'line' 'square' 'octagon 参数parameters一般控制SE的大小。 例子: se1=strel('square',6) %创建6*6的正方形 se2=strel('line',10,45) %创建直线长度10,角度45 se3=strel('disk',15) %创建圆盘半径15 se4=strel('ball',15,5) %创建椭圆体,半径15,高度5

图像处理函数详解——roipoly 功能:用于选择图像中的多边形区域。 用法:BW=roipoly(I,c,r) BW=roipoly(I) BW=roipoly(x,y,I,xi,yi) [BW,xi,yi]=roipoly(...) [x,y,BW,xi,yi]=roipoly(...) BW=roipoly(I,c,r)表示用向量c、r指定多边形各点的X、Y坐标。BW选中的区域为1,其他部分的值为0. BW=roipoly(I)表示建立交互式的处理界面。 BW=roipoly(x,y,I,xi,yi)表示向量x和y建立非默认的坐标系,然后在指定的坐标系下选择由向量xi,yi指定的多边形区域。 例子:I=imread('eight.tif'); c=[222272300270221194]; r=[21217512112175]; BW=roipoly(I,c,r); imshow(I)

4:一个经典的多线程同步问题汇总

一个经典的多线程同步问题 程序描述: 主线程启动10个子线程并将表示子线程序号的变量地址作为参数传递给子线程。子线程接收参数 -> sleep(50) -> 全局变量++ -> sleep(0) -> 输出参数和全局变量。 要求: 1.子线程输出的线程序号不能重复。 2.全局变量的输出必须递增。 下面画了个简单的示意图: 分析下这个问题的考察点,主要考察点有二个: 1.主线程创建子线程并传入一个指向变量地址的指针作参数,由于线程启动须要花费一定的时间,所以在子线程根据这个指针访问并保存数据前,主线程应等待子线程保存完毕后才能改动该参数并启动下一个线程。这涉及到主线程与子线程之间的同步。 2.子线程之间会互斥的改动和输出全局变量。要求全局变量的输出必须递增。这涉及到各子线程间的互斥。 下面列出这个程序的基本框架,可以在此代码基础上进行修改和验证。 //经典线程同步互斥问题 #include #include #include long g_nNum; //全局资源 unsigned int__stdcall Fun(void *pPM); //线程函数 const int THREAD_NUM = 10; //子线程个数 int main() { g_nNum = 0;

HANDLE handle[THREAD_NUM]; int i = 0; while (i < THREAD_NUM) { handle[i] = (HANDLE)_beginthreadex(NULL, 0, Fun, &i, 0, NULL); i++;//等子线程接收到参数时主线程可能改变了这个i的值} //保证子线程已全部运行结束 WaitForMultipleObjects(THREAD_NUM, handle, TRUE, INFINITE); return 0; } unsigned int__stdcall Fun(void *pPM) { //由于创建线程是要一定的开销的,所以新线程并不能第一时间执行到这来int nThreadNum = *(int *)pPM; //子线程获取参数 Sleep(50);//some work should to do g_nNum++; //处理全局资源 Sleep(0);//some work should to do printf("线程编号为%d 全局资源值为%d\n", nThreadNum, g_nNum); return 0; } 运行结果:

数字图像处理-作业题及部分答案解析演示教学

1.数字图像与连续图像相比具有哪些优点?连续图像f(x,y与数字图像I(c,r中各量的含义 是什么?它们有何联系和区别? (To be compared with an analog image, what are the advantages of a digital image? Let f(x,y be an analog image, I(r, c be a digital image, please give explanation and comparison for defined variables: f/I, x/r, and y/c 2.图像处理可分为哪三个阶段? 它们是如何划分的?各有什么特点? (We can divide "image processing" into 3 stages, what are they? how they are divided? What are their features? 答:低级处理---低层操作,强调图像之间的变换,是一个从图像到图像的过程; 中级处理---中层操作,主要对图像中感兴趣的目标进行检测和测量,从而建立对图像的描述,是一个从图像到数值或符号的过程; 高级处理---高层操作,研究图像中各目标的性质和相互联系,得出对图像内容含义的理解以及对原来客观场景的解释; 3.试从结构和功能等角度分析人类视觉中最基本的几个要素是什么?什么是马赫带效应? 什 么是同时对比度?它们反映了什么共同问题? (According to the structure and function of the eyes, what are the basic elements in human vision? What is the Mach Band Effect? What is Simultaneous Contrast? What common facts can we infer from both Mach Band Effect and Simultaneous Contrast? 答:人的视觉系统趋向于过高或过低估计不同亮度区域边界的现象称为“马赫带”效应;同时对比度指的是人的视觉系统对某个区域感觉到的亮度除了依赖于它本身的强度,还与背景有关.

CSerialPort类解析

CserialPort类的功能及成员函数介绍 CserialPort类是免费提供的串口类,Codeguru是一个非常不错的源代码网站CserialPort类支持线连接(非MODEM)的串口编程操作。 CserialPort类是基于多线程的,其工作流程如下:首先设置好串口参数,再开启串口检测工作线程,串口检测工作线程检测到串口接收到的数据、流控制事件或其他串口事件后,就以消息方式通知主程序,激发消息处理函数来进行数据处理,这是对接受数据而言的,发送数据可直接向串口发送。 介绍几个经常用到的函数: 1、串口初始化函数InitPort 这个函数是用来初始化串口的,即设置串口的通信参数:需要打开的串口号、波特率、奇偶校验方式、数据位、停止位,这里还可以用来进行事件的设定。如果串口初始化成功,就返回TRUE,若串口被其他设备占用、不存在或存在其他股占,就返回FALSE,编程者可以在这儿提示串口操作是否成功如果在当前主串口调用这个函数,那么pPortOwner可用this指针表示,串口号在函数中做了限制,只能用1,2,3和4四个串口号,而事实上在编程时可能用到更多串口号,可以通过通过注释掉本函数中“assert(portur>0&&portnr<5)”语句取消对串口号的限制。 if (m_ComPort[0].InitPort(this,1,9600,'N',8,1,EV_RXFLAG | EV_RXCHAR,512)) //portnr=1(2),baud=9600,parity='N',databits=8,stopsbits=1,

//dwCommEvents=EV_RXCHAR|EV_RXFLAG,nBufferSize=512 { m_ComPort[0].StartMonitoring(); //启动串口监视线程 SetTimer(1,1000,NULL); //设置定时器,1秒后发送数据} e lse { CString str; str.Format("COM1 没有发现,或被其它设备占用"); AfxMessageBox(str); } 2、启动串口通信监测线程函数StartMonitoring() 串口初始化成功后,就可以调用BOOL StartMonitoring()来启动串口检测线程,线程启动成功,返回TRUE。 BOOL CSerialPort::StartMonitoring() { if (!(m_Thread = AfxBeginThread(CommThread, this))) return FALSE; TRACE("Thread started\n"); return TRUE; } 注意这个函数一旦调用,就会建立一个线程,这个线程一直不会结束,调用StopMonitoring ()只是将这个线程挂起。 3、暂停或停止监测线程函数StopMonitoring() 该函数暂停或停止串口检测,要注意的是,调用该函数后,串口资源仍然被占用 // // Suspend the comm thread // BOOL CSerialPort::StopMonitoring() { TRACE("Thread suspended\n"); m_Thread->SuspendThread(); return TRUE; } 4、关闭串口函数ClosePort() 该函数功能是关闭串口,释放串口资源,调用该函数后,如果要继续使用串口,还需要调用InitPort()函数。 这里有一个问题,在以前的版本中,如果调用了StartMonitoring函数,关闭串口后,再打开就会出现问题,及网上所说的关闭死锁问题。找了大量资料后,

一些图像处理函数用法(精华)

一些图像处理函数用法(精华) imshow imshow是用来显示图片的,如 I = imread('moon.tif'); figure,imshow(I); 而有时为了数据处理,要把读取的图片信息转化为更高的精度, I = double(imread('moon.tif')); 为了保证精度,经过了运算的图像矩阵I其数据类型会从unit8型变成double型。如果直接运行imshow(I),我们会发现显示的是一个白色的图像。这是因为imshow()显示图像时对double型是认为在0~1范围内,即大于1时都是显示为白色,而imshow显示uint8型时是0~255范围。而经过运算的范围在0-255之间的double型数据就被不正常得显示为白色图像了。 有两个解决方法: 1、imshow(I/256); -----------将图像矩阵转化到0-1之间 2、imshow(I,[]); -----------自动调整数据的范围以便于显示 从实验结果看两种方法都解决了问题,但是从显示的图像看,第二种方法显示的图像明暗黑白对比的强烈些!图像为y,为何用imshow(uint8(y))和imshow(y,[])时的图像显示结果不同? 回答: imshow(uint8(y))是按照256级灰度显示y得绝对数据。0表示黑色,255表示白色,y中大于255的值强制为255。 imshow(y,[]),将y中的最小值看作0(black),最大值看作255(white) -->增加图像的对比度。 所以两者不同。 padarray 功能:填充图像或填充数组。 用法:B = padarray(A,padsize,padval,direction) A为输入图像,B为填充后的图像, padsize给出了给出了填充的行数和列数,通常用[r c]来表示, padval和direction分别表示填充方法和方向。 它们的具体值和描述如下: padval:'symmetric' 表示图像大小通过围绕边界进行镜像反射来扩展; 'replicate' 表示图像大小通过复制外边界中的值来扩展; 'circular' 图像大小通过将图像看成是一个二维周期函数的一个周期来进行扩展。 direction:'pre' 表示在每一维的第一个元素前填充; 'post' 表示在每一维的最后一个元素后填充;

C多线程编程实例实战

C#多线程编程实例实战 问题的提出 所谓单个写入程序/ 多个阅读程序的线程同步问题,是指任意数量的线程访问共享资源时,写入程序(线程)需要修改共享资源,而阅读程序(线程)需要读取数据。在这个同步问题中,很容易得到下面二个要求: 1 )当一个线程正在写入数据时,其他线程不能写,也不能读。 2 )当一个线程正在读入数据时,其他线程不能写,但能够读。在数据库应 用程序环境中经常遇到这样的问题。比如说,有n 个最终 用户,他们都要同时访问同一个数据库。其中有m个用户要将数据存入数据库,n-m 个用户要读取数据库中的记录。 很显然,在这个环境中,我们不能让两个或两个以上的用户同时更新同一条记录,如果两个或两个以上的用户都试图同时修改同一记录,那么该记录中的信息就会被破坏。 我们也不让一个用户更新数据库记录的同时,让另一用户读取记录的内容。因为读取的记录很有可能同时包含了更新和没有更新的信息,也就是说这条记录是无效的记录。 实现分析 规定任一线程要对资源进行写或读操作前必须申请锁。根据操作的不同,分为阅读锁和写入锁,操作完成之后应释放相应的锁。将单个写入程序/ 多个阅读程序的要求改变一下,可以得到如下的形式: 一个线程申请阅读锁的成功条件是:当前没有活动的写入线程。 一个线程申请写入锁的成功条件是:当前没有任何活动(对锁而言)

的线程 因此,为了标志是否有活动的线程,以及是写入还是阅读线程,引入一个变量m_nActive ,如果m_nActive > 0 ,则表示当前活动阅读线程的数目,如果 m_nActive=0 ,则表示没有任何活动线程,m_nActive <0 ,表示当前有写入线程在活动,注意m_nActive<0 ,时只能取-1 的值,因为只允许有一个写入线程活动。 为了判断当前活动线程拥有的锁的类型,我们采用了线程局部存储技术(请参阅其它参考书籍) ,将线程与特殊标志位关联起来。 申请阅读锁的函数原型为:public void AcquireReaderLock( int millisecondsTimeout ) ,其中的参数为线程等待调度的时间。函数定义如下:public void AcquireReaderLock( int millisecondsTimeout ) { // m_mutext 很快可以得到,以便进入临界区m_mutex.WaitOne( ); // 是否有写入线程存在 bool bExistingWriter = ( m_nActive < 0 ); if( bExistingWriter ) { // 等待阅读线程数目加1, 当有锁释放时,根据此数目来调度线程 m_nWaitingReaders++; } else { // 当前活动线程加1 m_nActive++; } m_mutex.ReleaseMutex();

《数字图像处理》冈萨雷斯,Matlab函数汇总

图像显示 colorbar 显示彩条 getimage 由坐标轴得到图像数据 ice(DIPUM)交互彩色编辑 image 创建和显示图像对象 imagesc 缩放数据并显示为图像 immovie 由多帧图像制作电影 imshow 显示图像 imview 在Image Viewer中显示图像montage 将多个图像帧显示为矩阵蒙太奇movie 播放录制的电影帧 rgbcube 显示一个彩色RGB立方体subimage 在单个图形中显示多幅图像truesize 调整图像的显示尺寸 warp 将图像显示为纹理映射的表面 图像文件输入/输出 Dicominfo 从一条DICOM消息中读取元数据Dicomread 读一幅DICOM图像 Dicomwrite 写一幅DICOM图像 Dicom-dict.txt 包含DICOM数据字典的文本文件Dicomuid 产生DICOM唯一的识别器 Imfinfo 返回关于图像的文件的信息

Imread 读图像文件 Imwrite 写图像文件 图像算术 Imabsdiff 计算两幅图像的绝对差 Imadd 两幅图像相加或把常数加到图像上Imcomplement 图像求补 Imdivide 两幅图像相除,或用常数除图像Imlincomb 计算图像的线性组合 Immultiply 两幅图像相乘或用常数乘图像Imsubtract 两幅图像相减,或从图像中减去常数几何变换 Checkerboard 创建棋盘格图像 Findbounds 求几何变换的输出范围 Fliptform 颠倒TFORM结构的输入/输出Imcrop 修剪图像 Imresize 调整图像大小 Imrotate 旋转图像 Imtransform 对图像应用几何变换 Intline 整数坐标线绘制算法Makersampler 创建重取样器结构 Maketform 创建几何变换结构(TFORM)Pixeldup(DIPUM)在两个方向上复制图像的像素

高级语言C++程序设计高级编程-期末考试 - 答案

高级语言C++程序设计-高级编程-考试试卷—答案 姓名: ________________ 成绩__________________ 第一题选择( 1. 设x和y均为bool量,则x&&y为真的条件是( A ) A)它们均为真B)其中一个为真C)它们均为假D)其中一个为假 2. 假定a为一个整型数组名,则元素a[4]的字节地址为( C ) A)a+4 B)a+8 C)a+16 D)a+32 3. 下面的哪个保留字不能作为函数的返回类型( C ) A)void B)int C)new D)long 4. 在编译指令中,宏定义使用哪个指令( B ) A)#include B)#define C)#if D)#else 5. 设存在函数int max(int,int)返回两参数中较大值,若求22,59,70三者中最大值,下列表达式不正确的是:(C ) A)int m = max(22,max(59,70));B)int m = max(max(22,59),70); C)int m = max(22,59,70);D)int m = max(59,max(22,70)); 6. 对于int *pa[5];的描述中,正确的是:( D ) A)pa是一个指向数组的指针,所指向的数组是5个int型元素 B)pa是一个指向某数组中第5个元素的指针,该元素是int型变量 C)pa[5]表示数组的第5个元素的值,是int型的值 D)pa是一个具有5个元素的指针数组,每个元素是一个int型指针 7. 对C++语言和C语言的兼容性,描述正确的是:( A ) A)C++兼容C B)C++部分兼容C C)C++不兼容C D)C兼容C++ 8. 下列的各类函数中,不是类的成员函数。( C ) A)构造函数B)析构函数C)友元函数D)拷贝初始化构造函数 9. 在类定义的外部,可以被访问的成员有( C ) A)public和protected类成员B)private的类成员 C) 仅public的类成员D)public和private的类成员 10. 关于类和对象不正确的说法是:( C ) A)类是一种类型,它封装了数据和操作B)对象是类的实例 C)一个类的对象只有一个D)一个对象必属于某个类 11. 在C++中用( D )能够实现将参数值带回。 A)数组和指针B)指针和引用C)仅指针D)数组, 指针和引用 12. 在公有继承的情况下,基类的成员(私有的除外)在派生类中的访问权限( B ) A)受限制B)保持不变C)受保护D)不受保护 13. 关于构造函数的说法,不正确的是:( A ) A)没有定义构造函数时,系统将不会调用它B)其名与类名完全相同 C)它在对象被创建时由系统自动调用D)没有返回值 14. 系统在调用重载函数时,不能作为确定哪个重载函数被调用的依据是:( D )

Matlab6.0图形图像处理函数详细列表

附录MATLAB图像处理命令 1.applylut 功能: 在二进制图像中利用lookup表进行边沿操作。 语法: A = applylut(BW,lut) 举例 lut = makelut('sum(x(:)) == 4',2); BW1 = imread('text.tif'); BW2 = applylut(BW1,lut); imshow(BW1) figure, imshow(BW2) 相关命令: makelut 2.bestblk 功能: 确定进行块操作的块大小。 语法: siz = bestblk([m n],k) [mb,nb] = bestblk([m n],k) 举例 siz = bestblk([640 800],72) siz = 6450

MATLAB 高级应用——图形及影像处理 330 相关命令: blkproc 3.blkproc 功能: 实现图像的显式块操作。 语法: B = blkproc(A,[m n],fun) B = blkproc(A,[m n],fun,P1,P2,...) B = blkproc(A,[m n],[mborder nborder],fun,...) B = blkproc(A,'indexed',...) 举例 I = imread('alumgrns.tif'); I2 = blkproc(I,[8 8],'std2(x)*ones(size(x))'); imshow(I) figure, imshow(I2,[]); 相关命令: colfilt, nlfilter,inline 4.brighten 功能: 增加或降低颜色映像表的亮度。 语法: brighten(beta) newmap = brighten(beta) newmap = brighten(map,beta) brighten(fig,beta) 相关命令:

Nt内核函数大全

Nt内核函数大全 NtLoadDriver 服务控制管理器加载设备驱动 NtUnloadDriver 服务控制管理器支持卸载指定的驱动程序NtRegisterNewDevice 加载新驱动文件 NtQueryIntervalProfile 返回数据 NtSetIntervalProfile 指定采样间隔 NtStartProfile 开始取样 NtStopProfile 停止采样 NtSystemDebugControl 实施了一系列的调试器支持的命令NtRegisterThreadTerminatePort 一个调试登记通知线程终止NtCreateDebugObject 创建一个调试对象 NtDebugActiveProcess 使调试器附加到一个积极的过程和调试它NtDebugContinue 允许一个进程,以线程产生了调试事件NtQueryDebugFilterState 查询调试过滤国家一级的具体组成部分NtRemoveProcessDebug 停止调试指定的进程 NtSetDebugFilterState 设置调试输出滤波器一级指定的组成部分NtSetInformationDebugObject 设置属性的调试对象NtWaitForDebugEvent 等待调试事件的进程正在调试NtFlushInstructionCache 清空指定进程的指令缓冲区NtInitiatePowerAction 启动电源事件 NtPowerInformation 获得该系统的电源状态NtSetThreadExecutionState 设置一个线程的系统电源状态的要求NtRequestWakeupLatency 设置一个进程唤醒延迟 NtClose 关闭处理任何对象类型 NtDuplicateObject 复制句柄的对象 NtCreateDirectoryObject 创建一个目录中的对象管理器命名空间NtCreateSymbolicLinkObject 创建一个符号链接的对象管理器命名空间NtOpenDirectoryObject 打开对象管理器名字空间目录NtQueryDirectoryObject 用列举的对象位于一个目录对象NtOpenSymbolicLinkObject 打开一个符号链接对象NtQuerySymbolicLinkObject 归来的名称,对象,符号链接点 NtQueryObject 查询对象的属性,如它的名字 NtSetInformationObject 树立了一个对象的属性 NtTranslateFilePath 转换的文件路径的格式 NtCreateKey 创建或打开一个注册表项 NtOpenKey 打开一个现有的注册表项 NtDeleteKey 删除注册表项 NtDeleteValueKey 删除价值 NtEnumerateKey 枚举子项中的一个关键 NtEnumerateValueKey 列举了价值的一个关键 NtFlushKey 刷新变化回到注册表在磁盘上 NtInitializeRegistry 获取注册滚动.单参数对这一规定是否安装启动或正常开机NtNotifyChangeKey 允许一个程序的通知改变某一关键或其子项NtQueryKey 查询信息的一个关键

多线程编程中应该注意的问题

多线程编程中应该注意的问题 1. 线程的优先级 多线程编程中要注意协调好各个线程的优先级。一般来说,控制线程的优先级要高于Worker 线程。这样做,可以保证Client (最终用户或者其他模块)尽快得到响应。当控制线程是与最终用户交互的界面线程时更应如此,如果界面线程优先级较低,界面可能较长时间没有反应,用户很可能会怀疑命令是不是还没有开始执行。下面两张图给出了控制线程优先级不同对Client 造成不同响应时间的对比。 控制线程低优先级,Worker 线程高优先级 Fig 1.1 控制线程优先级低,对用户响应时间较长 控制线程高优先级,Worker 线程低优先级 Fig 1.2 控制线程优先级高,对用户响应时间较短

2.防止栈溢出 这个问题不只存在在多线程编程中。防止栈溢出可以参考下面几条建议: 1)不在函数体内定义特别大的栈变量,必须要定义的时候,可以使用new在堆上分配。 2)传递参数时,大的参数(如结构体,类)使用按指针传递,小的参数(如基本数据 类型)使用按值传递。 堆栈 Fig 2.1 大对象作为参数时,按值传递的过程 堆栈 Fig 2.2 大对象作为参数时,按指针传递的过程。 由Fig 2.1和Fig 2.2可以看出,对于较大的对象,按指针的传递的资源消耗较小, 空间上,仅需把一个指针压栈;时间上,省去了拷贝构造函数的调用。所以在传递 大的对象时,应该使用按指针传递。

堆栈 Fig 2.3 参数为基本类型时,按值传递的过程 1.取地址 堆栈 3.将创建的拷贝压入堆栈。 2.创建指针的一个拷贝 Fig 2.4 参数为基本类型时,按指针传递的过程。 对比Fig 2.3和Fig 2.4可以看出,对于基本数据类型,按指针传递的方法反而会消耗较多的时间,而且当参数所占的字节数小于一个指针所占的字节数(4个字节)时,按指针传递也会消耗较多的空间。所以当参数为基本数据类型时,应该使用按值传递。

matlab对图像操作函数详解

matlab对图像操作函数的详解 一. 读写图像文件 1. imread imread函数用于读入各种图像文件,如:a=imread('e:\w01.tif') 注:计算机E盘上要有w01相应的.tif文件。 2. imwrite imwrite函数用于写入图像文件,如:imwrite(a,'e:\w02.tif',’tif’) 3. imfinfo imfinfo函数用于读取图像文件的有关信息,如:imfinfo('e:\w01.tif') 二. 图像的显示 1. image image函数是MATLAB提供的最原始的图像显示函数(主要彩色显示图象),如: a=[1,2,3,4;4,5,6,7;8,9,10,11,12]; image(a); 2. imshow imshow函数用于灰度图像文件的显示,如: i=imread('e:\w01.tif'); imshow(i); 3. colorbar colorbar函数用显示图像的颜色条。 通常,颜色映象进行过调节,把数据从最小扩展到最大,也就是说整个颜色映象都用于绘图。有时也许想改变颜色使用的方法。函数caxis代表颜色轴,因为颜色增加了另一个维数,它允许对数据范围的一个子集使用整个颜色映象或者对数据的整个集合只使用当前颜色映象的一部分。 [cmin,cmax]=caxis返回映射到颜色映象中第一和最后输入项的最小和最大的数据。它们通常被设成数据的最小值和最大值。比如,函数mesh(peaks) 会画出函数peaks的网格图,并把颜色轴caxis设为[-6.5466,8.0752],即Z的最小值和最大值。这些值之间的数据点,使用从颜色映象中经插值得到的颜色。如: i=imread('e:\w01.tif'); imshow(i); colorbar; 4 .figure figure函数用于设定图像显示窗口,如:figure(1);/figure(2); 5.imagesc(a); caxis([-3 8]) ; colorbar; 标尺标度从-3,到8 显示标度尺。 三. 图像的变换 1. fft2 fft2函数用于数字图像的二维傅立叶变换,如: i=imread('e:\w01.tif'); j=fft2(i); 2. ifft2 ifft2函数用于数字图像的二维傅立叶反变换,如: i=imread('e:\w01.tif');

你可能不知道的陷阱:C#委托和事件的困惑

你可能不知道的陷阱:C#委托和事件的困惑 . 问题引入 通常,一个C 语言学习者登堂入室的标志就是学会使用了指针,而成为高手的标志又是“玩转指针”。指针是如此奇妙,通过一个地址,可以指向一个数,结构体,对象,甚至函数。最后的一种函数,我们称之为“函数指针”(和“指针函数”可不一样!)就像如下的代码: 1 2 3 int func(int x); /* 声明一个函数 */ int (*f) (int x); /* 声明一个函数指针 */ f=func; /* 将func 函数的首地址赋给指针f */ C 语言因为函数指针获得了极强的动态性,因为你可以通过给函数指针赋值并动态改变其行为,我曾在单片机上写的一个小系统中,任务调度机制玩的就是函数指针。 在.NET 时代,函数指针有了更安全更优雅的包装,就是委托。而事件,则是为了限制委托灵活性引入的新“委托”(之所以为什么限制,后面会谈到)。同样,熟练掌握委托和事件,也是C#登堂入室的标志。有了事件,大大简化了编程,类库变得前所未有的开放,消息传递变得更加简单,任何熟悉事件的人一定都深有体会。 但你也知道,指针强大,高性能,带来的就是危险,你不知道这个指针是否安全,出了问题,非常难于调试。事件和委托这么好,可是当你写了很多代码,完成大型系统时,心里是不是总觉得怪怪的?有当年使用指针时类似的感觉? 如果是的话,请看如下的问题: 1. 若多次添加同一个事件处理函数时,触发时处理函数是否也会多次触发? 2. 若添加了一个事件处理函数,却执行了两次或多次”取消事件“,是否会报错? 3. 如何认定两个事件处理函数是一样的? 如果是匿名函数呢? 4. 如果不手动删除事件函数,系统会帮我们回收吗? 5. 在多线程环境下,挂接事件时和对象创建所在的线程不同,那事件处理函数中的代码将在哪个线程中执行? 6. 当代码的层次复杂时,开放委托和事件是不是会带来更大的麻烦? 列下这些问题,下面就让我们讨论这些”尖酸刻薄“的问题。 二. 事件订阅和取消问题 我们考虑一个典型的例子:加热器,加热器内部加热,在达到温度后通知外界”加热已经完成“。 尝试写下如下测试类:

相关主题
文本预览
相关文档 最新文档