工作助手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文件夹,重新打开项目。
继续写的话就太长,留在下一节了。
最后附一下当前的成效吧,能自动吸附隐藏在上边框。

相关文章:
工作助手VB开发笔记(1)
1.思路 1.1 样式 样式为常驻前台的一个小窗口,小窗口上有三到四个按钮,为一级功能,是当前工作内容的常用功能窗口,有十个二级窗口,为选中窗口时的扩展选项,有若干后台功能,可选中至前台 可最…...
WAWA鱼曲折的大学四年回忆录
声明:本文内容纯属个人主观臆断,如与事实不符,请参考事实 前言: 早想写一下大学四年的总结了,但总是感觉无从下手,不知道从哪里开始写,通过这篇文章主要想做一个记录,并从现在的认…...
Go 依赖注入设计模式
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…...
使用React复刻ThreeJS官网示例——keyframes动画
最近在看three.js相关的东西,想着学习一下threejs给的examples。源码是用html结合js写的,恰好最近也在学习react,就用react框架学习一下。 本文参考的是threeJs给的第一个示例 three.js examples (threejs.org) 一、下载threeJS源码 通常我们…...
嵌入式linux面试1
1. linux 1.1. Window系统和Linux系统的区别 linux区分大小写windows在dos(磁盘操作系统)界面命令下不区分大小写; 1.2. 文件格式区分 windows用扩展名区分文件;如.exe代表执行文件,.txt代表文本文件,.…...
智能交通(3)——Learning Phase Competition for Traffic Signal Control
论文分享 https://dl.acm.org/doi/pdf/10.1145/3357384.3357900https://dl.acm.org/doi/pdf/10.1145/3357384.3357900 论文代码 https://github.com/gjzheng93/frap-pubhttps://github.com/gjzheng93/frap-pub 摘要 越来越多可用的城市数据和先进的学习技术使人们能够提…...
【扩散模型】LCM LoRA:一个通用的Stable Diffusion加速模块
潜在一致性模型:[2310.04378] Latent Consistency Models: Synthesizing High-Resolution Images with Few-Step Inference (arxiv.org) 原文:Paper page - Latent Consistency Models: Synthesizing High-Resolution Images with Few-Step Inference (…...
【PYG】pytorch中size和shape有什么不同
一般使用tensor.shape打印维度信息,因为简单直接 在 PyTorch 中,size 和 shape 都用于获取张量的维度信息,但它们之间有细微的区别。下面是它们的定义和用法: size: size 是一个方法(size())和…...
备份服务器出错怎么办?
在企业的日常运营中,备份服务器扮演着至关重要的角色,它确保了数据的安全和业务的连续性。然而,备份服务器也可能遇到各种问题,如备份失败、数据损坏或备份系统故障等。这些问题可能导致数据丢失或业务中断,给企业带来…...
数据库(表)
要求如下: 一:数据库 1,登录数据库 mysql -uroot -p123123 2,创建数据库zoo create database zoo; Query OK, 1 row affected (0.01 sec) 3,修改字符集 mysql> use zoo;---先进入数据库zoo Database changed …...
Feign-未完成
Feign Java中如何实现接口调用?即如何发起http请求 前三种方式比较麻烦,在发起请求前,需要将Java对象进行序列化转为json格式的数据,才能发送,然后进行响应时,还需要把json数据进行反序列化成java对象。 …...
# [0705] Task06 DDPG 算法、PPO 算法、SAC 算法【理论 only】
easy-rl PDF版本 笔记整理 P5、P10 - P12 joyrl 比对 补充 P11 - P13 OpenAI 文档整理 ⭐ https://spinningup.openai.com/en/latest/index.html 最新版PDF下载 地址:https://github.com/datawhalechina/easy-rl/releases 国内地址(推荐国内读者使用): 链…...
Open3D 点云CPD算法配准(粗配准)
目录 一、概述 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 3.1原始点云 3.2配准后点云 一、概述 在Open3D中,CPD(Coherent Point Drift,一致性点漂移)算法是一种经典的点云配准方法,适用于无序点云的非…...
04-ArcGIS For JavaScript的可视域分析功能
文章目录 综述代码实现代码解析结果 综述 在数字孪生或者实景三维的项目中,视频融合和可视域分析,一直都是热点问题。Cesium中,支持对阴影的后处理操作,通过重新编写GLSL代码就能实现视域和视频融合的功能。ArcGIS之前支持的可视…...
Nestjs基础
一、创建项目 1、创建 安装 Nest CLI(只需要安装一次) npm i -g nestjs/cli 进入要创建项目的目录,使用 Nest CLI 创建项目 nest new 项目名 运行项目 npm run start 开发环境下运行,自动刷新服务 npm run start:dev 2、…...
DDL:针对于数据库、数据表、数据字段的操作
数据库的操作 # 查询所有数据 SHOW DATABASE; #创建数据库 CREATE DATABASE 2404javaee; #删除数据库 DROP DATABASE 2404javaee; 数据表的操作 #创建表 CREATE TABLE s_student( name VARCHAR(64), s_sex VARCHAR(32), age INT(3), salary FLOAT(8,2), c_course VARC…...
昇思学习打卡-5-基于Mindspore实现BERT对话情绪识别
本章节学习一个基本实践–基于Mindspore实现BERT对话情绪识别 自然语言处理任务的应用很广泛,如预训练语言模型例如问答、自然语言推理、命名实体识别与文本分类、搜索引擎优化、机器翻译、语音识别与合成、情感分析、聊天机器人与虚拟助手、文本摘要与生成、信息抽…...
Java中 普通for循环, 增强for循环( foreach) List中增删改查的注意事项
文章目录 俩种循环遍历增加删除1 根据index删除2 根据对象删除 修改 俩种循环 Java中 普通for循环, 增强for循环( foreach) 俩种List的遍历方式有何异同,性能差异? 普通for循环(使用索引遍历): for (int…...
昇思25天学习打卡营第19天|LSTM+CRF序列标注
概述 序列标注指给定输入序列,给序列中每个Token进行标注标签的过程。序列标注问题通常用于从文本中进行信息抽取,包括分词(Word Segmentation)、词性标注(Position Tagging)、命名实体识别(Named Entity Recognition, NER)等。 条件随机场(…...
微服务: 初识 Spring Cloud
什么是微服务? 微服务就像把一个大公司拆成很多小部门,每个部门各自负责一块业务。这样一来,每个部门都可以独立工作,即使一个部门出了问题,也不会影响整个公司运作。 什么是Spring Cloud? Spring Cloud 是一套工具包&#x…...
告别手动输入:用快马ai自动化mathtype公式生成,效率提升300%
作为一名经常需要写技术文档的开发者,数学公式的输入一直是个头疼的问题。传统的方式要么是手动在Mathtype里点选符号,要么得记住各种LaTeX语法,效率实在太低。最近尝试用InsCode(快马)平台开发了一个自动化工具,终于解决了这个痛…...
yz-bijini-cosplay惊艳效果:多光源环境下Cosplay角色面部光影层次还原
yz-bijini-cosplay惊艳效果:多光源环境下Cosplay角色面部光影层次还原 安全声明:本文仅讨论技术实现方案,所有生成内容均为技术演示用途,不涉及任何真人形象或不当内容。 1. 项目概述:专为Cosplay创作打造的AI图像生成…...
Wan2.2-T2V-A5B科研工具链:Matlab数据可视化与模型输入预处理
Wan2.2-T2V-A5B科研工具链:Matlab数据可视化与模型输入预处理 1. 引言 做科研的朋友们,你们有没有遇到过这样的场景:手头有一堆宝贵的实验数据,想用Wan2.2-T2V-A5B这样的文生视频模型,把数据背后的科学故事“演”出来…...
DevOps 实践与自动化运维:从手动到智能
DevOps 实践与自动化运维:从手动到智能 前言 作为一个在数据深渊里捞了十几年 Bug 的女码农,我深知 DevOps 在现代软件开发中的重要性。DevOps 不仅能缩短开发周期,提高软件质量,还能增强系统的可靠性和可维护性。今天,…...
Graphormer效果展示:实测分子属性预测,准确率超越传统GNN方法
Graphormer效果展示:实测分子属性预测,准确率超越传统GNN方法 1. 模型概述与核心优势 Graphormer是微软研究院推出的基于纯Transformer架构的图神经网络,专为分子图(原子-键结构)的全局结构建模与属性预测设计。与传…...
3个步骤掌握macOS自动点击器:彻底告别重复鼠标操作的完整方案
3个步骤掌握macOS自动点击器:彻底告别重复鼠标操作的完整方案 【免费下载链接】macos-auto-clicker A simple auto clicker for macOS Big Sur, Monterey, Ventura, Sonoma and Sequoia. 项目地址: https://gitcode.com/gh_mirrors/ma/macos-auto-clicker 你…...
OFA-Image-Caption模型C语言接口封装实战:赋能传统嵌入式系统
OFA-Image-Caption模型C语言接口封装实战:赋能传统嵌入式系统 如果你在做一个智能摄像头项目,或者想给一台老旧的工业设备加上“看图说话”的能力,你可能会发现一个尴尬的局面:最新的AI模型大多是用Python写的,而你的…...
3秒极速解锁:高效智能的百度网盘提取码获取工具实战指南
3秒极速解锁:高效智能的百度网盘提取码获取工具实战指南 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 在数字资源分享日益频繁的今天,百度网盘提取码智能获取工具baidupankey通过创新的技术架构和优化…...
30 秒学会!手机隐藏数码技巧,超实用!打工人、学生党直接封神
家人们谁懂啊!每天手机不离手,结果 90% 的隐藏功能全在吃灰,简直亏到姥姥家!别再只会打电话、刷短视频了,这些30 秒就能上手的数码冷知识,实用到跺脚,学会直接变身玩机大神,效率直接…...
Pixel Epic · Wisdom Terminal 虚拟化环境部署:在VMware虚拟机中搭建AI开发沙箱
Pixel Epic Wisdom Terminal 虚拟化环境部署:在VMware虚拟机中搭建AI开发沙箱 1. 前言:为什么选择虚拟化环境进行AI开发 在AI开发过程中,环境隔离和资源管理是两个常见痛点。很多开发者都遇到过这样的情况:不同项目需要不同版本…...
