Ubuntu20.4 Mono C# gtk 编程习练笔记(二)

news2024/11/27 0:34:52

界面设计习练后,下面写一些程序设计心得。

程序结构

先看一下程序总体结构,先在program.cs中找到main入口,在命名空间下是MainClass类,Main函数进入后首先建立应用程序环境 Application.Init,然后对MainWindow进行实例化,显示窗体并运行程序 Application.Run()。

//Program.cs

using System;
using Gtk;

namespace csharp3
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            Application.Init();
            MainWindow win = new MainWindow();
            win.Show();
            Application.Run();
        }
    }
}

main -> application init -> mainwindow{builder} ->application run/quit

上述过程中,mainwindow如下,它通过gtk库产生一个窗体及窗体包含的其它widgets,然后连通widgets的信号 - 属性和事件。这其中用到一个 Build() 函数,在C调用中常命名为 builder的指针,在gnome-builder构建器中称之为 template ,将界面设计器的设计文件变成程序来实现。public partial class MainWindow, 指明这只是 partial,一部分内容,还有一部分由 Build() 产生。在linux中,Gtk界面库与用户程序之间一般都是这种方式。

//mainwindow.cs

using System;
using Gtk;

public partial class MainWindow : Gtk.Window
{
    public MainWindow() : base(Gtk.WindowType.Toplevel)
    {
        Build();
    }

    protected void OnDeleteEvent(object sender, DeleteEventArgs a)
    {
        Application.Quit();
        a.RetVal = true;
    }

    protected void OnButton5Clicked(object sender, EventArgs e)
    {
        entry2.Text = "Hello!";
    }

    protected void OnButton6Clicked(object sender, EventArgs e)
    {
        Application.Quit();
    }
}

也可以不用设计器,自己写build的内容。Mono的设计器支持C#,但不支持VB.NET,而Mono本身是支持VB.NET的。因此,如果在Mono上用VB.NET开发的话,需要自己写build后的界面语句。大至是下面的样子。首先产生个Window,然后向window中加入控件并显示控件,如果需要产生事件则将事件与回调函数过程的地址连起来(Addressof),最后show的是window。除了主窗体给个初始尺寸,控件本身一般都是由sizer,比如vbox等去控制的。习惯于linux界面这种方式后,可以不用界面设计器,脑子想它是什么样就add上什么widget,个别属性调整一下,fill和expand用好,加控件时pack靠start或靠end,最后试运行调整一下就可以了。

        Dim window As Gtk.Window = New Gtk.Window("Buttons")
        AddHandler window.DeleteEvent, AddressOf OnDeleteEvent
        window.BorderWidth = 0

        window.Resize(800, 600)
        window.WindowPosition = WindowPosition.Center

        Dim box1 As VBox = New VBox(False, 10)
        window.Add(box1)
        box1.Show()
        box1.Homogeneous = False

        Dim box2 As VBox = New VBox(False, 10)
        box2.BorderWidth = 10
        box1.PackStart(box2, True, True, 0)
        box2.Show()

        button1 = New Button("Button 1")
        box2.PackStart(button1, True, True, 0)
        button1.Show()
        AddHandler button1.Clicked, AddressOf OnButton1Clicked

        Dim button2 As Button = New Button("Button 2")
        'button2.Active = true
        box2.PackStart(button2, True, True, 0)
        button2.Show()

        Dim separator As HSeparator = New HSeparator()
        box1.PackStart(separator, False, True, 0)
        separator.Show()

        Dim box3 As VBox = New VBox(False, 10)
        box3.BorderWidth = 10
        box1.PackStart(box3, False, True, 0)

        Dim button3 As Button = New Button("Close")
        AddHandler button3.Clicked, AddressOf OnExitButtonEvent

        Dim entry1 As Entry = new Entry("Please")
        box3.PackStart(entry1, True, True, 0)
        entry1.Show()
        
        box3.PackStart(button3, True, True, 0)
        button3.CanDefault = True
        button3.GrabDefault()
        button3.Show()

Mono C#编程中,可以不关注Build后的内容,它们在另外一个.cs中。如果抽象一些理解的话,builder是图中的样子,像个黑盒子接线箱,编程时连通相应的信号即可。

C#有设计器还是比VB.NET方便一些,不过在C#中也可以使用VB.NET功能,在引用中加上:

using VB = Microsoft.VisualBasic

引用后即产生新的命名空间VB,比如在C#中使用VB.NET的文件读写,可以写成:

                VB.FileSystem.FileOpen(1, "VBNETTEST.TXT", VB.OpenMode.Output, VB.OpenAccess.Write, VB.OpenShare.Shared);
                VB.FileSystem.WriteLine(1, "Hello World! - 1");
                VB.FileSystem.WriteLine(1, "Hello World! - 2");
                VB.FileSystem.WriteLine(1, "Hello World! - 3");
                VB.FileSystem.WriteLine(1, "Hello World! - 4");
                VB.FileSystem.WriteLine(1, "Hello World! - 5");
                VB.FileSystem.FileClose(1);

微软的Microsoft.VisualBasic命名空间中VB.NET功能繁多,喜欢VB.NET编程的话可以把它引用到进程序中,Mono的C#设计器也就间接地支持VB.NET语言开发了。

用户程序

默认的MainWindow.cs产生MainWindow:Gtk.Window类,里面有个MainWindow()方法,方法中首先是Build(),自己的程序一般使用这个类,加入一些类内变量,在类内加入一些方法等。需要的话也可另僻空间,用另类,用另类方法等。

//MainWindow.cs

using System;
using Gtk;
using System.Threading.Tasks;
using VB = Microsoft.VisualBasic;
using Cairo;

public partial class MainWindow : Gtk.Window
{
    //Store previous background color of drawingarea1
    private Gdk.Color StoreColor = new Gdk.Color(255, 255, 255);
    private int iArea1ObjX = 10;
    private int iArea1ObjY = 50;
    private uint timerID1, timerID2;
    private ImageSurface surfacepub;
    private Context ctxpub;
    private Context ctxArea1;
    private int drawingarea1Width;
    private int drawingarea1Height;


    public MainWindow() : base(Gtk.WindowType.Toplevel)
    {
        Build();

        drawingarea1.AppPaintable = true;
        CreateContext();
        timerID1 = GLib.Timeout.Add(100, OnTimedEvent1);
        timerID2 = GLib.Timeout.Add(100, OnTimedEvent2);

        /*
        aTimer = new System.Timers.Timer(300);
        aTimer.Elapsed += OnTimedEvent;
        aTimer.AutoReset = true;
        aTimer.Enabled = true;
        */
    }

    protected void OnDeleteEvent(object sender, DeleteEventArgs a)
    {
        DestroyContext();
        Gtk.Application.Quit();
        a.RetVal = true;
    }

    protected void OnButton16Clicked(object sender, EventArgs e)
    {
        DestroyContext();
        Gtk.Application.Quit();
    }

    protected void OnColorbutton1ColorSet(object sender, EventArgs e)
    {
        var redcolor = colorbutton1.Color.Red;
        var greencolor = colorbutton1.Color.Green;
        var bluecolor = colorbutton1.Color.Blue;
    }

先写这么多,一些常用widgets使用方法在下篇心得中写。

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

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

相关文章

2.mac 安装 Visual studio code 整合go开发

目录 概述前置下载关键命令整合C#go配置go插件常见的go工具安装测试 结束 概述 mac 安装 Visual studio code 整合go开发 相关前置文章 go安装及相关配置 文章 前置 官网速递 mac 系统高于等于 10.15.x 可以直接最新版本 我的系统是 10.13 ,所以只能安装此版本…

JRTP实时音视频传输(2)-使用TCP通信的案例

1.创建自己的demo 先将example1拷贝为myclienttcp.cpp和myservertcp.cpp cp example1.cpp myclienttcp.cpp cp example1.cpp myservertcp.cpp 改写jrtplib/JRTPLIB/examples/CMakeLists.txt,添加myclienttcp和myservertcp编译 重新生成Makefile并编译 sudo cmak…

powershell脚本 判断NLB是否已安装

bat脚本:456.bat REM REM 解决下载的时候字符乱码的问题 chcp 65001 echo offREM 管理员运行powershell脚本 PUSHD %~DP0 & cd /d "%~dp0" %1 %2 mshta vbscript:createobject("shell.application").shellexecute("%~s0","…

白山云基于StarRocks数据库构建湖仓一体数仓的实践

背景 随着每天万亿级别的业务数据流向数据湖,数据湖的弊端也逐渐凸显出来,例如: 数据入湖时效性差:数据湖主要依赖于离线批量计算,通常不支持实时数据更新,因此无法保证数据的强一致性,造成数…

<软考高项备考>《论文专题 - 73 风险管理(5)》

5 过程4-实施定量风险分析 5.1 问题 4W1H过程做什么是就已识别的单个项目风险和不确定性的其他来源对整体项目目标的影响进行定量分析的过程。作用:1、量化整体项目风险最大可能性;2、提供额外的定量风险信息,以支持风险应对规划。为什么做了解风险对项目整体目标…

【STM32调试】寄存器调试不良问题记录持续版

STM32寄存器调试不良问题记录 NVIC(内嵌的中断向量控制器)EXTI(外部中断/事件) 记录一些stm32调试过程中:不易被理解、存在使用误区、不清不楚、是坑、使用常识等方面的一些记录。本记录只包含stm32的内核以及外设等寄…

node.js(express.js)+mysql实现注册功能

文章目录 实现步骤一、获取客户端提交到服务器的用户信息,对表单中的数据,进行合法性的效验 代码如下:二、检测用户名是否被占用三、对密码进行加密四、插入新用户(完整代码)总结 实现步骤 一、获取客户端提交到服务器的用户信息…

社交商业革命:Facebook Shops的崛起

近年来,社交媒体逐渐演变为不仅仅是社交的平台,更是商业活动的重要场所。在这个潮流的浪潮中,Facebook Shops的崛起正引领着一场社交商业的革命,为企业和消费者带来了全新的体验。 点击添加图片描述(最多60个字&#x…

0间隔24h采集线报+源码的资源网

一款网站程序零间隔24h采集线报源码的资源网,更新下载类目的采集 及 导入,这款网站程序:jizhiCMS 高仿新版某刀资源网模板进行自动采集。 安装方法: 将根目录文件上传服务器 将根目录文件的sql.sql导入mysql数据库 环境需要支…

Vue-19、Vue监测数据的原理_对象

1、数据代理 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>vue监测数据改变的的原理</title><script type"text/javascript" src"https://cdn.jsdelivr.net/npm/vue2/dist…

在线App封装技术:HTML5的新生命

HTML5封装的魅力所在HTML5带来了丰富的多媒体功能、地理位置服务、离线存储等特性&#xff0c;使得Web应用的体验更加接近原生App。封装HTML5到App中&#xff0c;可以大大缩短开发周期&#xff0c;降低开发成本&#xff0c;并且一次编写&#xff0c;多平台运行&#xff0c;极大…

西瓜书读书笔记整理(十一) —— 第十一章 特征选择与稀疏学习

第十一章 特征选择与稀疏学习 11.1 子集搜索与评价11.1.1 基本概念11.1.2 为什么要进行特征选择11.1.3 特征选择的两个关键环节11.1.4 常见的特征选择方法11.1.5 其他问题 11.2 过滤式选择11.2.1 什么是过滤式选择方法11.2.2 过滤式选择的优缺点 11.3 包裹式选择11.3.1 什么是包…

Spring 中 HttpServletRequest 作为成员变量是安全的吗?

在使用spring框架开发的时候&#xff0c;经常会在controller类中看到 HttpServletRequest 对象参数&#xff0c;一般我们都是直接使用&#xff0c;但是它是何时、怎么注入到 spring 容器的呢 &#xff1f;另外以成员变量注入的 request 是线程安全的吗 ? Controller public c…

Tuxera NTFS2024下载使用详细操作教程

你是否还在为Mac不能正常读写NTFS格式分区而感到苦恼呢&#xff1f;想要适合Mac系统使用来回转换磁盘格式又十分麻烦&#xff0c;这该怎么办呢&#xff0c;有了这款软件Tuxera ntfs就能马上帮你解决目前遇到的问题。 Tuxera NTFS2024最新免费版下载如下&#xff1a; https://…

mysql从库重新搭建的流程

背景 生产环境上的主从集群&#xff0c;因为一些异常原因&#xff0c;导致主从同步失败。现记录下通过重做mysql从库的方式来解决&#xff0c;重做过程不影响主库。 步骤 1、在主库上的操作步骤 备份主库所有数据&#xff0c;并将dump.sql文件拷贝到从库/tmp目录 mysqldump …

Verilog刷题笔记17

题目&#xff1a; For hardware synthesis, there are two types of always blocks that are relevant: Combinational: always (*) Clocked: always (posedge clk) Clocked always blocks create a blob of combinational logic just like combinational always blocks, but …

SQL-窗口函数

什么是窗口函数 可以像聚合函数一样对一组数据进行分析并返回结果&#xff0c;二者的不同之处在于&#xff0c;窗口函数不是将一组数据汇总成单个结果&#xff0c;而是为每一行数据都返回一个结果。 窗口函数组成部分 1.创建数据分区 窗口函数OVER子句中的PARTITION BY选项用…

顶顶通呼叫中心中间件自动外呼来电转人工显示被叫号码而不是显示路由条件 :一步步配置(mod_cti基于FreeSWITCH)

介绍 顶顶通呼叫中心中间件自动外呼来电转人工显示被叫号码而不是显示自动外呼的路由条件&#xff0c;可以是默认的被叫号码也可以改为显示指定的号码 一、显示默认被叫 1、配置拨号方案 打开ccadmin-》点击拨号方案-》找到进入排队-》配置跟图中一样的通道变量。修改了拨号…

一篇综述洞悉医学大型语言模型的原理,应用和挑战

在过去的一年中&#xff0c;随着 GPT-4、LLaMA、Mistral&#xff0c;PaLM 等先进技术的突飞猛进&#xff0c;大型语言模型&#xff08;Large Language Models&#xff09;已经引领全球人工智能进入了一个全新的基础模型时代&#xff0c;这一时代不仅开启了技术创新的新篇章&…

7.5 MySQL对数据的增改删操作(❤❤❤)

7.5 MySQL对数据的基本操作 1. 提要2. 数据添加2.1 insert语法2.2 insert 子查询2.3 ignore关键字 3. 数据修改3.1 update语句3.2 update表连接 4. 数据删除4.1 delete语句4.2 delete表连接4.3 快速删除数据表全部数据 1. 提要 2. 数据添加 2.1 insert语法 2.2 insert 子查询 …