我发现的大部分内容都让人们使用类似的代码块,就像我在下面所做的那样(我用它来自定义用户控件上的特定颜色绘制边框):
// PInvoke declaration
[DllImport("User32.dll", EntryPoint = "GetDCEx")]
internal static extern IntPtr GetDCEx(IntPtr hWnd, IntPtr hRgn, int flags);
// Event Override
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
IntPtr hWnd = this.Handle;
IntPtr hRgn = IntPtr.Zero;
IntPtr hdc = GetDCEx(hWnd, hRgn, 1027);
using (Graphics grfx = Graphics.FromHdc(hdc))
{
Rectangle rect = new Rectangle(0, 0, this.Width - 1, this.Height -
1);
Pen pen = new Pen(Color.FromArgb(192, 192, 192), 1);
grfx.DrawRectangle(pen, rect);
}
}
但我实际上并不知道为什么我将1027传递给旗帜参数。查看Microsoft的此方法文档,我看到有一个DeviceContext值列表(复制如下)。那么1027在这种背景下实际意味着什么?
/// <summary>Values to pass to the GetDCEx method.</summary>
[Flags()]
private enum DeviceContextValues : uint
{
/// <summary>DCX_WINDOW: Returns a DC that corresponds to the window rectangle rather
/// than the client rectangle.</summary>
Window = 0x00000001,
/// <summary>DCX_CACHE: Returns a DC from the cache, rather than the OWNDC or CLASSDC
/// window. Essentially overrides CS_OWNDC and CS_CLASSDC.</summary>
Cache = 0x00000002,
/// <summary>DCX_NORESETATTRS: Does not reset the attributes of this DC to the
/// default attributes when this DC is released.</summary>
NoResetAttrs = 0x00000004,
/// <summary>DCX_CLIPCHILDREN: Excludes the visible regions of all child windows
/// below the window identified by hWnd.</summary>
ClipChildren = 0x00000008,
/// <summary>DCX_CLIPSIBLINGS: Excludes the visible regions of all sibling windows
/// above the window identified by hWnd.</summary>
ClipSiblings = 0x00000010,
/// <summary>DCX_PARENTCLIP: Uses the visible region of the parent window. The
/// parent's WS_CLIPCHILDREN and CS_PARENTDC style bits are ignored. The origin is
/// set to the upper-left corner of the window identified by hWnd.</summary>
ParentClip = 0x00000020,
/// <summary>DCX_EXCLUDERGN: The clipping region identified by hrgnClip is excluded
/// from the visible region of the returned DC.</summary>
ExcludeRgn = 0x00000040,
/// <summary>DCX_INTERSECTRGN: The clipping region identified by hrgnClip is
/// intersected with the visible region of the returned DC.</summary>
IntersectRgn = 0x00000080,
/// <summary>DCX_EXCLUDEUPDATE: Unknown...Undocumented</summary>
ExcludeUpdate = 0x00000100,
/// <summary>DCX_INTERSECTUPDATE: Unknown...Undocumented</summary>
IntersectUpdate = 0x00000200,
/// <summary>DCX_LOCKWINDOWUPDATE: Allows drawing even if there is a LockWindowUpdate
/// call in effect that would otherwise exclude this window. Used for drawing during
/// tracking.</summary>
LockWindowUpdate = 0x00000400,
/// <summary>DCX_USESTYLE: Undocumented, something related to WM_NCPAINT message.</summary>
UseStyle = 0x00010000,
/// <summary>DCX_VALIDATE When specified with DCX_INTERSECTUPDATE, causes the DC to
/// be completely validated. Using this function with both DCX_INTERSECTUPDATE and
/// DCX_VALIDATE is identical to using the BeginPaint function.</summary>
Validate = 0x00200000,
}
答案 0 :(得分:3)
1027
是二进制的0100 0000 0011
,因此它是以下标志的组合:
该值来自在标志上使用二进制OR:
Window | Cache | LockWindowUpdate
= 0x1 | 0x2 | 0x400
= 0x403
= 1027
为清楚起见,您应该在代码中指定标志,而不是仅仅使用幻数:
DeviceContextValues.Window | DeviceContextValues.Cache | DeviceContextValues.LockWindowUpdate