gpt4 book ai didi

c# - GetDCEx 在表单显示之前返回 null。在非客户区绘图

转载 作者:行者123 更新时间:2023-11-30 12:35:29 25 4
gpt4 key购买 nike

我有一个绘制到非客户区的 C# .NET WinForm 应用程序。一切正常,绘图按预期发生,但表单加载时除外。

我很好地捕捉到了 WM_NCPAINT,但是当我尝试使用 GetDCEx 获取 DC 时,它总是返回空值,直到显示表单为止,这是完全合乎逻辑的,但这意味着非客户区不会再次绘制,直到调整窗口大小意味着当表单首次加载或从最小化状态恢复时,NC 区域不会重绘并保持白色。

这似乎是 Windows 7 所独有的。

那么在这种情况下如何绘制到NC区域呢?

编辑:我应该补充一点,我不关心 Aero 玻璃,我的表单完全禁用了它。

最佳答案

我使用 GetWindowDC 而不是 GetDCEx。下面是我使用的代码,我在 Windows 7 上没有问题。正如 Hans 评论的那样,最好的方法是将 FormBorderStyle 设置为 None,但是我喜欢使用 csharptest.net

Imports System.Runtime.InteropServices

Public Class NCForm
Inherits Form

Public Sub New()
Me.FormBorderStyle = FormBorderStyle.None
End Sub

Protected Overrides Sub WndProc(ByRef m As Message)
MyBase.WndProc(m)

If m.Msg = Win32.WM_NCCALCSIZE Then
If m.WParam <> IntPtr.Zero Then
Dim tmpResize As Win32.NCCALCSIZE_PARAMS = Marshal.PtrToStructure(m.LParam, GetType(Win32.NCCALCSIZE_PARAMS))
With tmpResize.rcNewWindow
.Left += 2
.Top += 2
.Right -= 2
.Bottom -= 2
End With
Marshal.StructureToPtr(tmpResize, m.LParam, False)
Else
Dim tmpResize As Win32.RECT = Marshal.PtrToStructure(m.LParam, GetType(Win32.RECT))
With tmpResize
.Left += 2
.Top += 2
.Right -= 2
.Bottom -= 2
End With
Marshal.StructureToPtr(tmpResize, m.LParam, False)
End If
m.Result = New IntPtr(1)

ElseIf m.Msg = Win32.WM_NCPAINT Then
Dim tmpDC as IntPtr = Win32.GetWindowDC(m.HWnd)
Using tmpG As Graphics = Graphics.FromHdc(tmpDC)
tmpG.DrawRectangle(Pens.Red, New Rectangle(0, 0, Me.Width - 1, Me.Height - 1))
tmpG.DrawRectangle(SystemPens.Window, New Rectangle(1, 1, Me.Width-3, Me.Height - 3))
End Using
Win32.ReleaseDC(m.HWnd, tmpDC)
End If
End Sub

当然,一旦你这样做了,你就必须自己处理任何调整大小、最小-最大、关闭功能。

关于c# - GetDCEx 在表单显示之前返回 null。在非客户区绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5409354/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com