【问题标题】:CreatePen GDI function problem on Windows 7Windows 7 上的 CreatePen GDI 功能问题
【发布时间】:2010-10-27 22:58:18
【问题描述】:

当笔宽为 3 或 4(LineTo 不绘制任何内容)时,CreatePen GDI 函数在 Windows 7 上不起作用。它适用于 0 - 2 宽度。在所有情况下都使用 PS_SOLID 笔样式。

【问题讨论】:

    标签: gdi


    【解决方案1】:

    LineTo 不包括线的终点。尝试不同的端盖设置,看看是否会有所不同。

    【讨论】:

    • 谢谢马克的好主意。通过用 PolyLine 调用替换 LineTo 函数调用解决了该问题。我使用了普通的 CreatePen API,它不像 ExtCreatePen 那样作为参数结束设置。有趣的是,这段代码在 Vista 和 XP 上运行良好。只有宽度为 3 及以上的 Windows 7 有问题。 ——
    【解决方案2】:

    它返回句柄还是 NULL?
    您是否考虑过使用 CreatePenIndirect 和结构 LOGPEN?
    http://msdn.microsoft.com/en-us/library/dd183510(v=VS.85).aspx
    http://msdn.microsoft.com/en-us/library/dd145041(v=VS.85).aspx
    这在我的电脑 Windows 7 x64 上运行良好:

    Option Explicit
    
    Private Declare Function CreatePen Lib "gdi32" ( _
       ByVal nPenStyle As Long, _
       ByVal nWidth As Long, _
       ByVal crColor As Long) As Long
    
    Private Declare Function LineTo Lib "gdi32" ( _
       ByVal hDC As Long, ByVal x As Long, ByVal y As Long) As Long
    
    Private Declare Function SelectObject Lib "gdi32" ( _
       ByVal hDC As Long, ByVal hObject As Long) As Long
    
    Private Declare Function DeleteObject Lib "gdi32" ( _
       ByVal hObject As Long) As Long
    
    Dim x As Long
    Dim y As Long
    Dim w As Long
    
    Private Sub Command1_Click()
       w = w + 1
       Dim hpen As Long: hpen = CreatePen(0, w, 0)
       Dim ret As Long: ret = SelectObject(Me.hDC, hpen)
       If ret <> 0 Then
           x = x + 10
           y = y + 10
           Call LineTo(Me.hDC, x, y)
       End If
       Call DeleteObject(hpen)
    End Sub
    

    多次点击按钮

    【讨论】:

    • 谢谢马克的好主意。通过将 LineTo 函数调用替换为 PolyLine 调用解决了该问题。我使用了普通的 CreatePen API,它不像 ExtCreatePen 那样作为参数结束设置。有趣的是,这段代码在 Vista 和 XP 上运行良好。只有宽度为 3 及以上的 Windows 7 有问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多