找回密码
 加入
搜索
查看: 18300|回复: 11

[交流] 第六讲 GDI设置图像到控件

 火.. [复制链接]
发表于 2013-5-17 20:36:01 | 显示全部楼层 |阅读模式
本帖最后由 seniors 于 2013-6-16 07:56 编辑

GDI之设置图片到控件
前面几讲,所有的图形只要最小化,窗口界面中就看不到了
原因是,我们直接在控件的设备环境DC中作图,没有能告诉控件,我们想一直显示这个图形
那下面我们来看一下,怎么样让它一直存在

一、首先画图不要直接在DC中;
当然不是不能,在DC中画图其实是很方便的,但是它有缺点
如果画图操作时间比较长,画面会卡顿
最好是其它地方,然后一次把图形拷贝过去这个有一系列的操作
如_WInAPi_BitBlt等一系列blt操作
对这一系列操作现在还不怎么熟悉,先不讲

二、要让画画的能够记住
所以我们要用到位图
_WinAPI_CreateCompatibleBitmap能够创建和DC相兼容的位图

三、怎么样画在位图上
_WinAPI_CreateCompatibleDC建立兼容DC环境,经常会把这个DC叫作内存DC,因为和窗口及控件没有关联
然后把上面的位图调入内存DC
接下来的操作就能画在位图上了

四、把画好的图设置到控件
对于设置有$SS_BITMAP样式的静态控件Label/Pic/Icon
能够使用_SendMessage($hWnd, $STM_SETIMAGE, 0, $hBitmap)设置图片
;$STM_SETIMAGE = 0x0172

引用的图案没人画,我来画吧
画图是很烦的,下一讲,说自绘了

#include <APIConstants.au3>
#include <StaticConstants.au3>
#include <WinAPIEx.au3>

;我用的是Lable
GUICreate("第六讲", 300, 200)
$nPicId = GUICtrlCreateLabel("", 0, 0, 300, 200,BitOR ($SS_NOTIFY, $SS_LEFT,$SS_BITMAP))
$hPicWnd = GUICtrlGetHandle($nPicId)
GUISetState()
gditest()

While 1
        $Msg = GUIGetMsg()
        Switch $Msg
                Case -3
                        ExitLoop
        EndSwitch
WEnd
GUIDelete()
Exit

Func gditest()
        ;建立与DC相兼容的位图
        Local $hDC = _WinAPI_GetDC($hPicWnd)
        Local $hBitmap = _WinAPI_CreateCompatibleBitmap($hDC, 300, 200);建立兼容位图,最好不好用_winapi_CreateBitmap建立,
        ;_winapi_CreateBitmap主要是建立单色位图,当然也能用_winapi_CreateBitmap来建立位图,但是把它调入DC时还是会做兼容处理的
;~         $hCDC = _WinAPI_CreateCompatibleDC($hDC)
        _WinAPI_ReleaseDC($hPicWnd, $hDC);释放DC
        
        ;创建兼容DC环境,0是屏幕兼容的内存DC,你也可以用上面注释的那句
        $hCDC = _WinAPI_CreateCompatibleDC(0)
        ;把位图调入DC,那对DC的操作就作用到位图上了
        $HoldBitmap = _WinAPI_SelectObject($hCDC, $hBitmap)
        
        ;清空背景,使用0xEEEEEE画刷
        $tRECT = _WinAPI_CreateRect(0, 0, 300, 200)
        $hBrush = _WinAPI_CreateSolidBrush(0xEEEEEE)
        _WinAPI_FillRect($hCDC, DllStructGetPtr($tRECT), $hBrush)
        _WinAPI_DeleteObject($hBrush)
        
        ;绘制“引用”图形的路径
        _WinAPI_SetArcDirection($hCDC, $AD_CLOCKWISE)
        _WinAPI_BeginPath($hCDC)
        _WinAPI_MoveTo($hCDC, 50, 10)
        _WinAPI_LineTo($hCDC, 250, 10)
        $tRECT = _WinAPI_CreateRect(210, 10, 290, 90)
        _WinAPI_ArcTo($hCDC, $tRECT, 250, 10, 290, 50)
        _WinAPI_LineTo($hCDC, 290, 100)
        _WinAPI_OffsetRect($tRECT, 0, 50)
        _WinAPI_ArcTo($hCDC, $tRECT, 290, 100, 250, 140)
        _WinAPI_LineTo($hCDC, 200, 140)
        _WinAPI_LineTo($hCDC, 200, 180)
        _WinAPI_LineTo($hCDC, 170, 140)
        _WinAPI_LineTo($hCDC, 50, 140)
        _WinAPI_OffsetRect($tRECT, -200, 0)
        _WinAPI_ArcTo($hCDC, $tRECT, 50, 140, 10, 100)
        _WinAPI_LineTo($hCDC, 10, 50)
        _WinAPI_OffsetRect($tRECT, 0, -50)
        _WinAPI_ArcTo($hCDC, $tRECT, 10, 50, 50, 10)
        _WinAPI_EndPath($hCDC)
        
        ;设置画笔。画刷
        $hBrush = _WinAPI_CreateSolidBrush(0x996633)
        $hPen = _WinAPI_CreatePen($PS_SOLID, 1, 0xC0C0C0)
        _WinAPI_SelectObject($hCDC, $hBrush)
        _WinAPI_SelectObject($hCDC, $hPen)
        ;路径描边并填充
        _WinAPI_StrokeAndFillPath($hCDC)
        
        ;设置字体
        $hFont = _WinAPI_CreateFont(38, 0, 0, 0, $FW_NORMAL, 0, 0, 0, $DEFAULT_CHARSET, $OUT_DEFAULT_PRECIS, $CLIP_DEFAULT_PRECIS, $ANTIALIASED_QUALITY, $DEFAULT_PITCH)
        _WinAPI_SelectObject($hCDC, $hFont)
        _WinAPI_SetBkMode($hCDC, $TRANSPARENT)
        _WinAPI_SetTextColor($hCDC, 0xC0C0C0)
        _WinAPI_TextOut($hCDC, 90, 20, "“引用”")
        _WinAPI_DrawLine($hCDC, 50, 60, 250, 60)
        _WinAPI_DrawLine($hCDC, 50, 100, 250, 100)
        ;删除兼容DC
        _WinAPI_DeleteDC($hCDC)
        ;设置图片到控件
        setBitmap($hPicWnd, $hBitmap)
EndFunc   ;==>gditest

Func setBitmap($hWnd, $hBitmap)
        $hObj = _SendMessage($hWnd, 0x0172, 0, $hBitmap) ;$STM_SETIMAGE = 0x0172
        _WinAPI_DeleteObject($hObj)
        Local $hObj = _SendMessage($hWnd, 0x0173) ;$STM_GETIMAGE = 0x0173
        If $hObj <> $hBitmap Then
                _WinAPI_DeleteObject($hBitmap)
        EndIf
EndFunc   ;==>setBitmap

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×

评分

参与人数 6威望 +5 金钱 +305 贡献 +54 收起 理由
pusofalse + 2 + 30 + 5 学习了。
131738 + 100 + 25
xms77 + 50 + 5 学习GDI辛苦,写GDI教程的人更辛苦!
楼上风云 + 25 这个周末,期待更多
lpxx + 14 厉害、佩服

查看全部评分

发表于 2013-5-17 20:51:04 | 显示全部楼层
第一时间赶到~今晚上补课~
发表于 2013-5-17 21:15:33 | 显示全部楼层
辛苦啦,讲的很好哦。比自己头没脑的查函数好多啦,谢谢!因为分享所以快乐!
发表于 2013-5-17 21:20:50 | 显示全部楼层
回复 1# seniors

应酬又让我错过了坐板凳的机会
发表于 2013-5-17 22:43:41 | 显示全部楼层
原来要系统一直显示这么麻烦,还在努力学习消化中。。。。。。。。
发表于 2013-5-17 23:24:04 | 显示全部楼层
方便群众,建议每帖加上先前帖的链接......
发表于 2013-5-18 00:57:22 | 显示全部楼层
必须要顶  只有敬佩
发表于 2013-5-18 11:13:58 | 显示全部楼层
在努力学习消化
发表于 2013-7-27 10:38:38 | 显示全部楼层
先收藏,一步一步来。
发表于 2013-8-26 14:01:30 | 显示全部楼层
根本看不懂。。
发表于 2015-9-3 13:45:17 | 显示全部楼层
感谢分享。学习了。
发表于 2022-10-18 21:37:58 | 显示全部楼层
慢慢学习 谢谢大师
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-22 02:10 , Processed in 0.085415 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表