许多国外的VC++书籍中都曾经这样说过,“真正的程序员一定会用VC++”,但是用VC++的程序员不一定是真正的程序员!在当今的商业社会中,程序开 发的速度和效率永远是竞争胜利的一个要点,许多用VC++的人都说用API开发速度太慢而不去了解和深入。就本人看来用API还是用MFC这两者在开发速 度上并不会有太大差异, 只是因为MFC将APIs许多难以理解的意义给封装和隐蔽了起来,使开发者们不需 要太多思考的去利用现成的框架来完成工作,这也是 MFC被大多数所人青睐的原因 ,结果如何呢?这些MFC高手都是WIZARD通,只会在 ClassWizard上click、click、click…..那好吧,为了不成为一个click高手, 让我们看看用APIs是如何编程的吧!
第一章、 Windows APIs分类
Windows是一个很复杂的操作系统(因为它包含了多个子系统,这些子系统包括同步、管道、动态数据交换-DDE、对象连接与嵌入-OLE和安全系统等 等),无论从什么角度去考虑,都会使一些简单的任务实现起来显得复杂多样。Windows APIs( 这 些APIs大多封装KERNEL.DLL、GDI.DLL、USER.DLL )也并不是杂乱无章的,大体上可以分为两大类:
一、 通用APIs:是指在编写Windows应用程序时经常用到的APIs函数,这些函数构成了Windows应用程序的基础。
二、 专用APIs:为了完成特殊任务,而用到的APIs函数。
注:在本文中并不具体讲解API函数的具体说明,这在微软的MSDN中可以查到。
第二章、 通用APIs分类
将APIs分类是很有好处的,可以让我们很清楚的明白哪个任务需要调用什么样的APIs,或者说什么样的APIs可以完成哪些任务,这会使我们的整个开发 过程流畅而有效率!从另外的角度来看,将APIs分类更有助于开发人员去理解MFC和Windows的体系结构!
在通用APIs中,又可以分成许多不同的小分类如下:
一、 加速键APIs:如果你想在应用程序中支持单热键(加速键),并允许通过键盘来选择菜单的选项(在通常情况下加速键用于菜单选择),就会用到下面的 APIs:
LoadAccelerators
TranslateAccelerator
CreateAcceleratorTable
DestroyAcceleratorTable
CopyAcceleratorTable
二、 位图APIs:位图是常见的Windows资源,也是视频图像的内存表示。位图是不能直接在窗口中显示的,我们必须通过内存设备环境、目标设备环境来将其 显示。
AlphaBlend BitBltCreateBitmap CreateBitmapIndirect
CreateCompatibleBitmap CreateDIBSection ExtFloodFill
GetBitmapDimensionEx GetDIBColorTable GetDIBits
GetPixel GetStretchBltMode GradientFill MaskBlt
PlgBlt SetBitmapDimensionEx SetDIBColorTable SetDIBits
SetDIBitsToDevice SetPixel SetPixelV SetStretchBltMode
StretchBlt StretchDIBits TransparentBlt
三、 脱字符APIs:不要把脱字符当成鼠标光标,脱字符仅仅用来指明在用键盘输入的情况下下一次击键在何处响应。在Windows中只允许有一个脱字 符,也就是操作系统和应用程序公用一个脱字符,它是整个系统共享的资源,对脱字符的改变将会影响到所有的程序。一般而言,当应用程序具有焦点时,就可以建 立脱字符,而一旦失去焦点
应当立即撤销脱字符!
CreateCaret DestroyCaret GetCaretBlinkTime
GetCaretPos HideCaret SetCaretBlinkTime
SetCaretPos ShowCaret
四、 控制台APIs:如果你还留恋字符模式的程序,这些字符模式函数给你带来方便和新的特点。 用这些APIs可以开发出如下风格的控制台程序:
1、 支持windows风格的鼠标事件相应
2、 利用管道及I/O重定向程序
3、 在自己的控制台会话期间运行程序
AllocConsole CreateConsoleScreenBuffer
FillConsoleOutputAttribute FillConsoleOutputCharacter
FlushConsoleInputBuffer FreeConsole GenerateConsoleCtrlEvent
GetConsoleCP GetConsoleCursorInfo GetConsoleMode
GetConsoleOutputCP GetConsoleScreenBufferInfo GetConsoleTitle
GetLargestConsoleWindowSize GetLargestConsoleWindowSize
GetNumberOfConsoleInputEvents GetNumberOfConsoleMouseButtons
GetStdHandle HandlerRoutine PeekConsoleInput ReadConsole
ReadConsoleInput ReadConsoleOutput ReadConsoleOutputAttribute
ScrollConsoleScreenBuffer SetConsoleActiveScreenBuffer
SetConsoleCP SetConsoleCtrlHandler SetConsoleCursorInfo
SetConsoleCursorPosition SetConsoleMode SetConsoleOutputCP
SetConsoleScreenBufferSize SetConsoleTextAttribute
SetConsoleTitle SetConsoleWindowInfo SetStdHandle
WriteConsole WriteConsoleInput WriteConsoleOutput
WriteConsoleOutputAttribute WriteConsoleOutputCharacter
五、 剪贴板APIs:剪贴板是一个共享的资源,任何应用程序都可使用的地方,是应用程序之间或应用程序内部之间传递数据的简便方法。对于剪贴板的使用有三种方 式:读、写、自己成为剪贴板视口。
ChangeClipboardChain CloseClipboard CountClipboardFormats
EmptyClipboard EnumClipboardFormats GetClipboardData
GetClipboardFormatName GetClipboardOwner
GetClipboardSequenceNumber GetClipboardViewer
GetOpenClipboardWindow GetPriorityClipboardFormat
IsClipboardFormatAvailable OpenClipboard
RegisterClipboardFormat SetClipboardData SetClipboardViewer
六、 裁剪区域APIs:裁剪区域实际上是Windows的子窗口,防止程序输出到某一区域范围之外。
ExcludeClipRect ExtSelectClipRgn GetClipBox
GetClipRgn GetMetaRgn
IntersectClipRect OffsetClipRgn
PtVisible RectVisible SelectClipPath
SelectClipRgn SetMetaRgn
七、 控件APIs:对常用控件操作所需要的APIs。
CheckDlgButton CheckRadioButton IsDlgButtonChecked
DlgDirList DlgDirSelectEx DlgDirListComboBox
DlgDirSelectEx DlgDirSelectComboBoxEx
八、 线及曲线的输出APIs:针对绘图操作画线的APIs。
AngleArc Arc ArcTo GetArcDirection LineDDA LineDDAProc
LineTo MoveToEx PolyBezier PolyBezierTo PolyDraw Polyline
PolylineTo PolyPolyline SetArcDirection
九、 设备环境APIs:设备环境是Windows操作系统的一个很重要的概念,几乎大部分的编程中都会用到这个概念。设备环境实际上是设备驱动程序对其所控制 的设备的逻辑入口。设备环境定义了当前的输出环境。例如当向窗口输出信息时,必须要先申请设备环境。
CancelDC ChangeDisplaySettings ChangeDisplaySettingsEx
CreateCompatibleDC CreateDC CreateIC
DeleteDC DeleteObject DeviceCapabilities DrawEscape
EnumDisplayDevices EnumDisplaySettings
EnumObjects EnumObjectsProc GetCurrentObject
GetDC GetDCBrushColor GetDCEx GetDCOrgEx
GetDCPenColor GetDeviceCaps GetObject GetObjectType
GetStockObject ReleaseDC ResetDC RestoreDC SaveDC
SelectObject SetDCBrushColor SetDCPenColor
十、 对话框APIs:对话框是Windows最常用的输入文本以及数值信息的途径和方法。对话框有用户自定义的,也有Windows本身所带有的(我 们成为通用对话框)。从状态上可以分为模式(会禁止其它的窗体)和非模式(不禁止其它窗体)两种。需要注意的是在程序中我们必须有一个不可缺少的头文件commdlg.h。
ChooseColor ChooseFont CommDlgExtendedError FindText
GetFileTitle GetOpenFileName GetSaveFileName
PageSetupDlg PrintDlg PrintDlgEx ReplaceText
CreateDialog CreateDialogIndirect CreateDialogIndirectParam
CreateDialogParam DefDlgProc DialogBox DialogBoxIndirect
DialogBoxIndirectParam DialogBoxParam DialogProc EndDialog
GetDialogBaseUnits GetDlgCtrlID GetDlgItem GetDlgItemText
GetNextDlgGroupItem GetNextDlgTabItem IsDialogMessage
IsDialogMessage MapDialogRect MessageBox MessageBoxEx
SendDlgItemMessage SetDlgItemInt MessageBoxIndirect
十一、 绘图工具APIs:如果你是个画家,你一定很熟悉画笔和画刷吧!如果让你在Windows中去绘图或画画,你一定会为Windows的画笔和画 刷的多样性和灵活而感到惊讶!我们知道画笔的主要功能就是画线,而画刷就是着色亦即填充区域。不过在你准备绘图之前,一定记得向Windows申请设备环 境呀!
CreateBrushIndirect CreateDIBPatternBrushPt CreateHatchBrush
CreatePatternBrush CreateSolidBrush GetBrushOrgEx
GetSysColorBrush PatBlt SetBrushOrgEx CreatePen
CreatePenIndirect ExtCreatePen SelectObject DeleteObject
十二、 文件I/O APIs:Windows 32位的操作系统一定会提供一套完整的比标准的C/C++功能更强大的文件I/O函数。 原因有两个,第一、Windows 32位的操作系统是一个多流操作系统,第二、Windows 32位的操作系统具有安全环境。在WIN2000/NT/WIN32系统下的文件都采用安全属性描述符。
AreFileApisANSI CancelIo CopyFile CopyFileEx
CopyProgressRoutine CreateDirectory CreateDirectoryEx
CreateFile CreateIoCompletionPort DefineDosDevice
DeleteFile FileIOCompletionRoutine FindClose
FindCloseChangeNotification FindFirstChangeNotification
FindFirstFile FindFirstFileEx FlushFileBuffers
GetBinaryType GetCurrentDirectory GetDiskFreeSpace
GetDiskFreeSpaceEx GetDriveType GetFileAttributes
GetFileAttributesEx GetFileInformationByHandle GetFileSize
GetFileType GetFullPathName GetLogicalDrives
GetLogicalDriveStrings GetLongPathName
GetQueuedCompletionStatus GetShortPathName GetTempFileName
GetTempPath LockFile LockFileEx MoveFile
MoveFileEx PostQueuedCompletionStatus QueryDosDevice
ReadDirectoryChangesW ReadFile ReadFileEx ReadFileScatter
ReadFileVlm RemoveDirectory SearchPath SetCurrentDirectory
SetEndOfFile SetFileApisToANSI SetFileApisToOEM
SetFileAttributes SetFilePointer SetVolumeLabel UnlockFile
UnlockFileEx WriteFile WriteFileEx WriteFileGather
WriteFileVlm
十三、 字体APIs:对于字体大家并不陌生,在Windows中字体是一种资源,可被设备环境所选用。
AddFontResource CreateFont CreateFontIndirect
CreateScalableFontResource DrawText DrawTextEx
EnumFontFamiliesEx EnumFontFamExProc ExtTextOut
GetAspectRatioFilterEx GetCharABCWidths
GetCharABCWidthsFloat GetCharacterPlacement GetCharWidth32
GetCharWidthFloat GetFontData GetFontLanguageInfo
GetFontUnicodeRanges GetGlyphIndices GetGlyphOutline
GetKerningPairs GetGlyphOutline GetKerningPairs
GetOutlineTextMetrics GetRasterizerCaps GetTabbedTextExtent
GetTextAlign GetTextCharacterExtra GetTextColor
GetTextExtentExPoint GetTextExtentPoint32 GetTextFace
GetTextMetrics PolyTextOut RemoveFontResource
SetMapperFlags SetTextAlign SetTextCharacterExtra
SetTextColor SetTextJustification TabbedTextOut
TextOut
十四、 GDI对象APIs:GDI对象有字体、画笔、画刷、位图、调色板和区域句柄。这些APIs可以生成、获得、选择、及删除这些对象。
SelectObject DeleteObject GetObject
GetObjectType GetObjTypeInfo
GetStockObject
十五、 图标APIs:图标是Windows的一种资源,也是一个GDI对象。
ArrangeIconicWindows CopyIcon CreateIcon
CreateIconFromResource CreateIconFromResourceEx
CreateIconIndirect DestroyIcon DrawIconEx
ExtractAssociatedIcon ExtractIcon ExtractIconEx
ExtractAssociatedIcon ExtractIcon ExtractIconEx
GetIconInfo LookupIconIdFromDirectory
LookupIconIdFromDirectoryEx
十六、 键盘APIs:相信键盘是大家再熟悉不过的了,Windows利用虚拟键来映射键盘码。 这些函数可以用来检查键盘的状态或者获得虚拟键信息。
ActivateKeyboardLayout EnableWindow GetActiveWindow
GetAsyncKeyState GetFocus GetKeyboardLayout
GetKeyboardLayoutList
GetKeyboardLayoutName GetKeyboardState
GetKeyNameText GetKeyState
IsWindowEnabled keybd_event LoadKeyboardLayout
MapVirtualKey
MapVirtualKeyEx OemKeyScan RegisterHotKey
SendInput SetActiveWindow
SetFocus SetKeyboardState
ToAscii ToUnicode ToUnicodeEx
UnloadKeyboardLayout UnregisterHotKey
VkKeyScan VkKeyScanEx
十七、 画线APIs:同第八类。
十八、 映射APIs:如果有志于开发图像放大宿小的程序,透彻的理解这些函数一定让你梦想成真。在Windows中,映射函数可以让程序员设置窗口的大小和缩放 因子,并对某一部份聚焦或缩小,以及坐标转换和旋转。
ClientToScreen CombineTransform DPtoLP
GetCurrentPositionEx GetGraphicsMode GetMapMode
GetViewportExtEx GetWindowExtEx
GetWindowOrgEx GetWorldTransform LPtoDP
MapWindowPoints ModifyWorldTransform
OffsetViewportOrgEx OffsetWindowOrgEx
ScaleViewportExtEx ScaleWindowExtEx ScreenToClient
SetGraphicsMode SetMapMode SetViewportExtEx
SetViewportOrgEx SetWindowExtEx SetWindowOrgEx
SetWorldTransform
十九、 菜单APIs:菜单分两种,弹出式菜单和非弹出式菜单。这些函数可以让程序员检测菜单状态、修改菜单的内容(包括:图标、字体,颜色)和出现形式。
CheckMenuRadioItem CreateMenu CreatePopupMenu
DeleteMenu DestroyMenu DrawMenuBar
EnableMenuItem GetMenu GetMenuDefaultItem
GetMenuItemCount GetMenuItemID GetMenuItemInfo
GetMenuItemRect GetSubMenu GetSystemMenu
HiliteMenuItem InsertMenuItem IsMenu
LoadMenu LoadMenuIndirect MenuItemFromPoint
RemoveMenu SetMenu SetMenuDefaultItem
SetMenuItemBitmaps SetMenuItemInfo TrackPopupMenu
TrackPopupMenuEx
二十、 消息APIs:在Windows上开发程序, 永远都离不开消息,当然如果你不用API或许你感觉不到。Windows将大多数事件翻译成消息,通常这些消息放入消息队列中,并由消息循环来处理。当消 息循环检测到消息队列中的消息时就会将其调度到适当的过程中进行处理。
BroadcastSystemMessage DispatchMessage GetInputState
GetMessage GetMessageExtraInfo GetMessagePos
GetMessageTime GetQueueStatus InSendMessage
InSendMessageEx PeekMessage PostMessage
PostQuitMessage PostThreadMessage
RegisterWindowMessage ReplyMessage SendAsyncProc
SendMessage SendMessageCallback SendMessageTimeout
SendNotifyMessage SetMessageExtraInfo TranslateMessage
WaitMessage
二十一、 鼠标APIs:利用鼠标函数可以获得不同的鼠标消息,包括:位置、按钮、双击时间和按钮交换信息。
DragDetect GetCapture GetDoubleClickTime
GetMouseMovePoints mouse_event ReleaseCapture
SetCapture SetDoubleClickTime
SwapMouseButton TrackMouseEvent
二十二、 鼠标光标APIs:光标函数让程序员们创建、拷贝、以及操纵鼠标光标。
ClipCursor CopyCursor CreateCursor
DestroyCursor GetClipCursor GetCursor
GetCursorPos LoadCursorFromFile SetCursor
SetCursorPos SetSystemCursor ShowCursor
二十三、 绘制APIs:千万不要把绘制函数当成绘图工具函数、线及曲线函数。绘制函数仅仅是为图形操作准备一块区域(包括获得设备环境句柄,释放设备环境句柄)。
BeginPaint EndPaint GetWindowDC
GetDC GetDCEx ReleaseDC
二十四、 图形操作APIs:这些函数的主要用途是在窗口的客户区内进行图形操作和控制。
CopyRect EqualRect InflateRect IntersectRect
IsRectEmpty OffsetRect PtInRect SetRect
SetRectEmpty SubtractRect UnionRect
BeginPaint DrawAnimatedRects DrawCaption
DrawEdge DrawFocusRect DrawFrameControl
DrawState DrawStateProc EndPaint
ExcludeUpdateRgn GdiFlush
GdiGetBatchLimit GdiSetBatchLimit
GetBkColor GetBkMode GetBoundsRect
GetROP2 GetUpdateRect GetUpdateRgn
GetWindowDC GdiGetBatchLimit GetWindowRgn
GrayString InvalidateRect InvalidateRgn
LockWindowUpdate OutputProc PaintDesktop
RedrawWindow SetBkColor SetBkMode
SetBoundsRect SetBoundsRect
SetROP2 SetWindowRgn UpdateWindow
WindowFromDC
二十五、 调色板APIs:调色板函数支持与设备无关的调色板的创建与操作,这些函数使得调色板能够正确的从一种设备映射到另一种设备。
AnimatePalette CreateHalftonePalette CreatePalette
GetColorAdjustment GetNearestColor GetNearestPaletteIndex
GetPaletteEntries GetSystemPaletteEntries GetSystemPaletteUse
HTUI_ColorAdjustment HTUI_DeviceColorAdjustment RealizePalette
ResizePalette SelectPalette SetColorAdjustment SetPaletteEntries
SetSystemPaletteUse UnrealizeObject UpdateColors
二十六、 矩形APIs:这些函数可以让我们选择和创建矩形屏幕区域,以方便程序员在这些区域内进行输出操作或者画线、绘图操作。
CopyRect EqualRect InflateRect IntersectRect
IsRectEmpty OffsetRect PtInRect SetRect
SetRectEmpty SubtractRect UnionRect
二十七、 滚动APIs:这些函数支持滚动和滚动条的操作,或对一个窗口的滚动,或对一个区域的滚动。
EnableScrollBar GetScrollInfo ScrollDC
ScrollWindowEx ShowScrollBar SetScrollInfo
二十八、 声音APIs:如果想在程序中正加声音或者开发一个多媒体程序,这些函数将对程序员大有帮助。
auxGetDevCaps auxGetNumDevs auxGetVolume
auxOutMessage PlaySound sndPlaySound
waveInAddBuffer waveInClose waveInGetDevCaps
waveInGetErrorText waveInGetID waveInGetNumDevs
waveInGetPosition waveInMessage waveInOpen
waveInPrepareHeader waveInProc waveInReset
waveInStart waveInStop waveInUnprepareHeader
waveOutBreakLoop waveOutClose waveOutGetDevCaps
waveOutGetErrorText waveOutGetID waveOutGetNumDevs
waveOutGetPitch waveOutGetPlaybackRate waveOutGetPosition
waveOutGetVolume waveOutMessage waveOutOpen
waveOutPause waveOutPrepareHeader waveOutProc
waveOutReset waveOutRestart waveOutSetPitch
waveOutSetPlaybackRate waveOutSetVolume
waveOutUnprepareHeader waveOutWrite