GDI问题,如何形成一个不规则的区域。

FengSC 2000-06-29 11:39:00
CreateRectRgn函数可以形成一个矩形区域,如何形成一个需要的不规则区域。如一只小鸟的外形。
...全文
168 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
hhzh426 2000-07-14
  • 打赏
  • 举报
回复
关注!
wangminfu 2000-06-30
  • 打赏
  • 举报
回复
先定义几个基本区域,然后用CombineRegion得到你所需要形状,最后设置window或form的形状即可。
Wingsun 2000-06-30
  • 打赏
  • 举报
回复
例如:
HRGN rgn;
rgn=CreateEllipticRgn(5,30,330,210);
SetWindowRgn(this->Handle,rgn,true);
你也可以使用以下函数:

CombineRgn
CreateEllipticRgn
CreateEllipticRgnIndirect
CreatePolygonRgn
CreatePolyPolygonRgn
CreateRectRgn
CreateRectRgnIndirect
CreateRoundRectRgn
EqualRgn
ExtCreateRegion
FillRgn
FrameRgn
GetPolyFillMode
GetRegionData
GetRgnBox
InvertRgn
OffsetRgn
PaintRgn
PtInRegion
RectInRegion
SetPolyFillMode
SetRectRgn
Un1 2000-06-29
  • 打赏
  • 举报
回复
CreatePolygonRgn
Option Explicit '函数声明 Private Declare Function GetPixel Lib "gdi32" (ByVal hDC As Long, ByVal X As Long, _ ByVal Y As Long) As Long Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Long, _ ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long Private Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As Long, _ ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long Private Declare Function CombineRgn Lib "gdi32" (ByVal hDestRgn As Long, ByVal hSrcRgn1 As Long, _ ByVal hSrcRgn2 As Long, ByVal nCombineMode As Long) As Long Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long Const RGN_OR = 2 Dim I As Integer, j, myint, linex As Integer Dim Fullr, myColor, crn As Long Dim Region, PicWidth, PicHeight As Long Dim mystart, mybool As Boolean Private Sub Form_Load() Dim hDC As Long Me.Width = Picture1.Width '设置窗体宽度等于图形宽度 Me.Height = Picture1.Height '设置窗体宽度等于图形宽度 Picture1.ScaleMode = vbPixels '设置Picture1度量单位为像素 Picture1.AutoRedraw = True '设置Picture1自动重绘有效 Picture1.AutoSize = True '设置Picture1自动调整大小 Picture1.BorderStyle = vbBSNone '设置Picture1的边框样式 Me.BorderStyle = vbBSNone '设置窗体的边框样式 hDC = Picture1.hDC mystart = True mybool = False I = 0 j = 0 PicWidth = Picture1.ScaleWidth PicHeight = Picture1.ScaleHeight linex = 0 myColor = GetPixel(hDC, 0, 0) '获取picture1指定像素的rgb值 For j = 0 To PicHeight - 1 For I = 0 To PicWidth - 1 If GetPixel(hDC, I, j) = myColor Or I = PicWidth Then '透明像素 If mybool Then mybool = False crn = CreateRectRgn(linex, j, I, j - 1) '创建矩形区域 If mystart Then Fullr = crn mystart = False Else CombineRgn Fullr, Fullr, crn, RGN_OR '合并区域 DeleteObject CreateRectRgn(linex, j, I, j - 1) '删除透明区域 End If End If Else '非透明像素 If Not mybool Then mybool = True linex = I End If End If Next Next Region = Fullr SetWindowRgn Me.hWnd, Region, True '设置窗体区域 myint = 0 End Sub Private Sub Timer1_Timer() '形成动画 Dim hDC As Long myint = myint + 1 If myint = 1 Then Set Picture1.Picture = LoadPicture(App.Path & "\sz3.bmp") If myint = 2 Then Set Picture1.Picture = LoadPicture(App.Path & "\sz4.bmp") If myint = 3 Then Set Picture1.Picture = LoadPicture(App.Path & "\sz5.bmp") If myint = 4 Then Set Picture1.Picture = LoadPicture(App.Path & "\sz6.bmp") If myint = 5 Then myint = 0 hDC = Picture1.hDC mystart = True mybool = False I = 0 j = 0 Me.Width = Picture1.Width Me.Height = Picture1.Height PicWidth = Picture1.ScaleWidth PicHeight = Picture1.ScaleHeight linex = 0 myColor = GetPixel(hDC, 0, 0) '获取picture1指定像素的rgb值 For j = 0 To PicHeight - 1 For I = 0 To PicWidth - 1 If GetPixel(hDC, I, j) = myColor Or I = PicWidth Then '透明像素 If mybool Then mybool = False crn = CreateRectRgn(linex, j, I, j - 1) '创建矩形区域 If mystart Then Fullr = crn mystart = False Else CombineRgn Fullr, Fullr, crn, RGN_OR '合并区域 DeleteObject CreateRectRgn(linex, j, I, j - 1) '删除透明区域 End If End If Else '非透明像素 If Not mybool Then mybool = True linex = I End If End If Next Next Region = Fullr SetWindowRgn Me.hWnd, Region, True '设置窗体区域 End Sub Private Sub Picture1_Click() End End Sub
秘书智能排座软件 V1.2 版本于2011年9月16日正式发布。软件程序升级后,增加和修复了一些功能,放宽了一些限制,运行效率和执行效率更高,系统更加安全可靠。 办文、办会、办事既是办公室日常工作的重要组成部分,也是办公室履行职能的重要手段。 在办公室工作的同仁,每天都会举办、组织、参与、协调各级各类会议。召开会议就涉及到参加会议人员的排座问题,就餐问题,还有会议代表集体合影留念问题。 一般情况下,我们要事先排定与会或就餐者的座次,但目前的座次表全凭工作人员手工制作,工作繁琐,容易出错。参会人员临时因故不能参会或增加人员,这种情况在会议开始头一天甚至会前经常发生,工作人员就需要在已经编排好的Excel表格中再插入或删除人员的姓名,轮番的“复制、粘贴”。如果参会人员多,往往错一个人,就需要一两个小时,甚至半天时间才能修改完成,有的甚至来不及修改座次表。 在办公室十几年经常从事这种机械重复而又繁琐无味的工作,使我们萌生了开发一种智能软件,把我们已经形成并普遍接受的规矩通过计算机程序来完成。 我们基于GIS基础地理信息系统平台,采用VC6+GDI的模式,来实现会场和会标自定义、会议座位区域自定义、就座列排多少自定义、就餐接待主题自定义、表格宽窄餐桌大小自定义、姓名横竖排列自定义、姓名字号大小自定义、过道多少和宽窄自定义、排列优先级自定义、列号排号自定义、备注和页码自定义、正反排列自由选择、A3A416开纸张自由选择(需根据计算机配备打印机的要求)、纸张横排竖排自主选择、个体群体排列自由选择、座次排列全部自动生成、参会人员、就餐人员和照相人员座次自动生成等等,能将几个小时的手工操作缩短为几秒钟,极大地减轻办公室秘书和会务人员的劳动强度和劳动量,有效提高工作效率,表现出不凡的作用和优越的性能。 目前一般使用的软件只是把名单通过程序导入到Excel表中,然后人工进行添加内容并修改完善。而秘书智能排座软件不同于这种Excel制表,您可以直观地将表格任意移动、修改、调整、设置,其科学性、灵活性、实用性都是其他同类软件无法比拟的。 秘书智能排座软件现有16种基本排列方法,交叉使用可延伸出更多的排列方法,只要是目前我们会议需要的,都可以通过秘书智能排座软件来实现。 秘书智能排座软件:轻轻一点帮您解决会议、照相、宴会、考试座位排列、座次安排的全部问题。 会务精灵,秘书必备,快乐工作,白领时尚。 会议考试,宴会照相,只需一点,轻松给力。 《秘书智能排座位软件 V1.2 版本正式发布》一文转载自〖秘书工作〗网站,版权属于原作者,转载请注明出处。文章地址:http://www.msgz.org/Article/Class71/17537.html
数据可视化智能软件主要性能指标 1) 分布式实时数据库 A 软件应采用多线程的处理机制,分布式组件的设计支持负载均衡体系。 B 内置动态优化功能,可保证用户在访问一个窗口、鼠标动作等所产生的数据交互的快速 响应。 C 数据库支持远程访问重连及数据断点续传功能,使数据库之间的数据同步及完整性具有 了高可靠性的保障。 D 软件应内置的实时数据库支持无限分层和扩展并支持中英文的标签配置,可以按照"工厂 数据模型"来管理整个系统。可根据实际情况按照厂区、车间、区域、工段、单元的多级 分层,方便一线人员的查看与管理。 E 具有灵活的结构,支持用户自定义点类型及参数的使用,用户可根据实际需要自定义自 己的各类数据库结构模型,方便对数据的管理和查找。 F 支持丰富的点类型包括模拟IO点,数字IO点,控制点,累积点,运算点,组合点,雪崩 过滤点,滤波点,计数器点,定时器点,设备运行点,事故追忆点等,可满足用户不同 场景下的应用。 2) 数据采集 A 通讯调度设计符合OPC规范,提供全开放的IO通讯参数,可获取通讯状态及IO的通讯优化 参数; B 支持通讯负载均衡与通讯效率的动态优化; C 支持IO通信多"进程"调度模式,根据实际需要可自由选择与分配信道与设备的数量来分 配多个或单个进程管理,优化数据采集开销; D 具有较强的数据读写能力,支持批量下置功能,支持写优先的策略,保证现场工况突发 事件及时处理。 E 支持传输数据块的自动与手动分包,支持"数据块"的读取与转发; F 根据具体协议要求,通讯性能可支持访问速度达毫秒级; G 支持多种协议的设备挂在一条通讯链路,连接设备可达数百个; H 支持模拟量、数字量、SOE、二进制数据类型的采集 I 提供设备配置参数、通讯数据配置模板,支持通讯状态的在线诊断与在线配置参数; J 软件可提供3000个以上的IO通讯驱动程序,支持与国内外主流的设备的通信与联网等, 支持以协议宏开发方式进行驱动程序开发。 K 支持IEC101、IEC104、CDT、DNP3等远动规约的通讯;支持以OPC、MODBUS、IEC101、IE C104等协议对外转发数据完成联网。 L 支持不固定网络IP的模式下的网络通讯;支持多设备无线通讯能力,避免采用虚拟串口 方式,造成数据传输不稳定的隐患; 3) 组态开发 A 组态开发管理提供的是一体化集成的系统开发平台,组态开发管理平台能够提供良好的 远程运维功能,支持分布式网络节点下的工程开发和部署,对工程能够远程更新。 B 管理工具按照分布式系统统一管理系统内工程,如实时数据、历史库、采集器、人机界 面 、Web服务等,可实现工程的离线应用和在线修改。 C 支持工程模型的导入与导出、变量查找替换; D 支持窗口的新建、复制,支持多窗口的文件管理,支持窗口查找与定位; E 支持多达几百种过渡色、渐进色调色板,支持透明色处理; F 支持图元打组、智能单元可根据数据模型封装对象,可支持自定义属性和方法,形成动 态图库; G 支持变量动态注册机制,支持通过脚本访问自定义脚本函数; H 支持ActiveX控件脚本开放函数; I 支持增强的ADO脚本。 J 支持以GDIGDI+、FLASH、WPF、WCF技术来构建软件图形库,可嵌入各种格式(BMP、G IF、JPG、JPEG、CAD等)的图片。 K 软件提供具备丰富的"矢量"行业图库集,图库集具有自己的属性方法,可提供用户编写 脚本逻辑,图库设计参考行业软件设计标准,图库包括工控场合常见的符号之外,还具备 行业定制化专用图库如油田、燃气、楼宇、新能源等。 L 软件平台提供集成化的设计环境,对工程模板创建、数据模型与画面模型等都进行了完 整的"模板化设计",支持界面及模板分组、派生继承等功能。 M 软件平台提供的批量组态工具包括设备批量创建、设备信息导入导出、点表批量复制功 能。 N 支持不同格式的多媒体文件,包括支持幻灯片播放,图片显示(BMP、JPG、PNG),GIF 动画文件播放,Flash文件播放,Windows Media Player所支持的全部文件格式。 4) 工业报警 A 支持ISA18.2标准,可以单独设立报警服务器,独立管理报警的通知与存储。 B 支持工业现场报警"雪崩"处理,方便响应大型系统异常及紧急情况; C 支持千万条级别报警记录存储,并方便网络查询; D 支持报警处置与评论,并可根据业务形成报警知识库 E 支持高达10个条件报警判断(H5、H4、H3、HH、HI、LO、LL、L3、L4、L5); F 支持的报警类型有限值报警,偏差报警,变化率报警,开关量报警。可设置十种限值报 警,报警支持1-9999种优先级,报警可分0- 99组,每个报警点可设置最多10个报警标签。; G 支持实现对测点、区域、类型、级别的统计查
'源代码 Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long 'GetDC()功能是获取指定窗体的设备场景的句柄(hDC),用参数0则可以获取整个屏幕的场景句柄 Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long 'GetPixel用于取得场景(这里是整个屏幕)中某点的颜色值 Private Declare Function SetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal crColor As Long) As Long 'SetPixel用于设置场景(这里是整个屏幕)中某点的颜色值 Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long '释放由GetDC()获取的设备场景句柄,否则可能造成系统锁死 Private Declare Function InvalidateRect& Lib "user32" (ByVal hwnd As Long, lpRect As RECT, ByVal bErase As Long) '清理窗口雪花 Private Type POINTAPI '定义坐标点结构 x As Long y As Long End Type Private Type RECT '定义“区域”数据结构,但实际上并没有用到,因为仅需在函数InvalidateRect中传递一个空的RECT参数 left As Long top As Long right As Long bottom As Long End Type Dim rect1 As RECT Private Const ScrnWidth = 1024 '屏幕宽度(单位:像素) Private Const ScrnHight = 768 '屏幕高度(单位:像素) Private Const SnowCol = &HFEFFFE '雪花颜色 Private Const SnowColDown = &HFFFFFF '积雪颜色 Private Const SnowColDuck = &HFFDDDD '深色积雪颜色 Private Const SnowNum = 500 '同一时间飘动的雪花数量 Dim hDC1 As Long '存储桌面窗口设备句柄 Dim pData(SnowNum) As POINTAPI '存储每个雪花的位置信息 Dim pColor(SnowNum) As Long '存储画出雪花前屏幕原来的颜色 Dim Vx As Integer '雪花总体水平飘行速度 Dim Vy As Integer '雪花总体垂直下落速度 Dim PVx As Integer '单个雪花实际水平飘行速度 Dim PVy As Integer '单个雪花实际垂直飘行速度 '初始化雪花位置 Private Sub InitP(i As Integer) pData(i).x = Rnd() * ScrnWidth pData(i).y = Rnd() * 2 pColor(i) = GetPixel(hDC1, pData(i).x, pData(i).y) '取得屏幕原来的颜色值 End Sub '取得某一点与周围点的对比度,确定是否在此位置堆积雪花 Private Function GetContrast(i As Integer) As Long Dim ColorCmp As Long '存储用作对比的点的颜色值 Dim tempR As Long '存储CorlorCmp的红色部分,下同 Dim tempG As Long Dim tempB As Long Dim Slope As Integer '存储雪花飘落方向:Vx/Vy '计算雪花飘落方向 If PVy <> 0 Then Slope = PVx / PVy Else Slope = 2 End If '根据雪花飘落方向决定取哪一点作对比点, '若PVx/PVy在-1到1之间,即Slope=0,就取正下面的象素点 '若PVx/PVy>1,取右下方的点,PVx/PVy<-1则取左下方 If Slope = 0 Then ColorCmp = GetPixel(hDC1, pData(i).x, pData(i).y + 1) Else If Slope > 1 Then ColorCmp = GetPixel(hDC1, pData(i).x + 1, pData(i).y + 1) Else ColorCmp = GetPixel(hDC1, pData(i).x - 1, pData(i).y + 1) End If End If '确定当前位置没有与另一个雪花重叠,否则返回0,用于防止由于不同雪花重叠造成雪花乱堆 If ColorCmp = SnowCol Then GetContrast = 0 Exit Function End If '分别获取ColorCmp与对比点的蓝、绿、红部分的差值 tempB = Abs((ColorCmp And &HFF0000) - (pColor(i) And &HFF0000)) / &H10000 tempG = Abs((ColorCmp And &HFF00&) - (pColor(i) And &HFF00&)) / &H100& tempR = Abs((ColorCmp And &HFF&) - (pColor(i) And &HFF&)) '返回对比度值 GetContrast = (tempR + tempG + tempB) / 3 End Function '画出一帧,即重画所有雪花位置一次 Private Sub DrawP() Dim i As Integer For i = 0 To SnowNum '防止雪花重叠造成干扰 If pColor(i) <> SnowCol Then '还原上一个位置的颜色 SetPixel hDC1, pData(i).x, pData(i).y, pColor(i) End If '设置新的位置,i Mod 3用于将雪花分为三类采用不同速度,以便形成层次感 PVx = Rnd() * 2 - 1 + Vx * (i Mod 3) PVy = Vy * (i Mod 3 + 1) pData(i).x = pData(i).x + PVx pData(i).y = pData(i).y + PVy '取得新位置原始颜色值,用于下一步雪花飘过时恢复此处颜色 pColor(i) = GetPixel(hDC1, pData(i).x, pData(i).y) '如果获取颜色失败,表明雪花已飘出屏幕,重新初始化 If pColor(i) = -1 Then InitP i Else '否则若雪花没有重叠 If pColor(i) <> SnowCol Then '若对比度较小(即不能堆积),就画出雪花 'Rnd()>0.3用于防止某些连续而明显的边界截获所有雪花 If Rnd() > 0.3 Or GetContrast(i) < 50 Then SetPixel hDC1, pData(i).x, pData(i).y, SnowCol '否则表明找到明显的边界,画出堆积的雪,并初始化以便画新的雪花 Else SetPixel hDC1, pData(i).x, pData(i).y - 1, SnowColDuck SetPixel hDC1, pData(i).x - 1, pData(i).y, SnowColDuck SetPixel hDC1, pData(i).x + 1, pData(i).y, SnowColDown InitP i End If End If End If Next End Sub Private Sub Form_Load() Dim j As Integer Me.Caption = "桌面飘雪" '设置窗口标题 '设置计时器,Timer1用于画单帧,Timer2用于风向变化 Timer1.Enabled = True Timer1.Interval = 10 Timer2.Enabled = True Timer2.Interval = 2000 Randomize '初始化随机数种子 hDC1 = GetDC(0) '获取桌面窗口设备场景句柄 '初始化整个屏幕 For j = 0 To SnowNum pData(j).x = Rnd() * ScrnWidth pData(j).y = Rnd() * ScrnHight pColor(j) = GetPixel(hDC1, pData(j).x, pData(j).y) Next End Sub Private Sub Form_Unload(Cancel As Integer) ReleaseDC 0, hDC1 '释放桌面窗口设备句柄 InvalidateRect 0, rect1, 0 '清除所有雪花,恢复桌面 End Sub Private Sub Timer1_Timer() DrawP '画出一帧 End Sub Private Sub Timer2_Timer() '改变风向 Vx = Rnd() * 4 - 2 Vy = Rnd() + 2 End Sub '完,最后,需要两个Timer:Timer1、Timer2。

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧