因为无聊 自己写的一个 TXT小说阅读器 PC版(winfrom)

news/2025/1/11 22:36:05/

应为无聊 自己写的一个 TXT小说阅读器,支持老板键,自动贴边隐藏,划水神器^^

主要特色:

①支持拖拽txt文件到阅读器中自动打开txt文件,主要代码:

        //拖拽TXT文件到窗体并加载TXT文件private void Form1_DragEnter(object sender, DragEventArgs e){string file = ((System.Array)e.Data.GetData(DataFormats.FileDrop)).GetValue(0).ToString();//获得路径if (File.Exists(file)){string Extension = System.IO.Path.GetExtension(file).ToLower();if (Extension == ".txt"){this.Text = System.IO.Path.GetFileName(file);this.richTextBox1.LoadFile(file, RichTextBoxStreamType.PlainText);//读取txt文件RememberTxt(file);//记录txt文件的路径LoadChapter(file);//读取章节DeleteBookmark();//删除书签(防止打开B小说,却加载了A小说书签的bug)}}}

②自动抓取txt文件里面的 章节 标题,代码如下:

 //读取章节public void LoadChapter(string file){try{this.listBox1.Items.Clear();if (File.Exists(file)){FileStream fs = new FileStream(file, FileMode.Open);using (StreamReader sr = new StreamReader(fs, System.Text.Encoding.Default)){string strLine = sr.ReadLine(); //读取文件中的一行while (strLine != null){string[] patArr = { "第(.*?)章", "第(.*?)回", "第(.*?)集", "第(.*?)卷", "第(.*?)部", "第(.*?)篇", "第(.*?)节", "第(.*?)季" };foreach (var pattern in patArr){Regex reg = new Regex(pattern);if (reg.IsMatch(strLine)){if (strLine.Length < 20)//超过20个字的标题,可能是小说正文里面出现的“书中书、文中文...的标题”...{this.listBox1.Items.Add(strLine.Trim().Replace("\r\n", "").Replace("\r", "").Replace("\n", ""));//添加标题行}continue;}}strLine = sr.ReadLine();//Thread.Sleep(1);}}}}catch { }}

③老板键 Alt + 1 ,代码如下:

        //注册热键private void Form1_Activated(object sender, EventArgs e){HotKey.RegisterHotKey(Handle, 100, HotKey.KeyModifiers.Alt, Keys.D1);//注册热键 Alt+1 老板键 我用着顺手}//注销热键private void Form1_Leave(object sender, EventArgs e){HotKey.UnregisterHotKey(Handle, 100);//注销Id号为100的热键设定}//执行热键protected override void WndProc(ref Message m){const int WM_HOTKEY = 0x0312;//按快捷键 switch (m.Msg){case WM_HOTKEY:switch (m.WParam.ToInt32()){case 100://按下的是Alt+1 BossKey();//老板键break;}break;}base.WndProc(ref m);}//老板键:显示|隐藏 窗体private void BossKey(){if (this.WindowState == FormWindowState.Normal){this.WindowState = FormWindowState.Minimized;this.Hide();//隐藏窗体this.notifyIcon1.Visible = true; //使托盘图标可见}else{this.Visible = true;this.WindowState = FormWindowState.Normal;this.notifyIcon1.Visible = false;}}using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;namespace myTXTreader
{class HotKey{//如果函数执行成功,返回值不为0。//如果函数执行失败,返回值为0。要得到扩展错误信息,调用GetLastError。[DllImport("user32.dll", SetLastError = true)]public static extern bool RegisterHotKey(IntPtr hWnd,                //要定义热键的窗口的句柄int id,                     //定义热键ID(不能与其它ID重复)KeyModifiers fsModifiers,   //标识热键是否在按Alt、Ctrl、Shift、Windows等键时才会生效Keys vk                     //定义热键的内容);[DllImport("user32.dll", SetLastError = true)]public static extern bool UnregisterHotKey(IntPtr hWnd,                //要取消热键的窗口的句柄int id                      //要取消热键的ID);public enum KeyModifiers{None = 0,Alt = 1,Ctrl = 2,Shift = 4,WindowsKey = 8}}
}

④仿QQ的 贴边隐藏,代码如下:

        //窗口贴边(Ctrl+1)private void 窗口贴边Ctrl1ToolStripMenuItem_Click(object sender, EventArgs e){TieBian();}bool tb = true;public void TieBian(){if (tb){tb = false;this.隐藏章节ToolStripMenuItem.Text = "显示章节(Shift+1)";this.splitContainer1.Panel1Collapsed = true;//收起章节this.窗口贴边ToolStripMenuItem.Text = "取消贴边(Ctrl+1)";int w = Screen.GetWorkingArea(this).Width;//显示器的宽度int h = Screen.GetWorkingArea(this).Height;//显示器的高度this.Width = w / 5;this.Height = h;this.Left = w - this.Width;this.Top = h - this.Height;}else{tb = true;this.隐藏章节ToolStripMenuItem.Text = "隐藏章节(Shift+1)";this.splitContainer1.Panel1Collapsed = false;//展开章节this.窗口贴边ToolStripMenuItem.Text = "窗口贴边(Ctrl+1)";int w = Screen.GetWorkingArea(this).Width;//显示器的宽度int h = Screen.GetWorkingArea(this).Height;//显示器的高度this.Width = 800;this.Height = 600;this.Left = w / 5;this.Top = h / 5;}}//自动贴边隐藏后 鼠标移动上去 自动展出面板private void mStopAnhor(){if (this.Top <= 0 && this.Left <= 0){StopAanhor = AnchorStyles.None;}else if (this.Top <= 0){StopAanhor = AnchorStyles.Top;}else if (this.Left <= 0){StopAanhor = AnchorStyles.Left;}else if (this.Left >= Screen.PrimaryScreen.Bounds.Width - this.Width){StopAanhor = AnchorStyles.Right;}else if (this.Top >= Screen.PrimaryScreen.Bounds.Height - this.Height){StopAanhor = AnchorStyles.Bottom;}else{StopAanhor = AnchorStyles.None;}}

⑤修改阅读器的背景色,文字字体、颜色和大小

⑥添加 书签

截图:

 ↑↑↑章节和正文节目↑↑↑

 ↑↑↑收起章节↑↑↑

↑↑↑右侧贴边↑↑↑↑

以上全部源代码下载地址:https://download.csdn.net/download/djk8888/12350994


http://www.ppmy.cn/news/246495.html

相关文章

基于Redis的分布式锁实现方案

1.分布式锁简介 简单来说&#xff0c;分布式锁是针对集群环境下多台机器竞争公共资源提出的方案。 单机环境下&#xff0c;线程共享堆内存&#xff0c;jdk提供了同步机制来应对资源竞争&#xff0c;比如synchronized关键字&#xff0c;AQS队列同步器等&#xff0c;只要我们设…

Netty由浅入深的学习指南(NIO基础)

本章节会重点讲解NIO的Selector、ByteBuffer和Channel三大组件。NIO即非阻塞IO。 1.1 三大组件 1.1.1 Channel(通道) & Buffer(缓冲区) ​ channel有一点类似于stream&#xff0c;他就是读写数据的双向通道&#xff0c;可以从channel将数据读入buffer,也可以将buffer的数…

NIO基础,帮助入门Netty

NIO基础 1、三大组件1.1 Channel & Buffer1.2 Selector 2.ByteBuffer2.1ByteBuffer正确使用2.2 ByteBuffer结构2.3 ByteBuffer 常用方法调试工具类分配空间向buffer中写入数据从buffer中读取数据代码演示get(),get(int i),allocate(),mark(),reset()方法的使用字符串和Byte…

Day76-Netty

title: Day76-Netty date: 2021-07-23 18:03:30 author: Liu_zimo NIO基础 non-blocking io 非阻塞io 三大组件 通道&#xff08;Channel&#xff09;、缓冲区&#xff08;Buffer&#xff09;、选择器&#xff08;Selector&#xff09; Channel & Buffer channel有点类…

NIO多路复用之Selector的使用

Selector的使用 文章目录 Selector的使用一、阻塞 & 非阻塞1. 阻塞2. 非阻塞 二、selector 介绍及常用API1. 多路复用2. 常用API 三、处理 accept 事件四、处理 read 事件1. 为什么事件必须删除2. 处理客户端断开问题2.1 客户端强制断开2.2 客户端正常断开 3. 处理消息边界…

NIO网络编程

一、阻塞模式 服务端 public class server {public static void main(String[] args) throws IOException {//用 nio 来理解阻塞模式单线程//ByteBufferByteBuffer buffer ByteBuffer.allocate(16);//1.创建服务器ServerSocketChannel ssc ServerSocketChannel.open();//2.…

NIO的理解和使用

一、概述 NIO是 non-blocking-io的简称&#xff0c;非阻塞IO&#xff0c;由于它是后续出来的IO模型&#xff0c;有时也叫做 new-IO。NIO是后续比如React等的多路复用的基础模型。它是UNIX的五种IO模型中的一种。 NIO有三大组件&#xff1a;buffer、channel和selector&#xff…

NIO基础笔记

Netty深入浅出笔记 1. NIO基础1.1 三大组件1.1.1 Channel & Buffer1.1.2 Selector 1.2 ByteBuffer1.2.1 ByteBuffer 正确使用姿势1.2.2 ByteBuffer结构1.2.3 ByteBuffer核心属性1.2.4 ByteBuffer常见方法1.2.5 字符串与 ByteBuffer 互转1.2.6 Scattering Reads(分散读取)1.…