工作助手VB开发笔记(1)

1.思路

1.1 样式

样式为常驻前台的一个小窗口,小窗口上有三到四个按钮,为一级功能,是当前工作内容的常用功能窗口,有十个二级窗口,为选中窗口时的扩展选项,有若干后台功能,可选中至前台

可最小化至窗口栏,最小化按钮在窗口底部

窗口为无边框

1.2具体功能

1.设置代办

复制一段文本后添加代办

2.复制填表

2.功能细节

1.窗口名称:Me.Text = "工作助手"

2.常驻前台Me.TopMost = True

3.无边框Me.FormBorderStyle = FormBorderStyle.None

4.窗体圆角 

引用:Imports System.Drawing.Drawing2D

    Call 窗体圆角(Me, 20)
    Sub 窗体圆角(form As Form, rgnRadius As Integer)
        Dim bs As GraphicsPath = New GraphicsPath
        bs.AddLine(rgnRadius, 0, Me.Width - rgnRadius * 2, 0)
        bs.AddArc(Me.Width - rgnRadius * 2, 0, rgnRadius * 2, rgnRadius * 2, 270, 90)
        bs.AddLine(Me.Width, rgnRadius, Me.Width, Me.Height - rgnRadius * 2)
        bs.AddArc(Me.Width - rgnRadius * 2, Me.Height - rgnRadius * 2, rgnRadius * 2, rgnRadius * 2, 0, 90)
        bs.AddLine(Me.Width - rgnRadius * 2, Me.Height, rgnRadius, Me.Height)
        bs.AddArc(0, Me.Height - rgnRadius * 2, rgnRadius * 2, rgnRadius * 2, 90, 90)
        bs.AddLine(0, Me.Height - rgnRadius * 2, 0, rgnRadius * 2)
        bs.AddArc(0, 0, rgnRadius * 2, rgnRadius * 2, 180, 90)
        bs.CloseFigure()
        Me.Region = New Region(bs)
    End Sub

可是用画图法制作的窗体圆角有很明显的锯齿,不符合商业化需求

使用双缓冲
默认情况下,标准Windows 窗体控件是双缓冲的。
可以通过两种方法对窗体和所创作的控件启用默认双缓冲。
一种方法是将DoubleBuffered属性设置为true,另一种方法是通过调用SetStyle方法将OptimizedDoubleBuffer标志设置为true。两种方法都将为窗体或控件启用默认双缓冲并提供无闪烁的图形呈现。建议仅对已为其编写所有呈现代码的自定义控件调用SetStyle方法。

Public Sub New()

InitializeComponent()

SetStyle(ControlStyles.UserPaint, True)

SetStyle(ControlStyles.AllPaintingInWmPaint, True)

SetStyle(ControlStyles.OptimizedDoubleBuffer, True)

End Sub

最后尝试了双重绘,但是又出现黑角

Imports System.Drawing.Drawing2D
Imports System.Runtime.InteropServices

Public Class Form1
    Public Sub New()
        ' 此调用是设计器所必需的。
        InitializeComponent()
        SetStyle(ControlStyles.UserPaint, True)
        SetStyle(ControlStyles.AllPaintingInWmPaint, True)
        SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
        Me.Text = "工作助手"
        Me.TopMost = True
        Me.FormBorderStyle = FormBorderStyle.None
        'Call 窗体圆角(Me, 20)

    End Sub
    Protected Overrides Sub OnPaintBackground(e As PaintEventArgs)
        ' 不调用基类的OnPaintBackground,避免背景被画出
    End Sub
    Protected Overrides Sub OnPaint(e As PaintEventArgs)
        Dim g As Graphics = e.Graphics
        g.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
        g.CompositingQuality = Drawing2D.CompositingQuality.HighQuality
        g.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
        '绘制圆角矩形
        Dim rect As New Rectangle(0, 0, Me.Width, Me.Height)
        Dim path As New Drawing2D.GraphicsPath()
        Dim ar As Integer
        ar = 50
        path.AddArc(rect.X, rect.Y, ar, ar, 180, 90)
        path.AddArc(rect.X + rect.Width - ar, rect.Y, ar, ar, 270, 90)
        path.AddArc(rect.X + rect.Width - ar, rect.Y + rect.Height - ar, ar, ar, 0, 90)
        path.AddArc(rect.X, rect.Y + rect.Height - ar, ar, ar, 90, 90)
        path.CloseFigure()
        g.FillPath(Brushes.White, path)
        MyBase.OnPaint(e)
    End Sub

    Sub 窗体圆角(form As Form, rgnRadius As Integer)
        Dim bs As GraphicsPath = New GraphicsPath
        bs.AddLine(rgnRadius, 0, Me.Width - rgnRadius * 2, 0)
        bs.AddArc(Me.Width - rgnRadius * 2, 0, rgnRadius * 2, rgnRadius * 2, 270, 90)
        bs.AddLine(Me.Width, rgnRadius, Me.Width, Me.Height - rgnRadius * 2)
        bs.AddArc(Me.Width - rgnRadius * 2, Me.Height - rgnRadius * 2, rgnRadius * 2, rgnRadius * 2, 0, 90)
        bs.AddLine(Me.Width - rgnRadius * 2, Me.Height, rgnRadius, Me.Height)
        bs.AddArc(0, Me.Height - rgnRadius * 2, rgnRadius * 2, rgnRadius * 2, 90, 90)
        bs.AddLine(0, Me.Height - rgnRadius * 2, 0, rgnRadius * 2)
        bs.AddArc(0, 0, rgnRadius * 2, rgnRadius * 2, 180, 90)
        bs.CloseFigure()
        Me.Region = New Region(bs)
    End Sub

End Class

最后尝试了使用WPF窗体,完美解决圆角问题

<Window x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:工作助手WPF"
        mc:Ignorable="d"
        Title="MainWindow" Height="300" Width="200"
        WindowStyle="None"
        ResizeMode="NoResize"
        AllowsTransparency="True"
        Background="Transparent">
    <Grid SnapsToDevicePixels="True">
        <Border Background="White" BorderThickness="1" CornerRadius="10">
            <Button Content="Button" Margin="49,57,49,204"/>
        </Border>
    </Grid>
</Window>

 5.设置icon

 6.设置窗口初始位置,右下角

        Dim screenWidth As Integer = SystemParameters.PrimaryScreenWidth
        Dim screenHeight As Integer = SystemParameters.PrimaryScreenHeight
        Dim workHeight As Integer = SystemParameters.WorkArea.Height
        'MsgBox("--" & screenWidth & "--" & screenHeight & "--" & workHeight)
        Me.Left = screenWidth - Me.Width
        Me.Top = workHeight - Me.Height

7.设置类似qq的吸附效果,这里附上完整代码

Imports System.Timers.Timer
Imports System.Windows.Forms

Class MainWindow
    'Inherits Window
    Public Sub New()
        InitializeComponent()
        ' 设置窗口的初始位置贴紧任务栏
        'Me.WindowStartupLocation = WindowStartupLocation.CenterScreen '显示在屏幕中心
        'Me.WindowStartupLocation = WindowStartupLocation.Manual '在指定位置显示
        Dim screenWidth As Integer = SystemParameters.PrimaryScreenWidth
        Dim screenHeight As Integer = SystemParameters.PrimaryScreenHeight
        Dim workHeight As Integer = SystemParameters.WorkArea.Height
        'MsgBox("--" & screenWidth & "--" & screenHeight & "--" & workHeight)
        Me.Left = screenWidth - Me.Width
        Me.Top = workHeight - Me.Height
    End Sub
    ''' 
    Protected Overrides Sub OnMouseLeftButtonDown(ByVal e As MouseButtonEventArgs) ' 拖动窗体
        MyBase.OnMouseLeftButtonDown(e)
        Me.DragMove()
    End Sub
    Private hh As Boolean = False
    Private tt As Boolean = False
    Private timer As New Timer

    Private Sub MainWindow_Loaded(sender As Object, e As System.Windows.RoutedEventArgs) Handles Me.Loaded
        timer.Enabled = True
        AddHandler timer.Tick, AddressOf timertick
    End Sub

    Private Sub timertick()
        If hh = True Then
            If System.Windows.Forms.Cursor.Position.X >= clien()(0) - 5 And (System.Windows.Forms.Cursor.Position.Y >= Me.Top And System.Windows.Forms.Cursor.Position.Y <= Me.Top + Me.Height) Then
                Me.Left = clien()(0) - Me.Width
            End If
        End If
        If tt = True Then
            If System.Windows.Forms.Cursor.Position.Y <= 1 And (System.Windows.Forms.Cursor.Position.X >= Me.Left And System.Windows.Forms.Cursor.Position.X <= Me.Left + Me.Width) Then
                Me.Top = 1
            End If
        End If
    End Sub
    Private Sub MainWindow_MouseEnter(sender As Object, e As System.Windows.Input.MouseEventArgs) Handles Me.MouseEnter
        If hh = True Then
            Me.Left = clien()(0) - Me.Width
            hh = False
        End If
        If tt = True Then
            Me.Top = 1
            tt = False
        End If
    End Sub
    Function clien()
        Return {System.Windows.Forms.Screen.FromPoint(New System.Drawing.Point).Bounds.Width, System.Windows.Forms.Screen.FromPoint(New System.Drawing.Point).Bounds.Height}
    End Function

    Private Sub MainWindow_MouseLeave(sender As Object, e As System.Windows.Input.MouseEventArgs) Handles Me.MouseLeave
        If Me.Top <= 1 And Me.Left + Me.Width >= clien()(0) Then
            Me.Top = -Me.Height + 5
            Me.Left = clien()(0) - Me.Width
            tt = True
        Else
            hidden()
            shhtop()
        End If
    End Sub
    Sub hidden()
        If Me.Left + Me.Width >= clien()(0) Then
            Me.Left = clien()(0) - 5
            hh = True
        End If
    End Sub
    Sub shhtop()
        If Me.Top <= 1 Then
            Me.Top = -Me.Height + 5
            tt = True
        End If
    End Sub

    Sub btn_upload_Click()

    End Sub
    Sub btn_close_Click()

    End Sub
End Class

.net (vb) wpf 模仿QQ 吸附窗体_wpf 吸附效果-CSDN博客

问题一:其中System.Windows.Forms引用不到

解决方案

<UseWindowsForms>true</UseWindowsForms>

放置的位置是,【项目名】.csproj文件,在Visual Studio 2022 里双击项目名可以打开这个文件。

 <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net6.0-windows</TargetFramework>
    <Nullable>enable</Nullable>
    <UseWPF>true</UseWPF>
    <AssemblyVersion>1.0.1</AssemblyVersion>
    <FileVersion>1.0.1.0</FileVersion>
    <UseWindowsForms>true</UseWindowsForms>
  </PropertyGroup>

 问题二:当鼠标停在屏幕顶部时,窗口会不停闪烁,因为窗口没有完全隐藏,鼠标反复进出窗口,所以将-Me.Height + 0,做成临界值,使窗口不再闪烁

问题三:由于电脑有缩放,导致对鼠标的位置判断有问题,有偏移,所以要先获取电脑缩放比

(System.Windows.Forms.Cursor.Position.X / 1.25 >= Me.Left And System.Windows.Forms.Cursor.Position.X / 1.25 <= Me.Left + Me.Width)

我的电脑缩放比试125%,所以这里要除以1.25

8.调试:Debug.WriteLine("hello")

3.打包exe

3.1.vs能生成exe,但是debug中的其他文件也要拷贝给客户才能运行,就是要复制一个文件包,对于小程序不方便。以下方法可以通过rar压缩软件制作exe文件,但是如果进行了最后一步,给压缩包自定义图标,在其他电脑上运行会报毒,但是不改图标,程序又是压缩包的图标,不够专业。所以本人不想使用此方式。

https://www.cnblogs.com/cmblogs/p/9782855.html

3.2打包成独立的exe,依据以下博客

VS 程序打包成一个独立的exe - Enigma Virtual Box-CSDN博客

3.3.vs2022生成单exe文件和不需安装.NET DESKTOP runtime 运行的方法

部署模式选独立,文件发布模式勾选生成单个文件,整个打包,不需要电脑安装.net。

如果用依赖框架的形式安装,点击程序运行时会自动跳转安装,也挺快的。

3.4之前能正常运行,重新打开后InitializeComponent()报错,解决办法,删除项目目录中obj文件夹,重新打开项目。

继续写的话就太长,留在下一节了。

最后附一下当前的成效吧,能自动吸附隐藏在上边框。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/787421.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++入门基础(1)

因为6月中旬学校事情多&#xff0c;许久未更新&#xff0c;让我们继续学习吧&#xff01; 目录 前言&#xff1a; 一、命名空间&#xff1a; 1、定义&#xff1a; 2、使用&#xff1a; 3、访问命名空间域: 二、C输入、输出函数&#xff1a; 1、输入函数&#xff1a; 2、输出…

【正点原子i.MX93开发板试用连载体验】项目计划和开箱体验

本文最早发表于电子发烧友&#xff1a;【   】【正点原子i.MX93开发板试用连载体验】基于深度学习的语音本地控制 - 正点原子学习小组 - 电子技术论坛 - 广受欢迎的专业电子论坛! (elecfans.com)https://bbs.elecfans.com/jishu_2438354_1_1.html 有一段时间没有参加电子发…

入门PHP就来我这(高级)19 ~ 捕获sql错误

有胆量你就来跟着路老师卷起来&#xff01; -- 纯干货&#xff0c;技术知识分享 路老师给大家分享PHP语言的知识了&#xff0c;旨在想让大家入门PHP&#xff0c;并深入了解PHP语言。 接着上篇我们来看下sql错误的捕获模式。 1 PDO中捕获SQL语句中的错误 在PDO中有3种方法可以捕…

【前端从入门到精通:第十二课: JS运算符及分支结构】

JavaScript运算符 算数运算符 关于自增自减运算 自增或者自减运算就是在本身的基础上进行1或者-1的操作 自增或者自减运算符可以在变量前也可以在变量后&#xff0c;但是意义不同 自增自减运算符如果在变量前&#xff0c;是先进行自增或者自减运算&#xff0c;在将变量给别人用…

Python | Leetcode Python题解之第221题最大正方形

题目&#xff1a; 题解&#xff1a; class Solution:def maximalSquare(self, matrix: List[List[str]]) -> int:if len(matrix) 0 or len(matrix[0]) 0:return 0maxSide 0rows, columns len(matrix), len(matrix[0])dp [[0] * columns for _ in range(rows)]for i in…

HumbleBundle7月虚幻捆绑包30件军事题材美术模型沙漠自然环境大逃杀模块化建筑可定制武器包二战现代坦克飞机道具丧尸士兵角色模型20240705

HumbleBundle7月虚幻捆绑包30件军事题材美术模型沙漠自然环境大逃杀模块化建筑可定制武器包二战现代坦克飞机道具丧尸士兵角色模型202407051607 这次HumbleBundle捆绑包是UE虚幻军事题材的&#xff0c;内容非常多。 有军事基地、赛博朋克街区、灌木丛景观环境等 HB捆绑包虚幻…

高,实在是高

go&#xff0c;去 //本义音通义通汉字“高”&#xff0c;指太阳升起、上升&#xff0c;即高上去 god | God&#xff0c;神&#xff0c;上帝 //本义音通义通“高的”&#xff0c;指太阳高高在上的&#xff0c;至高无上的 glad&#xff0c;高兴的 //本义音通义通“高了的”&#…

关于10G光模块中SR, LR, LRM, ER 和 ZR的区别?

在10Gbps&#xff08;10千兆比特每秒&#xff09;光模块中&#xff0c;SR、LR、LRM、ER 和 ZR 是用来描述不同类型的模块及其适用的传输距离和光纤类型。下面是这些缩写的详细解释&#xff1a; 1.SR (Short Range) 2.LR (Long Range) 3.LRM (Long Reach Multimode) 4.ER (E…

注解复习(java)

文章目录 注解内置注解**Deprecated**OverrideSuppressWarnings【不建议使用】Funcationallnterface 自定义注解元注解RetentionTargetDocumentedInherited 和 Repeatable 反射注解 前言&#xff1a;笔记基于动力节点 注解 注解可以标注在 类上&#xff0c;属性上&#xff0c…

鸿蒙语言基础类库:【@ohos.util.Deque (线性容器Deque)】

线性容器Deque 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 Deque&#xff08;double ended queue&#xff09;根据循环队列的数据结构实现&#xff0c;符合先进先出以及先进后出的特点&…

【Stable Diffusion】(基础篇三)—— 关键词和参数设置

提示词和文生图参数设置 本系列笔记主要参考B站nenly同学的视频教程&#xff0c;传送门&#xff1a;B站第一套系统的AI绘画课&#xff01;零基础学会Stable Diffusion&#xff0c;这绝对是你看过的最容易上手的AI绘画教程 | SD WebUI 保姆级攻略_哔哩哔哩_bilibili 本文主要讲…

深入理解 LXC (Linux Containers)

目录 引言LXC 的定义LXC 的架构LXC 的工作原理LXC 的应用场景LXC 在 CentOS 上的常见命令实验场景模拟总结 1. 引言 在现代 IT 基础设施中&#xff0c;容器技术已经成为一种重要的应用和部署方式。与虚拟机相比&#xff0c;容器具有更高的效率、更轻量的特性和更快的启动速度…

解答 | http和https的区别,谁更好用

TTP&#xff08;超文本传输协议&#xff09;和HTTPS&#xff08;安全超文本传输协议&#xff09;的主要区别在于安全性和数据传输的方式。 一、区别 1、协议安全性&#xff1a; HTTP&#xff1a;使用明文形式传输数据&#xff0c;不提供数据加密功能&#xff0c;数据在传输过…

用于视频生成的扩散模型

学习自https://lilianweng.github.io/posts/2024-04-12-diffusion-video/ 文章目录 3D UNet和DiTVDMImagen VideoSora 调整图像模型生成视频Make-A-Video&#xff08;对视频数据微调&#xff09;Tune-A-VideoGen-1视频 LDMSVD稳定视频扩散 免训练Text2Video-ZeroControlVideo 参…

利用 STM32 实现多协议物联网网关:Modbus/Zigbee 到以太网/Wi-Fi 的数据桥接

摘要: 随着物联网技术的飞速发展&#xff0c;不同通信协议之间的互联互通成为了构建智能化系统的一大挑战。本文将以实战项目为例&#xff0c;详细介绍如何利用 STM32 微控制器实现 Modbus/Zigbee 与以太网/Wi-Fi 之间的协议转换&#xff0c;从而打通传感器数据上传至服务器的“…

源码编译构建LAMP(企业网站架构部署与优化)

部署LAMP平台 LAMV架构是目前成熟的企业网站应用模式之一&#xff0c;指的是协同工作的一整套系统和相关软件&#xff0c;能够提供动态Web站点服务及其应用开发环境。LAMP是一个缩写词&#xff0c;具体包 括 Linux操作系统&#xff0c;Apache网站服务器、MySQL数据库服务器、P…

海南云亿商务咨询有限公司助力品牌快速崛起

在数字化浪潮的推动下&#xff0c;电商行业日新月异&#xff0c;短视频平台更是成为品牌宣传和销售的新宠。海南云亿商务咨询有限公司&#xff0c;作为抖音电商服务的领军者&#xff0c;凭借其专业的团队和丰富的经验&#xff0c;助力众多品牌在抖音平台上实现了快速增长。 一…

【INTEL(ALTERA)】为什么我使用 PIO 边缘捕获中断的 Nios® II 设计不能正常工作?

目录 说明 解决方法 说明 当用户选择了不正确的边缘捕获设置&#xff0c;从而阻止触发中断时&#xff0c;可能会出现此问题。 在 PIO&#xff08;并行 I/O&#xff09;英特尔 FPGA IP内核中&#xff0c;如果“启用单个位设置/清除”选项被关闭&#xff0c;则将任何值写入边…

【RIP实验-熟悉基础配置】

实验拓扑 实验要求 根据实验拓扑的IP地址分配&#xff0c;为所有设备配置对应的IP地址和环回地址。全网运行RIPv2&#xff0c;将R1、R2、R3和R4的物理端口、Loopback地址和10.1.00网段进行宣告。并在rip协议下配置路由自动汇总&#xff0c;观察R1/R2是否能够收到10.0.0.0的详细…

初识数组(二)

目录 1. 二维数组的初始化 1&#xff09; 不完全初始化 2&#xff09; 完全初始化 3&#xff09; 按照行初始化 4&#xff09; 初始化时省略行&#xff0c;但是不能省略列 2.二维数组的使用 1&#xff09; 二维数组的下标 2&#xff09;二维数组的输入和输出 3. 二维数…