与 CPU 限制 无关。这与窗体背景的呈现及其子控件的内容有关。
在此处阅读说明:How to fix the flickering in User Controls.
(但WS_EX_COMPOSITED 在这里帮不了你)。
由于您有一些组合功能的控件,您可以构建一个 UserControl 将单个控件分组为一个专门的实体,该实体提供功能并包含执行此任务所需的所有逻辑并通知当做出选择时(验证所有输入值并点击提交按钮)。
要处理此 UserControl 的透明度,您必须稍微调整其标准行为,因为当您有一个带有背景图像的表单时,仅设置 BackColor = Color.Transparent 是不够的:考虑到表单的 @,将模拟透明度987654332@颜色,不是背景图像的内容(图像不是颜色)。
您可以使您的 UserControl 真正透明,防止其背景被绘制。
当单击Add Task 按钮时,UserControl 可以引发公共事件,传入自定义 EventArgs 对象 - 验证后 - 输入的值。
Form 可以订阅此事件并在引发事件时读取自定义 EventArgs 属性。
- 由于您的表单有背景图像,请设置
DoubleBuffered = True。
看起来是这样的:
此处显示的图片大小为3840x2560(可从网上免费下载)。
尝试调整表单的大小而不对其进行双重缓冲:)
完整的 UserControl 的 PasteBin,以备不时之需:
Transparent UserControl
假设添加到表单的 UserControl (AddNewTask) 名为 AddNewTask1,您可以使用设计器或在代码中的表单构造函数中将事件处理程序添加到其 AddTaskClicked 事件:
Public Class SomeForm
Public Sub New()
InitializeComponent()
AddHandler AddNewTask1.AddTaskClicked, AddressOf OnTaskAdded
End Sub
Private Sub OnTaskAdded(sender As Object, e As AddNewTask.AddTaskEventArgs)
Dim values As String = $"{e.TaskName}: Hours: {e.TaskHours}, Minutes: {e.TaskMinutes}"
End Sub
End Sub
AddNewTask UserControl:
Public Class AddNewTask
Private Const WS_EX_TRANSPARENT As Integer = &H20
Private Const WS_CLIPCHILDREN As Integer = &H2000000
Public Event AddTaskClicked As EventHandler(Of AddTaskEventArgs)
Public Sub New()
SetStyle(ControlStyles.Opaque Or ControlStyles.ResizeRedraw, True)
SetStyle(ControlStyles.OptimizedDoubleBuffer, False)
InitializeComponent()
End Sub
Protected Overrides ReadOnly Property CreateParams As CreateParams
Get
Dim cp As CreateParams = MyBase.CreateParams
cp.Style = cp.Style And Not WS_CLIPCHILDREN
cp.ExStyle = cp.ExStyle Or WS_EX_TRANSPARENT
Return cp
End Get
End Property
Private Sub btnAddTask_Click(sender As Object, e As EventArgs) Handles btnAddTask.Click
Dim hours As UInteger
Dim sHours = If(String.IsNullOrEmpty(txtHours.Text.Trim()), "0", txtHours.Text)
If (Not UInteger.TryParse(sHours, hours)) Then
ShowInputErrorMessage("Invalid Hours", txtHours)
Return
End If
Dim minutes As UInteger
Dim sMinutes = If(String.IsNullOrEmpty(txtMinutes.Text.Trim()), "0", txtMinutes.Text)
If (Not UInteger.TryParse(sMinutes, minutes)) Then
ShowInputErrorMessage("Invalid Minutes", txtMinutes)
Return
End If
Hide()
Dim args = New AddTaskEventArgs(txtTaskName.Text, hours, minutes)
RaiseEvent AddTaskClicked(Me, args)
txtHours.Clear()
txtMinutes.Clear()
txtTaskName.Clear()
ActiveControl = txtTaskName
End Sub
Private Sub ShowInputErrorMessage(msg As String, ctrl As TextBox)
MessageBox.Show(msg)
ctrl.Select()
ctrl.SelectAll()
End Sub
Public Class AddTaskEventArgs
Inherits EventArgs
Public Sub New(sTaskName As String, hours As UInteger, minutes As UInteger)
TaskName = sTaskName
TaskHours = hours
TaskMinutes = minutes
End Sub
Public ReadOnly Property TaskName As String
Public ReadOnly Property TaskHours As UInteger
Public ReadOnly Property TaskMinutes As UInteger
End Class
End Class