1. pick gtk dll 程序的制作

news/2024/10/11 16:52:50/

文章目录

  • 前言
  • 预览
  • 细节要点
    • 初始窗口尺寸
    • 提示音
    • 快速提示信息对话框AlertDialog
    • 鼠标移入移出事件
    • 布局与父子控件关系
    • 图片
  • 后续
  • 源码及资源

前言

  • 在之前的打包测试中我提到了需要一个挑选dll的程序
  • 于是我打算用Gtk来制作这个程序

预览

image

细节要点

初始窗口尺寸

  • 只有主窗口有set_default_size()方法, 控件没有这个方法
  • 我发现Gtk的初始窗口大小和最小窗口大小限制 集合在同一个方法内:
    set_size_request()
  • 这就有问题了, 我需要程序(控件)一开始呈现足够可观的尺寸, 但不是最小只能是这个尺寸, 我希望后续能够调小
  • 于是我发现了size_allocate_vfunc这个虚函数,
    只要有窗口尺寸发生变化的事件一触发就会调用这个函数
    我们可override一下主窗口的这个虚函数, 在里面做你需要做的事
    那么上面的问题我只需再次set_size_request()便可解决
  • std::call_once函数可帮助我在整个程序生命期里只执行一次,虽然自己写一个bool判断也可以达成目的, 但std::call_once更方便可观, 而且用了mutex, 是线程安全的
    void size_allocate_vfunc(int width, int height, int baseline)override
    {std::cout << width << " " << height << " " << baseline << " " << std::endl;Gtk::Widget::size_allocate_vfunc(width, height, baseline);m_pMainPaned->set_position(width - 100);//设置第二个Paned的滑动柄位置m_pSubPaned->set_position(100);//设置第一个Paned的滑动柄位置 std::call_once(onceFlag, [this]{m_pMBox->set_size_request(100, 100);});
    }
    
  • 上面也设置了split窗口滑动柄位置也随着主窗口尺寸变化

提示音

  • 我发现不能像以前那样printf(“%c”,7);来发出蜂鸣器Beep~的声音
  • 于是我发现了
    //Beep(1000, 150); windows平台 需包含<windows.h>
    //gdk_surface_beep(this->get_surface()->gobj());//通用
    gdk_display_beep(this->get_display()->gobj());//通用
    
    Beep()的声音不太好听

快速提示信息对话框AlertDialog

void ExampleWindow::Hints(std::string Message, const std::function<void()> &callable) {auto tempDialog = Gtk::AlertDialog::create();// Reset values that may have been set by on_button_question_clicked().tempDialog->set_modal(true);tempDialog->set_message("提示.");tempDialog->set_detail(Message);tempDialog->set_buttons({"OK"});tempDialog->set_default_button(0); // OK button or Return keytempDialog->set_cancel_button(0); // Cancel button or Escape keytempDialog->choose(*this, [callable](const Glib::RefPtr<Gio::AsyncResult> &result) {if (callable) {callable();}});gdk_display_beep(this->get_display()->gobj());
}

鼠标移入移出事件

  • https://gnome.pages.gitlab.gnome.org/gtkmm-documentation/sec-eventsignals.html
  • 如果只是简单的点击事件那就不需要关心事件控制器
  • 但比如要鼠标移入时模糊
    void BG_blur() {auto controrller = Gtk::EventControllerMotion::create();controrller->signal_enter().connect([this](const double &a, const double &b) {std::cout << "enter" << std::endl;auto style = m_pBG_image->get_style_context();style->add_class("hovered");}, true);controrller->signal_leave().connect([this]() {std::cout << "leave" << std::endl;auto style = m_pBG_image->get_style_context();style->remove_class("hovered");}, true);m_pmainFrame->add_controller(controrller);
    };
    

布局与父子控件关系

  • 一般兄弟控件之间各占一块空间, 有些时候需要有能重叠的控件

  • 比如我需要给程序做背景图片怎么办?
    给父控件添加css属性 background-image: url(‘xxx.png’);?
    可以是可以, 但我一旦给它的图片加了一些css的动画效果, 会影响到它全部的子控件, 比如 filter: blur(5px);

  • 于是 Gtk::Overlay 被我找出来了
    有两个方法 set_child(A) 和add_overlay(B) 用来做重叠关系
    B总叠在A上面

    前需:
    A和B都不能有 parent 否则set_child 和 add_overlay 都将失败

    Cambalache中也直接提供 Gtk::Overlay 控件
    只需要把 B 放到它的下级目录就不用担心 B 有 parent
    A也同理
    也可以在 Cambalache 中设置她的子控件这样就不用在.cpp文件中再set_child()了:
    image
    只需要把它下级目录下某一个控件的id填入其中即可
    使其成为该overlay控件下 重叠顺序中最底层的控件

图片

  • 使用css背景图片是真方便
    background-image: url('GoolGirl2.png');
    background-position: right center;
    background-size: cover;
    
  • 但有时候要获取图片的原始尺寸做一些定制操作时就不那么方便了

后续

  • 还有一些gtk的控件我没有太深的了解
  • 还有搜索功能没有做
    • ctrl+f 搜索 ldd打印出来的未命中的dll的上下文

源码及资源

  • https://download.csdn.net/download/Computer_Tech/88829922

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

相关文章

postgresql 手动清理wal日志的101个坑

新年的第一天&#xff0c;总结下去年遇到的关于WAL日志清理的101个坑&#xff0c;以及如何相对安全地进行清理。前面是关于WAL日志堆积的原因分析&#xff0c;清理相关可以直接看第三部分。 首先说明&#xff0c;手动清理wal日志是一个高风险的操作&#xff0c;尤其对于带主从的…

python -m SimpleHTTPServer mac报错

错误内容&#xff1a; Traceback (most recent call last):File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/runpy.py", line 174, in _run_module_as_main"__main__", fname, loader, pkg_name)File "/System/Libra…

c#内置委托

C#语言中有许多内置的委托&#xff0c;其中一些是常用的&#xff0c;包括&#xff1a; Action&#xff1a;表示不带返回值的方法的委托。它可以接受多个参数&#xff0c;但不返回任何值。 Action<int, string> actionDelegate (x, y) > Console.WriteLine("Ac…

在spring中操作Redis

目录 创建项目 ​编辑 配置Redis 创建类 StringRedisTemplate set / get list set Hash zset 新年快乐&#xff01;&#xff01;&#xff01;&#xff01; 创建项目 选中maven项目&#xff0c;然后选择java8&#xff0c;输入名称之后&#xff0c;点击next。 随后选择…

大数据的基础探索之大数据时代

前言&#xff1a;大数据已经是大势所趋&#xff0c;在这个网络时代能够不断地整合资源的人本身也是一种能力拥有者&#xff0c;在这个时代&#xff0c;如果一个人可以掌握数据分析工具&#xff0c;利用好云计算的能力&#xff0c;对于自己的个人而言来说都是一个极其重要的参与…

Day45- 动态规划part13

一、最长递增子序列 题目一&#xff1a;300. 最长递增子序列​​​​​​​ ​​​​​​​300. 最长递增子序列 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数…

【微信小程序】微信小程序开发:从入门到精通

微信小程序开发&#xff1a;从入门到精通 一、开发准备二、小程序开发流程1、注册与创建项目2、开发页面3、配置4、调试与预览5、发布与审核 随着移动互联网的普及&#xff0c;微信小程序成为了越来越多企业和个人开发者的首选。小程序是一种无需下载安装即可使用的应用&#x…

MATLAB实现随机森林回归算法

随机森林回归是一种基于集成学习的机器学习算法&#xff0c;它通过组合多个决策树来进行回归任务。随机森林的基本思想是通过构建多个决策树&#xff0c;并将它们的预测结果进行平均或投票来提高模型的准确性和鲁棒性。 以下是随机森林回归的主要特点和步骤&#xff1a; 决策树…