当前位置: 首页 > wzjs >正文

淘宝客网站管理微信网站开发语言

淘宝客网站管理,微信网站开发语言,物联网卡一年服务费多少钱啊,怎么在网络上推广GDI32中用PtInRegion检测坐标是否在图形区域内: 如果画了一个矩形,外边框线条粗细是10像素,检测区域时只能在第6像素开始才能反应,鼠标移动到边框线的1-5像素时,检测鼠标未在矩形区域 您遇到的问题是由于 GDI 中区域 (Region) 的定义与边框 (Stroke) 的渲染方式不同…

GDI32中用PtInRegion检测坐标是否在图形区域内: 如果画了一个矩形,外边框线条粗细是10像素,检测区域时只能在第6像素开始才能反应,鼠标移动到边框线的1-5像素时,检测鼠标未在矩形区域

您遇到的问题是由于 GDI 中区域 (Region) 的定义与边框 (Stroke) 的渲染方式不同导致的。这是 GDI 绘图系统的一个常见特性,需要特别处理。

问题原因分析

  1. 区域 (Region) vs 边框 (Stroke)

    • CreateRectRgn 创建的区域是填充区域,不包含边框
    • 边框是绘制在区域边缘外部的,默认情况下不被视为区域的一部分
  2. 边框宽度的影响

    • 当您设置边框宽度为 10 像素时,这 10 像素是从区域边缘向外扩展的
    • 区域本身的边界并没有改变,因此PtInRegion只检测填充区域
  3. 坐标系统差异

    • 区域使用整数坐标,而边框渲染可能使用亚像素精度
    • 这种差异可能导致视觉上的边框与实际区域边界不一致

解决方案

方法一:创建包含边框的扩展区域vb
' API声明
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 PtInRegion Lib "gdi32" (ByVal hRgn As Long, ByVal x As Long, ByVal y As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As LongPrivate Const RGN_OR = 2  ' 区域合并操作Private Sub CreateExtendedRegion(ByVal left As Long, ByVal top As Long, ByVal right As Long, ByVal bottom As Long, ByVal borderWidth As Long, ByRef hRegion As Long)Dim hFillRgn As LongDim hBorderRgn As Long' 创建填充区域hFillRgn = CreateRectRgn(left, top, right, bottom)' 创建扩展区域(包含边框)hBorderRgn = CreateRectRgn(left - borderWidth, top - borderWidth, _right + borderWidth, bottom + borderWidth)' 合并两个区域hRegion = CreateRectRgn(0, 0, 1, 1)  ' 创建临时区域CombineRgn hRegion, hFillRgn, hBorderRgn, RGN_OR' 释放临时区域DeleteObject hFillRgnDeleteObject hBorderRgn
End Sub' 使用示例
Private Sub Form_Load()Dim hRegion As LongDim borderWidth As LongborderWidth = 10' 创建包含10像素边框的区域CreateExtendedRegion 100, 100, 300, 200, borderWidth, hRegion' 现在可以使用这个区域进行鼠标检测' PtInRegion(hRegion, x, y) 将包含边框区域
End Sub
方法二:分别检测填充区域和边框区域vb
Private Sub MouseInBorderOrFill(ByVal x As Long, ByVal y As Long, ByVal left As Long, ByVal top As Long, ByVal right As Long, ByVal bottom As Long, ByVal borderWidth As Long, ByRef inBorder As Boolean, ByRef inFill As Boolean)' 检测是否在填充区域内inFill = (x >= left And x <= right And y >= top And y <= bottom)' 检测是否在边框区域内If Not inFill TheninBorder = (x >= left - borderWidth And x <= right + borderWidth And _y >= top - borderWidth And y <= bottom + borderWidth) And _Not inFillElseinBorder = FalseEnd If
End Sub' 使用示例
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)Dim pixelX As Long, pixelY As LongDim inBorder As Boolean, inFill As BooleanpixelX = X / Screen.TwipsPerPixelXpixelY = Y / Screen.TwipsPerPixelY' 检测鼠标是否在矩形(100,100,300,200)的填充区域或边框(宽度10)内MouseInBorderOrFill pixelX, pixelY, 100, 100, 300, 200, 10, inBorder, inFillIf inFill ThenMe.Caption = "鼠标在填充区域内"ElseIf inBorder ThenMe.Caption = "鼠标在边框区域内"ElseMe.Caption = "鼠标在区域外"End If
End Sub

方法三:使用 GDI + 进行精确检测

GDI + 提供了更精确的区域检测功能,可以直接包含边框:

' GDI+ API声明
Private Declare Function GdipCreateFromHDC Lib "gdiplus" (ByVal hdc As Long, ByRef graphics As Long) As Long
Private Declare Function GdipDeleteGraphics Lib "gdiplus" (ByVal graphics As Long) As Long
Private Declare Function GdipCreatePen1 Lib "gdiplus" (ByVal color As Long, ByVal width As Single, ByVal unit As Long, ByRef pen As Long) As Long
Private Declare Function GdipCreatePath Lib "gdiplus" (ByVal fillMode As Long, ByRef path As Long) As Long
Private Declare Function GdipAddPathRectangle Lib "gdiplus" (ByVal path As Long, ByVal x As Single, ByVal y As Single, ByVal width As Single, ByVal height As Single) As Long
Private Declare Function GdipIsVisiblePathPoint Lib "gdiplus" (ByVal x As Single, ByVal y As Single, ByVal path As Long, ByVal pen As Long, ByVal graphics As Long) As Long
Private Declare Function GdipDisposePath Lib "gdiplus" (ByVal path As Long) As Long
Private Declare Function GdipDisposePen Lib "gdiplus" (ByVal pen As Long) As LongPrivate Const UnitPixel As Long = 2Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)Dim pixelX As Single, pixelY As SingleDim hGraphics As LongDim hPath As LongDim hPen As LongDim isVisible As LongpixelX = X / Screen.TwipsPerPixelXpixelY = Y / Screen.TwipsPerPixelY' 创建GDI+图形对象GdipCreateFromHDC Me.hdc, hGraphics' 创建路径和笔GdipCreatePath 0, hPath  ' 0 = FillModeAlternateGdipCreatePen1 &HFF0000, 10, UnitPixel, hPen  ' 10像素宽的笔' 添加矩形到路径GdipAddPathRectangle hPath, 100, 100, 200, 100' 检测点是否在路径(包括边框)上isVisible = GdipIsVisiblePathPoint(pixelX, pixelY, hPath, hPen, hGraphics)If isVisible <> 0 ThenMe.Caption = "鼠标在矩形(包括边框)内"ElseMe.Caption = "鼠标在矩形外"End If' 释放资源GdipDisposePath hPathGdipDisposePen hPenGdipDeleteGraphics hGraphics
End Sub

性能考虑

  1. 扩展区域方法:性能较高,但需要额外管理区域对象
  2. 分别检测方法:简单直接,适合小型应用
  3. GDI + 方法:最精确,但性能开销较大,适合对精度要求高的场景

根据您的具体需求选择合适的方法,可以有效解决边框检测问题。


文章转载自:

http://UL6TbT68.mdjtk.cn
http://TemtIIMr.mdjtk.cn
http://uLV2RSce.mdjtk.cn
http://kDpeUCJM.mdjtk.cn
http://SlrvMsNA.mdjtk.cn
http://LOqI8Z0s.mdjtk.cn
http://RZNzHts2.mdjtk.cn
http://9Cj47nH2.mdjtk.cn
http://xwxNeakc.mdjtk.cn
http://kkCeIZMn.mdjtk.cn
http://KIYURVxj.mdjtk.cn
http://WucPI9MX.mdjtk.cn
http://wmJxPSrP.mdjtk.cn
http://X7xQNxhL.mdjtk.cn
http://pjVtoI2D.mdjtk.cn
http://0bwXoKm9.mdjtk.cn
http://PDUbrjzO.mdjtk.cn
http://oOR710Vf.mdjtk.cn
http://XSZ205yR.mdjtk.cn
http://rGiTS1RZ.mdjtk.cn
http://OtmCcX4t.mdjtk.cn
http://sb9KFLLg.mdjtk.cn
http://k1qN9luU.mdjtk.cn
http://SImdIxVC.mdjtk.cn
http://m1tquTWG.mdjtk.cn
http://J4sT03Ww.mdjtk.cn
http://i6qpOKg8.mdjtk.cn
http://G8SSL7Hs.mdjtk.cn
http://hpsVMUy8.mdjtk.cn
http://2BwkBzGk.mdjtk.cn
http://www.dtcms.com/wzjs/738557.html

相关文章:

  • 从零开始学网站建设服务器租用租赁
  • 电子商务网站建设设计怎么做hs网站
  • 网站色彩设计做外贸怎么上国外网站
  • 深圳网站建设开发住房和建设部执业资格注册中心网站
  • 做外包装很厉害的网站wordpress去除下划线
  • 安徽省和城乡建设厅网站什么软件制作图片
  • 洛阳网站建设首选洛阳铭信科技中国室内设计培训排名
  • 建设部执业资格注册中心网站ae有么有做gif的网站
  • 开封做网站公司深圳市建设局网站张局
  • 纺织服装网站建设规划方案wordpress 本地视频
  • 单页面网站推广方法站长之家whois
  • 中国网站名国际品牌的广州网页设计
  • 企业网站可信认证必须做吗中国招标网官网app
  • 长春网站建设网seo排名优化服务
  • 安徽二建注销网站在哪查询科技与狠活是什么意思
  • 做社区网站用什么程序好wordpress手机端怎么看
  • 服务定制网站工业设计专业就业方向
  • 仪器仪表公司网站模版英语seo什么意思
  • 免费模板素材网站有哪些宁波模板网页制作
  • 个人怎样做网站傻瓜动态建站 工具
  • 织梦移动网站个人网站能干嘛
  • 养老院网站建设的好处淮安做网站
  • 镇江模板网站网站如何做长尾词排名
  • 新手想做网站赚钱保定制作网站软件
  • 分析网站建设流程西安网站的建设
  • 高清免费爱做网站域名价格排名
  • 美工网站视频网站点击链接怎么做的
  • 网站标题名字和备案名字体育馆做网站公司
  • 深圳网站备案点重庆网站建设电话
  • 婚庆公司介绍郑州网站seo公司