天道酬勤,学无止境

如何将事件与用户窗体上的选项按钮控件一起使用(How to use Events with Option Button Controls on Userform [duplicate])

问题

我正在尝试从Excel工作表中的范围添加一个选项按钮。

For Each Value In OptionList

    Set opt = UserForm3.Controls.Add("Forms.OptionButton.1", "radioBtn" & i, True)
    opt.Caption = Value
    opt.Top = opt.Height * i
    opt.GroupName = "Options"

    UserForm3.Width = opt.Width
    UserForm3.Height = opt.Height * (i + 2)

    i = i + 1

Next

我想创建一个事件处理程序,以便在从用户运行代码时如果选择radiobtn1 。 尽管我有很多答案,但这些答案是针对工作表用户表单的。

我的意图是使用VBA用户表单。 请帮我与您的想法。

回答1

用户表单只有一种类型,但是[Excel]可用的两种控件存在[永恒]的困惑–不同在线资源使用的对比术语加剧了这种困惑。 (仅有关ActiveX控件的部分适用于用户表单。)也许我可以通过在一些可以帮助理解的文字中加以说明。


概述:

  • 控件有两种类型:表单控件ActiveX控件

    • 这两种类型的控件可以在工作表上使用,但只有ActiveX控件可以在用户窗体中使用。

    • 表单控件是Shapes集合的一部分(就像“绘图对象”一样),因此被称为: * <code>工作表</ code> * ** <code>。</ code> <code>形状(“ </ code> ** * <code>控件名称</ code> * ** <code>”)< / code> **

    • ActiveX控件基本上是工作表的一部分,因此被称为:
      * <code>工作表</ code> * ** <code>。</ code> ** * <code>控件名</ code> *

    • 两种类型的控件都可以在工作表中创建,修改和删除,也可以使用VBA编程地进行删除,但是,两种类型的控件在使用VBA引用它们时的语法略有不同。

  • 一些站点讨论还讨论了数据表单。 这只不过是专门为数据输入/处理而设计的用户表单,因此将它们(听起来更熟悉)称为“数据输入用户表单”会更有意义。

  • Office文档有时也将工作表称为表单。 尽管从技术上讲这是正确的,但不要让此混淆。 认为“形式”一词是一般意义上使用的

    字典图片:表格


两种类型的控件

  1. 表单控件

  2. ActiveX控件

两者的外观,行为和控制类似,但不完全相同。 (在这里列出。)

例如,让我们比较两种组合框。 在某些编程语言中,可比较的控件被称为“下拉菜单”“下拉列表” 。 在Excel中,我们有一个表单控件组合框和一个ActiveX控件组合框

0 (点击图片放大。)

“默认名称”适用于手动创建的控件。 以编程方式创建的控件没有(或不需要)默认名称,因此应在创建后立即分配一个默认名称。


0

(来源:我的回答)


关于ActiveX控件和相关的安全问题

ActiveX控件是VBA工具箱的扩展 您可以像使用任何标准内置控件一样使用ActiveX控件,例如CheckBox控件。 当您将ActiveX控件添加到应用程序时,它成为开发和运行时环境的一部分,并为您的应用程序提供新功能。

  • ActiveX控件被实现为可在任何OLE容器中使用的进程内服务器(通常是小对象)。 请注意,仅当在旨在了解ActiveX控件的OLE容器中使用ActiveX控件的全部功能时,才可用。

  • 这种容器类型称为控件容器控件对象,可以使用控件的属性和方法来操作ActiveX控件,并以事件的形式接收来自ActiveX控件的通知。 下图演示了这种交互:

    例子
    资料来源:这个和这个)

也可以看看:

  • 维基百科:ActiveX

  • Symantec.com:ActiveX漏洞的讨论

  • 极客方法:什么是ActiveX控件以及它们为何具有危险性


选项按钮(单选按钮)

在Excel中,两种类型的单选按钮实际上称为“选项按钮” 。 进一步混淆事项:

  • 表单控件的默认名称为OptionButton1

  • ActiveX控件的默认名称是“ Option Button 1

区分它们的一个好方法是打开控件的“属性”列表(在“开发”选项卡下的功能区上,或者通过右键单击该控件并选择“ Properties ,或单击F4 ),因为ActiveX控件具有许多更简单形式的选项控制。

通过将选项按钮和复选框放置在共享的“组框”中,可以将它们绑定在一起(因此一次只能从组中选择一个选项)。

选择组框控件,然后在选择要分组的其他每个控件时按住Ctrl 。 右键单击组框控件,然后选择GroupingGroup

下面的前两个链接是用于处理每种类型的选项按钮的独立指令集。


处理控制事件:

表单控制事件(仅限Click事件)

表单控制事件只能响应一个事件: Click事件。 (更多信息在这里。)请注意,本节不适用于用户窗体,因为它们仅使用ActiveX控件。

要为Click事件添加过程,请执行以下操作:

  • 右键单击该控件,然后选择“ Assign Macro...

  • 在“分配宏”对话框中:

    • 选择一个现有过程,然后单击“确定”或者,

    • 通过单击“新建...”在VBE中创建一个新过程,或者,

    • 通过单击“记录...”记录新的宏,或者,

    • 要删除分配的事件,请从“ Macro Name字段中删除其名称,然后单击“确定”

    0 (点击图片放大。)

要重命名,编辑或删除现有的宏,请按Alt + F8打开“ Macro界面:

宏对话框


ActiveX控件事件

ActiveX控件具有可设置为响应的事件的更广泛的列表

要将事件分配给ActiveX控件,请右键单击该控件,然后选择View Code 。 在VBE中,您可以粘贴代码,或从VBE窗口右上方的下拉列表中选择特定事件

0 (点击图片放大。)

在用户窗体上控制事件处理:

事件也可以在用户窗体的控件中使用。 由于只能将ActiveX控件放置在用户窗体中,因此需要进行“更多编码+更多功能”的权衡。

ActiveX控件添加到用户窗体的方式与添加到工作表的方式相同。 请记住,在控件所覆盖的任何区域中,分配给用户窗体本身(即背景)的任何事件都将被“阻止”,因此您可能需要为控件和用户窗体分配相同的事件。

例如,为了使此用户窗体对窗体上任何位置的MouseMove做出响应,将相同的事件代码应用于该用户窗体,文本框,选项按钮和框架

0


VBA示例

使用VBA添加/修改/删除表单控件选项按钮:

Sub formControl_add()
    'create form control
    Dim ws As Worksheet: Set ws = ActiveSheet
    With ws.Shapes.AddFormControl(xlOptionButton, 25, 25, 100, 100)
        .Name = "cOptionButton1"  'name control immediately (so we can find it later)
    End With
End Sub

Sub formControl_modify()
    'modify form control's properties
    Dim ws As Worksheet: Set ws = ActiveSheet
    ws.Shapes("cOptionButton1").Select
    With Selection 'shapes must be Selected before changing
        .Characters.Text = "wxyzabcd"
   End With
End Sub

Sub formControl_delete()
    'delete form control
    Dim ws As Worksheet: Set ws = ActiveSheet
    ws.Shapes("cOptionButton1").Delete
End Sub
  • Shapes.AddShape方法(Excel)

  • 形状属性(Excel)

  • 字符对象(Excel)


使用VBA添加/修改/删除ActiveX命令按钮:

Sub activexControl_add()
    'create ActiveX control
    Dim ws As Worksheet: Set ws = ActiveSheet
    With ws.OLEObjects.Add("Forms.CommandButton.1")
        .Left = 25
        .Top = 25
        .Width = 75
        .Height = 75
        .Name = "xCommandButton1" 'name control immediately (so we can find it later)
    End With
End Sub

Sub activexControl_modify()
    ' modify activeX control's properties
    Dim ws As Worksheet: Set ws = ActiveSheet
    With ws.OLEObjects("xCommandButton1").Object
        .Caption = "abcxyz"
        .BackColor = vbGreen
    End With
End Sub

Sub activexControl_delete()
    ' delete activeX control
    Dim ws As Worksheet: Set ws = ActiveSheet
    ws.OLEObjects("xCommandButton1").Delete
End Sub
  • OLEObjects.Add方法(Excel)

  • BackColor,ForeColor属性(ActiveX控件)


从窗体控件组合框中添加/删除项目:

Sub ComboBox_addRemoveItems_FormControl()

    Dim ws As Worksheet: Set ws = ActiveSheet

    'add item to form control combo box
    ActiveWorkbook.Sheets("Sheet1").Shapes("Drop Down 1").ControlFormat.AddItem "abcd"

    'remove all items from from form control combo bo
    ActiveWorkbook.Sheets("Sheet1").Shapes("Drop Down 1").ControlFormat.RemoveAllItems

End Sub  

从ActiveX组合框中添加/删除项目:

Sub ComboBox_addRemoveItems_ActiveXControl()

    Dim ws As Worksheet: Set ws = ActiveSheet

    'add items to ActiveX combo box
    ActiveWorkbook.Sheets("Sheet1").ComboBox1.AddItem "abcd"

    'remove all items from ActiveX combo box
    ActiveWorkbook.Sheets("Sheet1").ComboBox1.Clear

End Sub  

更多信息:

  • Office.com:添加复选框或选项按钮(表单控件)

  • Office.com:添加复选框,选项按钮或切换按钮(ActiveX控件)

  • Office.com:工作表上的表单,表单控件和ActiveX控件概述

  • Office.com:通过选择控件(复选框和列表框)启用选择

  • Office.com:使用数据表单添加,编辑,查找和删除行

  • MSDN:VBA Shape成员

  • MSDN:在工作表上使用ActiveX控件(Office)

  • Exceldemy:如何在Excel中使用表单控件

  • MSDN:在Excel工作表上使用Windows窗体控件(Visual Studio)

  • Microsoft TechNet:Office文档中嵌入的ActiveX控件的行为

标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 在Windows窗体中访问另一个窗体上的控件的最佳方法?(Best way to access a control on another form in Windows Forms?)
    问题 首先,这是一个有关使用Windows窗体的桌面应用程序的问题,而不是ASP.NET问题。 我需要与其他表单上的控件进行交互。 我试图通过使用以下方式访问控件: otherForm.Controls["nameOfControl"].Visible = false; 它不能按我期望的方式工作。 我最终从Main抛出了一个异常。 但是,如果我将控件设为public而不是private ,则可以直接访问它们,因此... otherForm.nameOfControl.Visible = false; 但这是最好的方法吗? 以其他形式public控制是否被视为“最佳实践”? 是否存在“更好”的方式来访问其他表单上的控件? 进一步说明: 这实际上是对我提出的另一个问题的一种补充,这是在C#中创建“树视图首选项对话框”类型的接口的最佳方法? 。 我得到的答案很好,并且解决了我在保持UI直截了当且易于在运行时和设计时使用的组织方面遇到的许多组织问题。 但是,它确实提出了一个容易控制接口其他方面的棘手问题。 基本上,我有一个根表单,它实例化了许多其他表单,这些其他表单都位于该根表单的面板中。 因此,例如,这些子窗体之一上的单选按钮可能需要更改主根窗体上的状态条图标的状态。 在这种情况下,我需要子窗体与父(根)窗体的状态栏中的控件进行对话。 (我希望这是有道理的,而不是以“谁在第一”的方式。)
  • WinForm UI验证(WinForm UI Validation)
    问题 我需要在整个Winform应用程序中实施输入验证。 有许多不同的形式可以输入数据,我不想通过表单逐个控制地创建每个项目的isValid等。 别人如何处理呢? 我看到大多数相关文章都涉及Web Apps,并且/或者提到了Enterprise Library Validation Application Block。 现在,我承认我还没有对ELVAB进行彻底的研究,但是对于我所需要的东西似乎有些过头了。 我目前的想法是编写具有各种要求的类库,并将控件作为参数传递给它。 我已经有一个RegEx函数库,用于处理isValidZipCode之类的东西,因此这可能是我开始的地方。 我想要的是一个验证按钮,该按钮onClick循环浏览该表单页面上的所有控件并执行所需的验证。 我怎样才能做到这一点? 回答1 在我自己的应用程序中,我需要在输入维度时对其进行验证。我使用的顺序如下 用户选择或键入,然后离开控件。 控件失去焦点,并通知View发送其ID和条目文本。 视图检查哪个Shape程序(实现接口的类)创建了Form,并向其传递ID和输入文本 Shape程序返回一个响应。 如果“响应”正确,则视图将更新形状类的正确条目。 如果响应是正确的,则视图通过界面告诉表单可以将焦点转移到下一个条目。 如果“响应”不正确,则视图将查看响应,并使用“表单界面”告知表单要执行的操作。
  • Excel:难以置信的收缩和扩展控件(Excel: the Incredible Shrinking and Expanding Controls [closed])
    问题 关闭。 此问题不符合堆栈溢出准则。 它当前不接受答案。 想要改善这个问题吗? 更新问题,使它成为Stack Overflow的主题。 4个月前关闭。 改善这个问题 有时,我会遇到一个电子表格,该电子表格会受到魔术按钮或列表框的影响,这些按钮或列表框会随着时间的推移而变大或变小。 代码中没有任何指令。 有人有过这种快乐吗? 回答1 该问题似乎与Windows在监视器上处理非本机分辨率的方式有关,可以通过多种方式避免 当问题发生时,它可能是一个完全的噩梦,但它只是间歇性地发生。 我们最近一直在测试由几十个人使用的excel工作表,并且已经对原因进行了很好的了解,并提出了一些可能的解决方案。 原因似乎与在屏幕以其原始分辨率以外的方式使用屏幕的任何设置有关。 如果用户将外接显示器插入笔记本电脑而没有仔细选择最终的屏幕配置,则很容易发生这种情况。 例如,如果将一台笔记本电脑插入投影仪(也许是一台具有本机1024 x 768显示屏的旧笔记本电脑),但笔记本电脑是1280 x 800的笔记本电脑,并且用户选择复制该显示屏而不是扩展它(“连接到”中的设置Windows 7中的“投影机”或“显示”控制面板),结果是两个屏幕上的非自然分辨率的图像都是无法预测的,通常效果也不理想。 我们发现这些设置几乎总是会导致Excel按钮(尤其是ActiveX控件)出现严重问题。 有时,在重复单击时
  • Winforms问题-创建窗口句柄时出错[重复](Winforms issue - Error creating window handle [duplicate])
    问题 这个问题已经在这里有了答案: “创建窗口句柄时出错” (9个答案) 8年前关闭。 我们在Winform应用程序中看到此错误。 任何人都可以帮助您解释为什么会看到此错误,更重要的是如何解决或避免发生此错误。 System.ComponentModel.Win32Exception: Error creating window handle. at System.Windows.Forms.NativeWindow.CreateHandle(CreateParams cp) at System.Windows.Forms.Control.CreateHandle() at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible) at System.Windows.Forms.Control.CreateControl() at System.Windows.Forms.Control.OnVisibleChanged(EventArgs e) at System.Windows.Forms.ButtonBase.OnVisibleChanged(EventArgs e) 回答1 您是否已运行Process Explorer或Windows Task Manager来查看GDI对象,句柄
  • 如何访问Access中的选定行?(How do I access the selected rows in Access?)
    问题 我有一个包含数据表的表格。 我想让用户可以选择多个行,单击一个按钮,然后运行一些sql查询并在这些行上执行一些工作。 查看我的VBA代码,我看到如何使用CurrentRecord属性访问最后选择的记录。 但是我看不到如何知道在多重选择中选择了哪些行。 (我希望我清楚...) 这样做的标准方法是什么? Access VBA文档在网络上有些晦涩难懂... 谢谢! 回答1 这是执行此操作的代码,但有一个要注意的地方。 Private Sub Command1_Click() Dim i As Long Dim RS As Recordset Dim F As Form Set F = Me.sf.Form Set RS = F.RecordsetClone If F.SelHeight = 0 Then Exit Sub ' Move to the first selected record. RS.Move F.SelTop - 1 For i = 1 To F.SelHeight MsgBox RS![myfield] RS.MoveNext Next i End Sub 这里有个要注意的地方:如果将代码添加到按钮,则用户单击该按钮后,所选内容就会在网格中丢失(selheight将为零)。 因此,您需要捕获该信息,并使用计时器或表单上的其他事件将其保存到模块级别的变量中。
  • 如何知道用户单击了“ X”或“关闭”按钮?(How to know user has clicked “X” or the “Close” button?)
    问题 在MSDN中,我发现CloseReason.UserClosing知道用户已决定关闭表单,但是我想单击X按钮或单击关闭按钮都一样。 那么如何在我的代码中区分这两者呢? 谢谢大家 回答1 假设您要使用WinForms,则可以使用FormClosing()事件。 每当关闭表单时都会触发FormClosing()事件。 要检测用户是否单击了X或您的CloseButton,可以通过sender对象获得它。 尝试将发送方转换为Button控件,例如,验证其名称为“ CloseButton”。 private void Form1_FormClosing(object sender, FormClosingEventArgs e) { if (string.Equals((sender as Button).Name, @"CloseButton")) // Do something proper to CloseButton. else // Then assume that X has been clicked and act accordingly. } 否则,我永远不需要区分是单击X还是单击CloseButton,因为我想对FormClosing事件执行特定的操作,例如在关闭MDIContainerForm之前关闭所有MdiChildren,或者对未保存的更改进行事件检查。
  • 在C#中的两个Windows窗体之间进行通信(Communicate between two windows forms in C#)
    问题 我有两种形式,一种是主要形式,另一种是选择形式。 例如,假设用户在主窗体上单击我的菜单: Tools -> Options ,这将导致显示我的选项窗体。 我的问题是如何将选项表单中的数据发送回主表单? 我知道我可以使用属性,但是我有很多选择,这似乎是一件乏味的事情。 那么最好的方法是什么? 回答1 Form1触发Form2打开。 Form2具有重载的构造函数,该构造函数以调用form作为参数并将其引用提供给Form2成员。 这样解决了通信问题。 例如,我在Form1中公开了Label属性为公共属性,而在Form2中对其进行了修改。 使用这种方法,您可以以不同的方式进行交流。 样本项目的下载链接 //您的Form1 public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Form2 frm = new Form2(this); frm.Show(); } public string LabelText { get { return Lbl.Text; } set { Lbl.Text = value; } } } //您的Form2 public partial
  • 如何诊断MS访问崩溃(How to diagnose MS access crashes)
    问题 我们有一个用Access编写的自定义程序,其中包含奇数崩溃。 我们添加了错误处理功能,该功能可以记录和通过电子邮件发送在我们自己的代码内部发生的任何崩溃,并允许我们修复所生成的大多数错误,但是有时崩溃在我们的代码外部发生。 我们发现一个示例,该示例在2013年出现了新问题-我们的表单在编辑特定字段中的数据后会崩溃-新条目很好,但创建记录后进行的任何编辑都会导致完全崩溃,关闭MS Access。 我们花了一些时间,最终发现我们的某些代码迫使表格移至下一条记录,尽管此字段是行中的最后一个字段,所以Access本身也试图移至下一条记录。 自2007年以来一直存在于系统中,但在2013年开始导致程序关闭。 有什么办法可以捕获和诊断MS Access内部程序级别的崩溃? Windows事件查看器仅显示以下内容: 错误的应用程序名称:MSACCESS.EXE,版本:15.0.4454.1501,时间戳:0x50a35ef4错误的模块名称:MSACCESS.EXE,版本:15.0.4454.1501,时间戳:0x50a35ef4异常代码:0xc0000005错误的偏移量:0x00116452错误的进程ID:0x1398错误应用程序开始时间:0x01ce6e665043d8be错误的应用程序路径:C:\ Program Files(x86)\ Microsoft Office \
  • 将事件处理程序分配给在VBA中动态创建的用户窗体上的控件(Assign event handlers to controls on user form created dynamically in VBA)
    问题 我在Internet上发现了许多资源,这些资源可以完成我想做的事情,但不是我的工作。 对于dayList中的每一天,我想在用户表单上创建一个按钮来运行当天的宏。 我能够动态添加按钮,但不知道如何将daycell.text从命名范围传递到按钮,事件处理程序和宏:S这里,我必须创建用户表单的代码: Sub addLabel() ReadingsLauncher.Show vbModeless Dim theLabel As Object Dim labelCounter As Long Dim daycell As Range Dim btn As CommandButton Dim btnCaption As String For Each daycell In Range("daylist") btnCaption = daycell.Text Set theLabel = ReadingsLauncher.Controls.Add("Forms.Label.1", btnCaption, True) With theLabel .Caption = btnCaption .Left = 10 .Width = 50 .Top = 20 * labelCounter End With Set btn = ReadingsLauncher.Controls.Add("Forms
  • 创建新的GUI时,WPF是Windows窗体的首选吗? [关闭](When creating a new GUI, is WPF the preferred choice over Windows Forms? [closed])
    问题 从目前的情况来看,这个问题不适合我们的问答形式。 我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意测验或进一步的讨论。 如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 9年前关闭。 已锁定。 该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。 它目前不接受新的答案或互动。 Windows窗体的大多数限制和技巧对大多数程序员来说都是常见的。 但是从.NET 3.0开始,Windows Presentation Foundation也提供了WPF。 据说您可以使用它使“性感的应用程序”更容易,并且使用.NET 3.5 SP1可以大大提高执行速度。 但是另一方面,WPF的许多工作也有所不同。 我不会说这比较困难,但是您必须从头开始学习“一切”。 我的问题:当您必须创建一个新的GUI并且项目没有时间压力时,花这些额外的时间值得吗? 回答1 WPF使您能够做一些令人惊奇的事情,而我喜欢它……但是,每当开发人员问我是否认为他们应该转向新技术时,我总是有义务限制我的建议。 您的开发人员是否愿意(最好是EAGER)花费时间学习有效使用WPF? 我从没想过要对MFC,Windows Forms甚至是不受管理的DirectX这么说,但是您可能不希望团队在正常开发过程中尝试“挑选” WPF。 循环运输产品!
  • 设置Form.KeyPreview = true的缺点?(Disadvantage of setting Form.KeyPreview = true?)
    问题 我想知道Form.KeyPreview属性实际上有什么用? 为什么存在它,将它设置为true会给我带来什么“风险”? 我猜它一定有一些负面影响-否则它根本不应该存在(或者至少在默认情况下是真实的)? 编辑:我完全知道它做什么。 我在问为什么。 为什么必须将其设置为true才能触发键盘事件? 为什么键盘事件不总是针对表单触发。 这不仅是标准行为吗? 我问的特殊原因是:我刚刚在我的应用程序的基本形式中设置了KeyPreview = true,所有其他形式都继承自该形式。 我有什么讨厌的惊喜吗? 回答1 Form.KeyPreview有点过时,它是从Visual Basic对象模型继承来进行表单设计的。 在VB6时代,您需要KeyPreview才能实现快捷键。 Windows窗体中不再需要此方法,重写ProcessCmdKey()是更好的解决方案: protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { if (keyData == (Keys.Control | Keys.F)) { DoSomething(); // Implement the Ctrl+F short-cut keystroke return true; // This keystroke was handled, don
  • 创建新的GUI时,WPF是Windows窗体的首选吗? [关闭](When creating a new GUI, is WPF the preferred choice over Windows Forms? [closed])
    问题 从目前的情况来看,这个问题不适合我们的问答形式。 我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意测验或进一步的讨论。 如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 9年前关闭。 已锁定。 该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。 它目前不接受新的答案或互动。 Windows窗体的大多数限制和技巧对大多数程序员来说都是常见的。 但是从.NET 3.0开始,Windows Presentation Foundation也提供了WPF。 据说您可以使用它使“性感的应用程序”更容易,并且使用.NET 3.5 SP1可以大大提高执行速度。 但是另一方面,WPF的许多工作也有所不同。 我不会说这比较困难,但是您必须从头开始学习“一切”。 我的问题:当您必须创建一个新的GUI并且项目没有时间压力时,花这些额外的时间值得吗? 回答1 WPF使您能够做一些令人惊奇的事情,而我喜欢它……但是,每当开发人员问我是否认为他们应该转向新技术时,我总是有义务限制我的建议。 您的开发人员是否愿意(最好是EAGER)花费时间学习有效使用WPF? 我从没想过要对MFC,Windows Forms甚至是不受管理的DirectX这么说,但是您可能不希望团队在正常开发过程中尝试“挑选” WPF。 循环运输产品!
  • 如何编写自动缩放为系统字体和dpi设置的WinForms代码?(How to write WinForms code that auto-scales to system font and dpi settings?)
    问题 简介:有很多评论说“ WinForms不能很好地自动缩放到DPI /字体设置;切换到WPF”。 但是,我认为它基于.NET 1.1。 看来他们实际上在.NET 2.0中实现自动缩放方面做得很好。 至少根据我们到目前为止的研究和测试。 但是,如果你们当中的某些人知道得更多,我们很乐意听取您的意见。 (请不要打扰我们应该切换到WPF ...这不是当前的选择。) 问题: WinForms中的哪些内容不能正确自动缩放,因此应避免? 程序员在编写WinForms代码时应遵循哪些设计准则,以使其能够很好地自动缩放? 到目前为止,我们已经确定的设计准则: 请参阅下面的社区Wiki答案。 那些不正确或不足吗? 我们还应该采用其他准则吗? 还有其他需要避免的模式吗? 任何其他对此的指导将不胜感激。 回答1 不支持正确缩放的控件: 具有AutoSize = False Label ,并且继承了Font 。 在控件上明确设置Font ,使其在“属性”窗口中以粗体显示。 ListView列的宽度不能缩放。 重写窗体的ScaleControl来代替它。 看到这个答案 SplitContainer的Panel1MinSize , Panel2MinSize和SplitterDistance属性具有MultiLine = True TextBox和Font继承。 在控件上明确设置Font ,使其在“属性
  • 【Qt】Qt学习笔记(更新中)
    文章目录 0x00 前言0x01 Qt简介1.1 Qt是什么1.2 Qt发展史1.3 Qt支持的平台1.4 使用Qt开发的软件1.5 Qt的优点1.6 其它 0x02 创建Qt项目2.1 使用向导新建一个简单的Qt程序2.2 pro文件2.3 一个简单的qt程序1.按钮的创建2.对象模型(对象树)1)QObject2)QWidget3)对象树的意义 3.Qt窗口坐标系 0x03 Qt4版本的信号和槽机制3.1系统自带信号和槽1.概念2.一个信号和槽的例子 3.2 Lambda表达式 0x04 QMainWindow4.1 菜单栏(menu bar)4.2 工具栏(tool bars)4.3 状态栏(status bar)4.4 铆接部件(dock widgets)4.5 中心部件(central widget)4.6 添加资源文件 0x05 对话框QDialog5.1模态对话框与非模态对话框5.2 消息对话框 0x06 界面布局0x07 控件1.1标准控件1.2 自定义控件封装 0x08 Qt消息机制1.1 事件1.2 定时器 参考文档 0x00 前言 本文档为个人边学习边记录的Qt笔记,非教程。虽然在记录时会尽量保证笔记的准确性,但是有些知识点小结为当时的体会与理解,可能并不准确,会有出现内容存在舛误或遗漏的地方,仅供参考。 另外笔记中会存在引用他人文章内容的部分
  • 如何解决用户控件中的闪烁(How to fix the flickering in User controls)
    问题 在我的应用程序中,我不断地从一个控件转移到另一个控件。 我没有创建。 用户控件,但在导航过程中我的控件会闪烁。 更新需要1或2秒。 我试图设置这个 SetStyle(ControlStyles.OptimizedDoubleBuffer, true); or SetStyle(ControlStyles.UserPaint, true); SetStyle(ControlStyles.AllPaintingInWmPaint, true); SetStyle(ControlStyles.DoubleBuffer, true); 但这无济于事...每个控件都有相同的背景图像,但控件却不同。 那么什么是解决方案。 谢谢。 回答1 这不是双缓冲可以解决的那种闪烁。 也没有BeginUpdate或SuspendLayout。 你有太多的控制,和backgroundImage可以使它变得更糟。 它在UserControl绘制自身时开始。 它绘制BackgroundImage,在子控件窗口所在的位置留下孔。 然后,每个子控件都会获得一条消息以对其进行绘制,然后将其窗口内容填充到孔中。 当您有很多控件时,这些孔在一段时间内对用户可见。 它们通常是白色的,与黑暗时的BackgroundImage形成鲜明对比。 或者,如果表单设置了Opacity或TransparencyKey属性
  • event.preventDefault()与返回false(无jQuery)(event.preventDefault() vs. return false (no jQuery))
    问题 我想知道event.preventDefault()和return false是否相同。 我做了一些测试,看来 例如,如果事件处理程序是使用旧模型添加的elem.onclick = function(){ return false; }; 然后, return false阻止默认操作,例如event.preventDefault() 。 例如,如果事件处理程序是使用addEventListener添加的elem.addEventListener( 'click', function(e){ return false; }, false ); 然后, return false不会阻止默认操作。 所有浏览器的行为都一样吗? event.preventDefault()和return false之间还有更多区别吗? 在某些情况下,在哪里可以找到一些有关return false行为的文档(我在MDN中找不到event.preventDefault() ? 我的问题只是关于普通的javascript,而不是jQuery,因此即使两个问题的标题几乎相同,也请不要将其标记为event.preventDefault()与return false的重复。 回答1 1.3.1中的W3C文档对象模型事件规范。 事件注册接口指出,EventListener中的handleEvent没有返回值:
  • ListBoxItem中的复杂UI(Complex UI inside ListBoxItem)
    问题 在WPF中,我可以通过为ListBox提供ItemTemplate来将任何UI添加到ListBoxItem : <ListBox ItemsSource="{Binding}"> <ListBox.ItemTemplate> <DataTemplate> <Border BorderThickness="1" BorderBrush="Gray" CornerRadius="8" Padding="4,0,4,0"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="50"/> <ColumnDefinition/> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition/> <RowDefinition/> <RowDefinition/> </Grid.RowDefinitions> <CheckBox Grid.Column="1" Content="Is Active Customer" IsChecked="{Binding IsActive}"/> <Label Content="Id:" Grid.Row="1" HorizontalAlignment="Right"/> <Label Content="Name:" Grid
  • 验证用户输入/赋予.NET控件状态为OK或NOK(Validating user input / Give .NET controls status OK or NOK)
    问题 我正在考虑验证用户输入的最佳方法。 让我们想象一些TextBoxes,CheckBoxes或任何您喜欢的.NET控件,其中用户输入必须经过验证为OK或NOK。 一旦用户填写了所有必填字段,他就会通过按钮提交。 现在,我必须知道先前确认哪些字段为OK,哪些字段为NOK。 到目前为止,我一直通过为每个控件声明一个全局布尔变量来处理这种情况,以告诉我。 但是我不喜欢 我敢肯定,肯定还有另一种方法! 我想做的是使用OK或NOK属性(称为status或类似属性)扩展这些.NET控件。 你能做到吗? 如果是这样,您该怎么做? 这样的东西已经存在了吗? 谢谢您的答复! 回答1 您在Windows窗体中具有一些有用的工具来执行验证和显示错误消息,包括: IDataErrorInfo接口验证控件事件 ErrorProvider组件表单的ValidateChildren方法和Aut​​oValidate属性 使用以上选项: 使用数据绑定对类进行建模时,可以执行验证。 不使用数据绑定时,可以执行验证。 您可以在处于无效状态的控件附近显示错误消息和错误图标。 您可以决定防止焦点更改来自无效控件或让焦点更改。 您可以显示表单的验证摘要。 您还可以在Windows窗体中应用DataAnnotations验证 IDataErrorInfo接口 如果您有一些模型类
  • 在Android WebView中启用/禁用缩放(enable/disable zoom in Android WebView)
    问题 WebSettings中有一些与缩放有关的方法: WebSettings.setSupportZoom WebSettings.setBuiltInZoomControls 我注意到它们在某些设备上的工作方式有所不同。 例如,在我的Galaxy S上,默认情况下启用缩放功能,但在LG P500上则禁用该功能(现在,我不知道如何仅启用缩放功能,但隐藏缩放按钮)。 在P500上,当我调用setBuiltInZoomControls(true)这两种变体都可以工作(多点触摸和按钮)。 如何在LG P500等设备上启用多点触控缩放并禁用缩放按钮? (另外,我知道在HTC设备上存在相同的问题) 更新:这几乎是该解决方案的完整代码 if (ev.getAction() == MotionEvent.ACTION_DOWN || ev.getAction() == MotionEvent.ACTION_POINTER_DOWN || ev.getAction() == MotionEvent.ACTION_POINTER_1_DOWN || ev.getAction() == MotionEvent.ACTION_POINTER_2_DOWN || ev.getAction() == MotionEvent.ACTION_POINTER_3_DOWN) { if
  • 使用Windows窗体在按钮上显示工具提示(Display a tooltip over a button using Windows Forms)
    问题 如何使用Windows窗体在按钮上显示工具提示? 回答1 ToolTip是单个WinForms控件,用于处理在单个表单上显示多个元素的工具提示。 假设您的按钮称为MyButton。 将一个工具提示控件(在Windows窗体工具箱中的“通用控件”下)添加到您的窗体中。 给它起个名字-说MyToolTip 将MyButton的“在MyToolTip上的工具提示”属性(在按钮属性网格中的“杂项”下)设置为将鼠标悬停在其上时应显示的文本。 当光标悬停在按钮上时,工具提示将自动出现,但是如果您需要以编程方式显示它,请调用 MyToolTip.Show("Tooltip text goes here", MyButton); 在您的代码中显示工具提示,以及 MyToolTip.Hide(MyButton); 使它再次消失。 回答2 使用表单设计器: 将“工具提示”控件从“工具箱”拖到窗体上。 选择要在其上显示工具提示的控件的属性。 找到属性“ toolTip1上的ToolTip”(如果更改了默认名称,则名称可能不是toolTip1)。 将属性的文本设置为要显示的工具提示文本。 您还可以使用以下调用以编程方式设置工具提示: this.toolTip1.SetToolTip(this.targetControl, "My Tool Tip"); 回答3 您可以使用ToolTip类: