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

news2024/11/16 22:52:40

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

问题一:其中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文件夹,重新打开项目。

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学生护眼台灯哪个牌子最好?几款口碑好、值得推荐的学生护眼台灯

家长们对孩子的用眼健康很重视&#xff0c;为什么&#xff1f;现在是科技电子时代&#xff0c;人们对电子屏幕的依赖性高&#xff0c;小孩子年纪小&#xff0c;眼部还处于正在发育的阶段&#xff0c;他们在学校中长时间的学习读写&#xff0c;用眼时间长。而且随着科技渗入教学…

36V高性能单双通道多路复用器开关控制器

产品简介 PC221 和 PC222 分别为单 8:1 和双通道 4:1 模拟多路复用器。由于特殊的设计优化&#xff0c;无论是上电状态还是掉电状态&#xff0c; PC221 和 PC222 都可以提供源端过压保护。正常供电状态下&#xff0c;多路复用器源端可以耐受持续的电压高达-50 V 至50 V。当掉电…

JS滚动时显示元素

本篇文章我们将实现文章平滑滑入 ● 其实这原本是用CSS实现的 .section {padding: 15rem 3rem;border-top: 1px solid #ddd;transition: transform 1s, opacity 1s; }.section--hidden {opacity: 0;transform: translateY(8rem); }● 我们的目的呢&#xff0c;就是当滚入到某一…

提升用户购物体验:多语言跨境电商系统源码优化技巧详解

随着全球化的发展&#xff0c;跨境电商已成为一种趋势。而在跨境电商中&#xff0c;多语言的支持是提升用户购物体验的重要一环。为此&#xff0c;本文将详细介绍多语言跨境电商系统源码的优化技巧。 一、多语言支持的重要性 在全球市场中&#xff0c;用户来自不同的国家和地…

日本服务器托管需要注意哪些问题

日本服务器托管是一项涉及多方面因素的重要决策&#xff0c;为了确保托管服务的稳定、高效与安全&#xff0c;企业或个人在托管过程中需要注意以下几个关键问题&#xff1a; 首先&#xff0c;数据中心的基础设施建设标准是决定托管稳定性的关键。这包括数据中心的建筑抗震、抗洪…

你的B端系统考虑移动化了?还没?那就小心out了。

B端系统移动化的趋势是不可阻挡的。随着移动设备的普及和移动互联网的发展&#xff0c;越来越多的企业和组织意识到移动化对于提高工作效率、拓展市场和提供更好的用户体验的重要性。以下是一些导致B端系统移动化趋势不可阻挡的原因&#xff1a; 移动办公需求&#xff1a;越来越…

Excel 宏录制与VBA编程 ——VBA编程技巧篇二 (合并内容相同连续单元格、取消合并单元格并在每个单元格中保留内容)

1、合并内容相同的连续单元格 如果需要合并如图所示的工作表中B列中部门相同的连续单元格 VBA代码&#xff1a; Sub Mergerng()Dim IntRow As IntegerDim i As IntegerApplication.DisplayAlerts FalseWith Sheet1IntRow .Range("A65536").End(xlUp).RowFor i In…

Activity 的生命周期

1.Activity生命周期基本概念 Activity生命周期指Activity从启动到销毁的过程&#xff0c;Activity表现为四种状态 活动状态&#xff1a; Activity在用户界面中处于最上层&#xff0c;完全能让用户看到&#xff0c;能够与用户进行交互。 暂停状态&#xff1a; Activity在界面…

项目中上传功能过段时间就报错,解决方案

实际项目中&#xff0c;发现过段时间上传功能就报错&#xff0c;报错如下&#xff1a; 排查问题&#xff1a; 在服务器的 /tmp目录下发现并没有 /tomcat目录&#xff0c;也就验证了上面找不到这个文件的报错 那么这个临时给tomcat的上传目录怎么就没有了呢&#xff1f; 其实临…

简单分享下python多态

目录&#xff1a; 一、多态是啥嘞&#xff08;龙生九子各有不同&#xff0c;这就是多态&#xff09; 二、基础的实例 三、多态的优势与应用场景 四、深入理解 一、多态是啥嘞&#xff08;龙生九子各有不同&#xff0c;这就是多态&#xff09; 多态&#xff08;Polymorphism&…

无人机森林火灾解决方案

森林火灾解决方案 森林火灾特点 森林火灾发生突然、蔓延迅速、难以控制&#xff0c;应对难度系 数很高&#xff0c;扑救工作十分困难 救援面临的挑战 • 林区交通不便&#xff0c; 山高坡陡&#xff0c; 沟壑纵横&#xff0c;难以及时侦查、 定位、扑灭 • 火灾发生的区域…

Unity休闲手机游戏开发课程

课程介绍 Unity休闲手机游戏开发课程将教您如何利用Unity游戏引擎创建令人愉快的休闲手机游戏。从基础的游戏开发知识到高级的游戏制作技巧&#xff0c;您将学习到创建各种类型的休闲游戏所需的关键技能和工具。无论您是初学者还是有一定经验的开发者&#xff0c;本课程都能帮助…

centos更换yum源、安装Docker和换源

所有操作都是在root权限下做的&#xff0c;切换root用户 命令&#xff1a;su root 使用ls /etc/yum*查看所有的关于yum的文件的路径 先安装wget 命令&#xff1a;yum install wget -y 命令&#xff1a;cd /etc/yum.repos.d进去&#xff0c;以便于操作 我们需要配置的是Cen…

STM32 Cannot access memory

问题描述 最近自己做了一块STM32F103ZET6的板子&#xff0c;在焊接完成后可以在下载器界面看到idcode&#xff0c;但烧录时报错 Cannot access memory 。 解决办法 测量STM32各个供电项&#xff0c;发现时33脚处VDDA电压只有1.8V&#xff0c;是因为R3电阻过大&#xff0c;…

深入理解计算机系统 CSAPP 家庭作业8.19

假设n1 会打印 2行 hello 假设n2 会打印 4行 hello 假设n3 会打印 8行 hello 答案 2的n次方

2024年上半年网络工程师下午真题及答案解析

试题一(20分) 某高校网络拓扑如下图所示&#xff0c;两校区核心&#xff08;CORE-1、CORE-2&#xff09;&#xff0c;出口防火墙&#xff08;NGFW-1、NGFW-2&#xff09;通过校区间光缆互联&#xff0c;配置OSPF实现全校路由收敛&#xff0c;两校区相距40km。两校区默认由本地…

天呐,iPhone16系列的电池居然能自己更换?

在智能手机的发展历程中&#xff0c;苹果公司一直以其独特的设计理念和创新技术引领着行业的潮流。然而&#xff0c;一体化机身设计中不可更换的电池一直是用户心中的痛点。iPhone16系列的推出&#xff0c;标志着苹果在电池设计上的一次重大突破&#xff0c;它不仅解决了用户的…

色彩搭配的艺术:打造和谐视觉体验的秘诀

当设计作品呈现给用户时首先映入眼帘的是视觉表达&#xff0c;色彩无疑是最关键的元素之一。色彩不仅是视觉艺术的一部分&#xff0c;也承载着情感文化甚至个人品味的多重含义。在设计领域&#xff0c;色彩设计可以极大地影响作品的整体感受和传达效果。那么什么是色彩设计&…

RabbitMQ 更改服务端口号

需求 windows环境下&#xff0c;将RabbitMQ默认的端口号 5672 改为 11001 实现 本机RabbitMQ版本为3.8.16&#xff0c;找到配置文件位置&#xff0c;路径为&#xff1a;C:\Users\%USERNAME%\AppData\Roaming\RabbitMQ\advanced.config 配置文件默认内容为空 填写修改端口号…

Python:Python基础知识(注释、命名、数据类型、运算符)

四、Python基础知识&#xff08;注释、命名、数据类型、运算符&#xff09; 1.注释 Python有两种注释方法&#xff1a;单行注释和多行注释。单行注释以#开头&#xff0c;多行注释以‘’‘开头和结尾。 2.命名规则 命名规则: 大小写字母、数字、下划线和汉字等字符及组合&am…