工作助手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 GraphicsPathbs.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.InteropServicesPublic Class Form1Public Sub New()' 此调用是设计器所必需的。InitializeComponent()SetStyle(ControlStyles.UserPaint, True)SetStyle(ControlStyles.AllPaintingInWmPaint, True)SetStyle(ControlStyles.OptimizedDoubleBuffer, True)Me.Text = "工作助手"Me.TopMost = TrueMe.FormBorderStyle = FormBorderStyle.None'Call 窗体圆角(Me, 20)End SubProtected Overrides Sub OnPaintBackground(e As PaintEventArgs)' 不调用基类的OnPaintBackground,避免背景被画出End SubProtected Overrides Sub OnPaint(e As PaintEventArgs)Dim g As Graphics = e.Graphicsg.SmoothingMode = Drawing2D.SmoothingMode.AntiAliasg.CompositingQuality = Drawing2D.CompositingQuality.HighQualityg.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic'绘制圆角矩形Dim rect As New Rectangle(0, 0, Me.Width, Me.Height)Dim path As New Drawing2D.GraphicsPath()Dim ar As Integerar = 50path.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 SubSub 窗体圆角(form As Form, rgnRadius As Integer)Dim bs As GraphicsPath = New GraphicsPathbs.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 SubEnd 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.PrimaryScreenWidthDim screenHeight As Integer = SystemParameters.PrimaryScreenHeightDim workHeight As Integer = SystemParameters.WorkArea.Height'MsgBox("--" & screenWidth & "--" & screenHeight & "--" & workHeight)Me.Left = screenWidth - Me.WidthMe.Top = workHeight - Me.Height

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

Imports System.Timers.Timer
Imports System.Windows.FormsClass MainWindow'Inherits WindowPublic Sub New()InitializeComponent()' 设置窗口的初始位置贴紧任务栏'Me.WindowStartupLocation = WindowStartupLocation.CenterScreen '显示在屏幕中心'Me.WindowStartupLocation = WindowStartupLocation.Manual '在指定位置显示Dim screenWidth As Integer = SystemParameters.PrimaryScreenWidthDim screenHeight As Integer = SystemParameters.PrimaryScreenHeightDim workHeight As Integer = SystemParameters.WorkArea.Height'MsgBox("--" & screenWidth & "--" & screenHeight & "--" & workHeight)Me.Left = screenWidth - Me.WidthMe.Top = workHeight - Me.HeightEnd Sub''' Protected Overrides Sub OnMouseLeftButtonDown(ByVal e As MouseButtonEventArgs) ' 拖动窗体MyBase.OnMouseLeftButtonDown(e)Me.DragMove()End SubPrivate hh As Boolean = FalsePrivate tt As Boolean = FalsePrivate timer As New TimerPrivate Sub MainWindow_Loaded(sender As Object, e As System.Windows.RoutedEventArgs) Handles Me.Loadedtimer.Enabled = TrueAddHandler timer.Tick, AddressOf timertickEnd SubPrivate Sub timertick()If hh = True ThenIf 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) ThenMe.Left = clien()(0) - Me.WidthEnd IfEnd IfIf tt = True ThenIf 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) ThenMe.Top = 1End IfEnd IfEnd SubPrivate Sub MainWindow_MouseEnter(sender As Object, e As System.Windows.Input.MouseEventArgs) Handles Me.MouseEnterIf hh = True ThenMe.Left = clien()(0) - Me.Widthhh = FalseEnd IfIf tt = True ThenMe.Top = 1tt = FalseEnd IfEnd SubFunction 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 FunctionPrivate Sub MainWindow_MouseLeave(sender As Object, e As System.Windows.Input.MouseEventArgs) Handles Me.MouseLeaveIf Me.Top <= 1 And Me.Left + Me.Width >= clien()(0) ThenMe.Top = -Me.Height + 5Me.Left = clien()(0) - Me.Widthtt = TrueElsehidden()shhtop()End IfEnd SubSub hidden()If Me.Left + Me.Width >= clien()(0) ThenMe.Left = clien()(0) - 5hh = TrueEnd IfEnd SubSub shhtop()If Me.Top <= 1 ThenMe.Top = -Me.Height + 5tt = TrueEnd IfEnd SubSub btn_upload_Click()End SubSub 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.mzph.cn/pingmian/40332.shtml

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

相关文章

antd+vue——实现table组件跨页多选,已选择数据禁止第二次重复选择

需求场景&#xff1a;点击【新增】按钮可以在分页弹窗中跨页多选选择数据后添加到页面中&#xff0c;再次点击【新增】&#xff0c;已经选择过的数据则置灰不让重复选择。 选择后&#xff0c;置灰 点击【确定】数据添加到页面中&#xff0c;可再次点击【新增】进行添加数据 …

项目上线文档编写指南

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

Ollama + Docker + AnythingLLM 搭建本地多用户AI知识库

整个过程需要准备三个工具&#xff1a; Ollama&#xff1a; 用于运行本地大模型的管理&#xff1a;llama3, qwen2等 Docker&#xff1a;用于运行AnythingLLM。 AnythingLLM&#xff1a;知识库运行平台&#xff0c;提供知识库构建及运行的功能。 Ollama, Docker 这二个安装不…

Intent页面跳转

1. Intent的概念及使用 概念 Android中提供了一种Intent机制来协助应用程序间、组件之间的交互与通信&#xff0c;Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述&#xff0c;Android则根据此Intent的描述&#xff0c;负责找到对应的组件&#xff0c;将I…

等保测评——云计算测评项2

安全计算环境-身份鉴别 当远程管理云计算平台中设备时&#xff0c;管理终端和云计算平台之间应建立双向身份验证机制&#xff1b; 远程管理云计算平台中的设备时&#xff0c;双向身份验证机制确保了管理终端和对端服务器的真实性&#xff0c;有效防止了重放攻击和DoS攻击,大大…

CGLib动态代理技术

基于CGLib的动态代理机制&#xff0c;ProxyFactoryy无需再像JDK动态代理那样实现一个interface&#xff0c;实际情况下可能这个interface并不存在&#xff0c;只需要实现另外一个接口MethodInterceptor即可 package com.hmdp.service.尚硅谷的代理模式3; //CGlib代理import …

模电基础 - 信号

目录 一. 信号 二. 信号应用领域 三. 无线信号 四. 电信号 五. 无线通信,蓝牙,lora 无线通信&#xff08;General Wireless Communication&#xff09; 蓝牙&#xff08;Bluetooth&#xff09; LoRa&#xff08;Long Range&#xff09; 一. 信号 信号是用于传递、表示或…

PEI转染试剂说明书(悬浮细胞转染)

目前使用最广泛的阳离子聚合物转染试剂是PEI&#xff08;聚乙烯亚胺&#xff09;&#xff0c;因其毒性低、成本低、免疫原性低&#xff0c;可将外源基因转染到悬浮细胞或贴壁细胞中。同时&#xff0c;它也是一种适用于瞬时转染人HEK-293T细胞的试剂&#xff0c;尤其适用于大规模…

Oracle密码过期处理方式

1、如果密码因为时间到期而过期&#xff0c;需要修改密码才能重新。 alter user mx identified by oracle; alter user mx account unlock; 2、如果不记得密码&#xff0c;可以通过values方式修改 select name,password from dba_users; --11g select name,password from …

AI大模型深度学习:理论与应用全方位解析

背景 在当前技术环境下&#xff0c;AI大模型学习不仅要求研究者具备深厚的数学基础和编程能力&#xff0c;还需要对特定领域的业务场景有深入的了解。通过不断优化模型结构和算法&#xff0c;AI大模型学习能够不断提升模型的准确性和效率&#xff0c;为人类生活和工作带来更多…

华为机试HJ7取近似值

华为机试HJ7取近似值 题目&#xff1a; 将给定的数值小数点后的数值进行四舍五入 想法一&#xff1a; 遍历输入的每个字符&#xff0c;将小数点之前的字符拼接&#xff0c;小数点后一位的数值进行四舍五入的判断&#xff0c;并将四舍五入后的数值与小数点位之前的数值相加获…

【Eureka服务治理深度解析】探索灰度发布的实现之道

标题&#xff1a;【Eureka服务治理深度解析】探索灰度发布的实现之道 Eureka作为Netflix开源的服务发现框架&#xff0c;在微服务架构中扮演着核心角色。灰度发布作为一种重要的部署策略&#xff0c;允许逐步推出新版本的服务&#xff0c;以减少对用户的影响并提高系统的稳定性…

Xilinx FPGA:vivado实现乒乓缓存

一、项目要求 1、用两个伪双端口的RAM实现缓存 2、先写buffer1&#xff0c;再写buffer2 &#xff0c;在读buffer1的同时写buffer2&#xff0c;在读buffer2的同时写buffer1。 3、写端口50M时钟&#xff0c;写入16个8bit 的数据&#xff0c;读出时钟25M&#xff0c;读出8个16…

[图解]企业应用架构模式2024新译本讲解20-数据映射器2

1 00:00:01,860 --> 00:00:06,180 那么这个数据映射器因为它有这样的特点 2 00:00:07,310 --> 00:00:12,630 你想想&#xff0c;它负责同步这两边 3 00:00:13,010 --> 00:00:14,930 对象、数据库是独立的 4 00:00:15,990 --> 00:00:18,690 然后 5 00:00:18,700…

掌握MySQL基础命令:数据表结构修改详细操作

MySQL数据表&#xff08;Table&#xff09;是MySQL数据库中存储数据的基本结构单元。简单来说&#xff0c;数据表可以被看作是一个二维的、由行&#xff08;Row&#xff09;和列&#xff08;Column&#xff09;组成的表格&#xff0c;其中每一行代表了一个记录&#xff08;Reco…

Docker(二):Docker image Docker Container

本文将介绍 Docker 映像和容器以及 docker 文件之间的差异与联系&#xff0c;本文还将解释如何以及何时使用它们。 什么是 Dockerfile&#xff1f; 它是一个简单的文本文件&#xff0c;包含命令或过程的集合。我们运行的这些命令和准则作用于配置为创建新的 Docker 镜像的基本…

深入Django(五)

Django的URL路由系统 引言 在前四天的教程中&#xff0c;我们分别介绍了Django的基本概念、模型、视图和模板系统。今天&#xff0c;我们将讨论Django的URL路由系统&#xff0c;这是将URL路径映射到视图函数的机制。 Django URL路由概述 Django的URL路由系统允许你将URL路径…

《长江信息通信》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答 问&#xff1a;《长江信息通信》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的第一批认定学术期刊。 问&#xff1a;《长江信息通信》级别&#xff1f; 答&#xff1a;省级。主管单位&#xff1a;湖北省通信管理局 主办单位&#xff…

基于 Gunicorn + Flask + Docker 的模型高并发部署

在现代 Web 应用程序中&#xff0c;处理高并发请求是一个常见且重要的需求。本文将介绍如何使用 Gunicorn、Flask 和 Docker 来实现模型的高并发部署。我们将从环境设置、代码实现、Docker 镜像构建及部署等方面进行详细讲解。 一、环境设置 1. 安装 Flask 首先&#xff0c;…

Vue实现金钱输入框组件自动带千位逗号

新建PriceInput.vue <template><div id"bord"><el-inputv-model"inputValue"v-bind"$attrs":maxlength"maxlength"input"handleInput"focus"handleFocus"blur"handleBlur"change"h…