本帖最后由 seniors 于 2013-6-16 08:01 编辑
先挖个大坑,不知道能不能继续,也不知道有没有这个能力
一、基本概念
我也不懂,就请度娘说吧
GDI 概念
GDI是Graphics Device Interface的缩写,含义是图形设备接口,它的主要任务是负责系统与绘图程序之间的信息交换,处理所有Windows程序的图形输出。
在Windows操作系统下,绝大多数具备图形界面的应用程序都离不开GDI,我们利用GDI所提供的众多函数就可以方便的在屏幕、打印机及其它输出设备上输出图形,文本等操作。GDI的出现使程序员无需要关心硬件设备及设备驱动,就可以将应用程序的输出转化为硬件设备上的输出,实现了程序开发者与硬件设备的隔离,大大方便了开发工作。
GDI+
GDI+是Windows XP中的一个子系统,它主要负责在显示屏幕和打印设备输出有关信息,它是一组通过C++类实现的应用程序编程接口。顾名思义,GDI+是以前版本GDI的继承者,出于兼容性考虑,Windows XP仍然支持以前版本的GDI,但是在开发新应用程序的时候,开发人员为了满足图形输出需要应该使用GDI+,因为GDI+对以前的Windows版本中GDI进行了优化,并添加了许多新的功能。
作为图形设备接口的GDI+使得应用程序开发人员在输出屏幕和打印机信息的时候无需考虑具体显示设备的细节,他们只需调用GDI+库输出的类的一些方法即可完成图形操作,真正的绘图工作由这些方法交给特定的设备驱动程序来完成,GDI+使得图形硬件和应用程序相互隔离.从而使开发人员编写设备无关的应用程序变得非常容易。
二、GDI
先讲GDI因为相应简单点,但不一定是比GDI+操作方便
GDI的操作多是相对于设备环境(device context)的,设备环境简称DC,所以我们的操作多是针对DC来的。所以例子中第一个操作就是
“$hDC = _WinAPI_GetDC($hWnd)”
使用完DC要归还(释放)
最后一句就是释放DC的操作_WinAPI_ReleaseDC($hWnd, $hDC)
在这两句中间就是针对DC的操作
这一讲先讲字符串输出的一种方式_WinAPI_TextOut
看图和源程序应该能懂了,不细说了
GUISetState()
gditest()
上面这两句顺序不能颠倒,颠倒了就看不到输出的文字了,为什么?
因为我们这个是直接在DC里输出,如果gditest()放在前面,那当GUI显示时,会调用WM_PAINT绘制,而我们没有改动WM_PAINT,所以不能显示出来
而且本例子最小化后再恢复也不能显示出字符串,要达到最小化后再恢复能显示留到后面再讲。先看懂_WinAPI_TextOut
有问题请留言
GDI、GDI+相关知识点二DrawText
#include <APIConstants.au3>
#include <WinAPIEx.au3>
GUICreate("第一讲", 300, 200)
$ctrlId = GUICtrlCreatePic("",0 ,0 ,300,200)
$hWnd = GUICtrlGetHandle($ctrlId)
GUISetState()
gditest()
While 1
$Msg = GUIGetMsg()
Switch $Msg
Case -3
ExitLoop
EndSwitch
WEnd
GUIDelete()
Exit
Func gditest()
$hDC = _WinAPI_GetDC($hWnd)
_WinAPI_TextOut($hDC, 10, 10, '默认方式的字符串')
_WinAPI_SetBkMode($hDC, $TRANSPARENT);背景透明,即不使用背景颜色;返回值为原来的背景混合模式,即$OPAQUE
_WinAPI_TextOut($hDC, 10, 30, '背景透明的字符串')
_WinAPI_SetBkMode($hDC, $OPAQUE);背景填充模式
$oldTextColor = _WinAPI_SetTextColor($hDC, 0xFF0000);设置文字颜色,颜色模式为BBGGRR,返回值为原来的颜色
ConsoleWrite(Hex($oldTextColor, 6)&@CR);输出看一下一般默认是黑色0x000000
_WinAPI_TextOut($hDC, 10, 50, '修改字符颜色的字符串')
_WinAPI_SetTextColor($hDC, $oldTextColor);改回原来默认文字颜色
$oldBkColor = _WinAPI_SetBkColor($hDC, 0xFF0000);设置背景颜色,颜色模式为BBGGRR,返回值为原来的颜色
ConsoleWrite(Hex($oldBkColor, 6)&@CR);输出看一下一般默认是白色0xFFFFFF
_WinAPI_TextOut($hDC, 10, 70, '修改字符背景颜色的字符串')
_WinAPI_SetBkColor($hDC, $oldBkColor);改回原来默认背景颜色
$hFont = _WinAPI_CreateFont(38, 0, 0, 0, $FW_NORMAL, 0, 0, 0, $DEFAULT_CHARSET, $OUT_DEFAULT_PRECIS, $CLIP_DEFAULT_PRECIS, $ANTIALIASED_QUALITY, $DEFAULT_PITCH, '黑体')
$oldFontObj = _WinAPI_SelectObject($hDC, $hFont);选择新建立的字体,返回值为原来默认字体
_WinAPI_TextOut($hDC, 10, 90, '字号为38的黑体字符串')
_WinAPI_SelectObject($hDC, $oldFontObj);改回原来默认字体
_WinAPI_DeleteObject($hFont);释放字体对象
_WinAPI_ReleaseDC($hWnd, $hDC)
EndFunc
|