在 .NET Winforms 应用程序中创建图像按钮

2024-01-05

我正在尝试在 Visual Studio 2010 的 .NET 4.0 Winforms 应用程序中创建一个按钮,该按钮只是一个图像。我有一个无边框的窗口,并有一个背景图像来构成该应用程序的自定义皮肤。对于窗口右上角的关闭/最小化按钮,我想创建 2 个简单的按钮,它们只是图像,看起来像典型的 Windows 关闭/最小化按钮。

我的设计可能是错误的,所以如果我错了,请告诉我。到目前为止,我已经确定需要为仅呈现图像的 Button 创建一个子类。最终的实现需要为每个按钮状态(正常、悬停、单击等)渲染不同的图像。这是我到目前为止所拥有的:

public class ImageButton : Button
{
    Pen pen = new Pen( Color.Red, 1.0f );

    public ImageButton()
    {
        SetClientSizeCore( BackgroundImage.Width, BackgroundImage.Height );
    }

    protected override void OnPaint( PaintEventArgs e )
    {
        e.Graphics.DrawImage( BackgroundImage, 0, 0 );
        //e.Graphics.DrawRectangle( pen, ClientRectangle );
        //Rectangle bounds = new Rectangle( 0, 0, Width, Height );
        //ButtonRenderer.DrawButton( e.Graphics, bounds, PushButtonState.Normal );
        //base.OnPaint(pevent);
    }

    protected override void OnPaintBackground( PaintEventArgs e )
    {
        // Do nothing
    }
}

此时,假设这种设计是合适的,我需要知道如何适当地调用 SetClientSizeCore()。在构造函数中调用它会引发异常。我认为这是因为控件还没有机会初始化。我不确定要重写什么函数来允许我在 .NET 初始化图像后更改按钮的大小以适合图像。对此有什么想法吗?


在构造函数中,BackgroundImage is null.

需要设置尺寸时BackgroundImage通过覆盖属性来更改。

您还应该阴影Size属性并添加[DesignerSerializationVisibilty(DesignerSerializationVisibility.Hidden)]防止设计师保存尺寸。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 .NET Winforms 应用程序中创建图像按钮 的相关文章

  • FFMPEG Seeking 带来音频伪影

    我正在使用 ffmpeg 实现音频解码器 在读取音频甚至搜索已经可以工作时 我无法找到一种在搜索后清除缓冲区的方法 因此当应用程序在搜索后立即开始读取音频时 我没有任何工件 avcodec flush buffers似乎对内部缓冲区没有任何
  • C# 中值类型和引用类型有什么区别? [复制]

    这个问题在这里已经有答案了 我知道一些差异 值类型存储在堆栈上 而引用类型存储在托管堆上 值类型变量直接包含它们的值 而引用变量仅包含对托管堆上创建的对象位置的引用 我错过了任何其他区别吗 如果是的话 它们是什么 请阅读 堆栈是一个实现细节
  • 使用 C# 在 WinRT 中获取可用磁盘空间

    DllImport kernel32 dll SetLastError true static extern bool GetDiskFreeSpaceEx string lpDirectoryName out ulong lpFreeBy
  • 使用 Google Analytics API 在 C# 中显示信息

    我一整天都在寻找一个好的解决方案 但谷歌发展得太快了 我找不到有效的解决方案 我想做的是 我有一个 Web 应用程序 它有一个管理部分 用户需要登录才能查看信息 在本节中 我想显示来自 GA 的一些数据 例如某些特定网址的综合浏览量 因为我
  • c 中的错误:声明隐藏了全局范围内的变量

    当我尝试编译以下代码时 我收到此错误消息 错误 声明隐藏了全局范围内的变量 无效迭代器 节点 根 我不明白我到底在哪里隐藏或隐藏了之前声明的全局变量 我怎样才能解决这个问题 typedef node typedef struct node
  • C# 用数组封送结构体

    假设我有一个类似于 public struct MyStruct public float a 我想用一些自定义数组大小实例化一个这样的结构 在本例中假设为 2 然后我将其封送到字节数组中 MyStruct s new MyStruct s
  • 基于范围的 for 循环中的未命名循环变量?

    有没有什么方法可以不在基于范围的 for 循环中 使用 循环变量 同时也避免编译器发出有关未使用它的警告 对于上下文 我正在尝试执行以下操作 我启用了 将警告视为错误 并且我不想进行像通过在某处毫无意义地提及变量来强制 使用 变量这样的黑客
  • 为什么模板不能位于外部“C”块内?

    这是一个后续问题一个答案 https stackoverflow com questions 4866433 is it possible to typedef a pointer to extern c function type wit
  • 使用安全函数在 C 中将字符串添加到字符串

    我想将文件名复制到字符串并附加 cpt 但我无法使用安全函数 strcat s 来做到这一点 错误 字符串不是空终止的 我确实设置了 0 如何使用安全函数修复此问题 size strlen locatie size nieuw char m
  • Windows 窗体不会在调试模式下显示

    我最近升级到 VS 2012 我有一组在 VS 2010 中编码的 UI 测试 我试图在 VS 2012 中启动它们 我有一个 Windows 窗体 在开始时显示使用 AssemblyInitialize 属性运行测试 我使用此表单允许用户
  • 如何在 Team Foundation 上强制发表有意义的签入评论?

    我有一个开发团队有一个坏习惯 他们写道poor签入评论 当我们必须在团队基础上查看文件的历史记录时 这使得它成为一场噩梦 我已经启用了变更集评论政策 这样他们甚至可以在签到时留下评论 否则他们不会 我们就团队的工作质量进行了一些讨论 他们很
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • Windows 10 中 Qt 桌面应用程序的缩放不当

    我正在为 Windows 10 编写一个简单的 Qt Widgets Gui 应用程序 我使用的是 Qt 5 6 0 beta 版本 我遇到的问题是它根本无法缩放到我的 Surfacebook 的屏幕上 这有点难以判断 因为 SO 缩放了图
  • .NET 选项将视频文件流式传输为网络摄像头图像

    我有兴趣开发一个应用程序 它允许我从 xml 构建视频列表 包含视频标题 持续时间等 并将该列表作为我的网络摄像头流播放 这意味着 如果我要访问 ustream tv 或在实时通讯软件上激活我的网络摄像头 我的视频播放列表将注册为我的活动网
  • EPPlus Excel 更改单元格颜色

    我正在尝试将给定单元格的颜色设置为另一个单元格的颜色 该单元格已在模板中着色 但worksheet Cells row col Style Fill BackgroundColor似乎没有get财产 是否可以做到这一点 或者我是否必须在互联
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • GDK3/GTK3窗口更新的精确定时

    我有一个使用 GTK 用 C 语言编写的应用程序 尽管该语言对于这个问题可能并不重要 这个应用程序有全屏gtk window与单个gtk drawing area 对于绘图区域 我已经通过注册了一个刻度回调gtk widget add ti
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • 窗体最大化时自动缩放子控件

    有没有办法在最大化屏幕或更改分辨率时使 Windows 窗体上的所有内容自动缩放 我发现手动缩放它是正确的 但是当切换分辨率时我每次都必须更改它 this AutoScaleDimensions new System Drawing Siz
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但

随机推荐

  • Firebase 数据库迁移

    来自 SQL 背景 我想知道如何在 Firebase 中进行数据库迁移 假设我在 firebase 中有以下数据 dateFrom 2015 11 11 timeFrom 09 00 现在前端客户端将以以下形式存储和期望数据 dateTim
  • 使用参数将表单提交到操作,Asp.Net.Core Mvc

    我正在尝试通过 ajax 在 asp net core 中提交排序下拉表单 操作还有其他参数 我也想执行这些参数 但表单不提交其他参数 我认为主要问题是剃须刀的形状部分 这是我行动的一部分 public IActionResult Prod
  • 可以在没有 UIWebView 的情况下运行 javascript 吗?

    是否可以运行一些 javascript 代码 也许有一个NSString作为输入 而不使用UIWebView 我想在单独的线程中运行此代码 因此 UIWebView 是不可能的 并且我真的不想渲染任何内容 只需返回结果即可 我没有尝试过 但
  • 如何从 OpenGL ES 中渲染的纹理读取像素

    我正在尝试从即时生成的纹理 RTT 渲染到纹理 中读取像素 我通过实施 Apple 建议的方法来拍摄此快照here http developer apple com library ios qa qa1704 index html 这对于呈
  • Java推断类型化HashSet的错误类型[重复]

    这个问题在这里已经有答案了 可能的重复 调用 TreeSet contains Long valueOf someLongValue 时出现 ClassCastException https stackoverflow com questi
  • Django settings.py 错误:不支持按文件名导入

    我在虚拟环境中运行 Django 使用 virtualenv 并且尝试添加自定义开发环境设置文件以在开发时简化应用程序配置 我的计划是用两行代码来完成此操作 if os environ get DEVELOPMENT None from l
  • 为什么 php rename() 会损坏我的文件?

    我正在使用 plupload 将多个文件上传到我的服务器 使用这个 有一个参数 url upload php upload php 在收到文件时捕获文件 如果文件被分块 可能会重新组合它们 收到完整文件后 它会将响应发送回原始页面 并显示绿
  • 如何测试你的Linux是否支持SSE2

    其实我有2个问题 SSE2兼容性是CPU问题还是编译器问题 如何检查您的CPU或编译器是否支持SSE2 我正在使用 GCC 版本 gcc GCC 4 5 1 当我尝试编译代码时 它给了我这个错误 gcc O3 msse2 fno stric
  • 谷歌浏览器扩展 :: console.log() 来自后台页面?

    如果我打电话console log something 从弹出页面或包含的任何脚本都可以正常工作 但是 由于后台页面不是直接从弹出页面运行 因此它不包含在控制台中 有什么方法可以让我得到console log 在后台页面中显示在弹出页面的控
  • 使用Java从多行字符串中删除空行

    我有一个多行字符串 其他行之间有一些空行 看起来像 def msg AAAAAA BBBBBB CCCCCC DDDDDD EEEEEE TEST FFFFF GGGGGG 我尝试了一些正则表达式 msg msg replaceAll n
  • 对文本文件中的每一行进行排序

    我有一个文本文件 其中每行包含一些单词 例如 stackoverflow coding programming tag question badges 我必须对每一行进行排序并保留行的顺序 例如 对于上面的例子 输出应该是 coding p
  • Azure 门户应用程序设置:“无法加载设置”(ReadOnlyDisabledSubscription)

    在 Azure 门户中 我选择我的 Web 应用程序 然后选择 应用程序设置 它显示以下内容 应用程序设置和连接字符串的错误消息 无法加载设置 我该如何解决 附加信息 与我具有相同权限的另一个用户在访问同一应用程序设置页面时也遇到了此问题
  • 允许弹性项目保持固定宽度并在容器内水平滚动[重复]

    这个问题在这里已经有答案了 我有一位家长正在使用display flex 目前它有四个子卡 卡 但可能有更多 所有的孩子都需要大但相等的宽度 例如 每个孩子都需要一个40 宽度 如果发生这种情况 屏幕上只能容纳一定数量的孩子 我需要能够做到
  • 在 $group 的 mongodb 聚合框架中使用 $regex

    考虑以下示例 db article aggregate group id author docsPerAuthor sum 1 viewsPerAuthor sum pageViews 这按作者字段分组并计算两个字段 我有 author F
  • ServletContext.getRequestDispatcher() 与 ServletRequest.getRequestDispatcher()

    why getRequestDispatcher 字符串路径 的 ServletRequest 接口不能 扩展到当前 servlet 之外 语境 where as getRequestDispatcher 字符串路径 的 ServletCo
  • WinForm 绑定场景中的数据上下文生命周期

    这个问题困扰了我有一段时间了 但我不是专家 这有点长 我有一个带有 Outlook 风格 UI 的 WinForms 应用程序 也就是说 左侧窗格上有一个栏 允许您选择一个 WinForms 控件 屏幕 例如客户屏幕 右侧窗格上将出现一个客
  • 如何将文件名与路径分开? basename() 与 preg_split() 和 array_pop()

    Why use basename 在 PHP 脚本中 如果这个函数实际执行的操作可以写成两行 subFolders preg split ui path explode on or name array pop subFolder extr
  • C# 帮助使用 StreamReader 读取外文字符

    我使用下面的代码来读取包含外来字符的文本文件 该文件采用 ANSI 编码 在记事本中看起来很好 下面的代码不起作用 当读取文件值并在数据网格中显示字符时 字符显示为正方形 其他地方是否还有其他问题 StreamReader reader n
  • 正则表达式仅按最后一个空格字符分割字符串

    希望这应该是一个快速而简单的方法 使用 PHP 我试图将一个字符串拆分为一个数组 但仅通过最后一个空格实例 到目前为止我已经 str hello this is a space arr preg split s str print r ar
  • 在 .NET Winforms 应用程序中创建图像按钮

    我正在尝试在 Visual Studio 2010 的 NET 4 0 Winforms 应用程序中创建一个按钮 该按钮只是一个图像 我有一个无边框的窗口 并有一个背景图像来构成该应用程序的自定义皮肤 对于窗口右上角的关闭 最小化按钮 我想