精华内容
下载资源
问答
  • 第一个问题:只要禁止了非客户区的双击消息即可实现 (1)添加WM_NCLBUTTONDBLCLK事件处理函数 (2)在相应的函数处理中注释掉一下代码,不然父类默认处理 第二个问题做法有很多,我这里还要求最小...

    做项目中遇到了这两个问题,主要是对非客户区的处理,现在把做法写出来,

    第一个问题:只要禁止了非客户区的双击消息即可实现

    (1)添加WM_NCLBUTTONDBLCLK事件处理函数


    (2)在相应的函数处理中注释掉一下代码,不然父类默认处理



    第二个问题做法有很多,我这里还要求最小按钮和关闭按钮可用,不点击最小化按钮和关闭按钮就禁止单击事件,我的做法如下

    (1)添加点击事件的消息

    (2)添加一下代码


    这里解释下:关闭按钮的id是SC_CLOSE,最小化按钮的ID是SC_MINIMIZE,我通过调试得知最小化按钮的hHitTest=8,关闭按钮的nHitTest=20,当等于8或者20时,处理点击消息,其他不出来,具体如上。

    展开全文
  • 1:真正意义上的无边框自定义标题栏,支持最小化最大化关闭,支持标题栏双击实现,支持鼠标拖动,支持鼠标在边框处拖动改变窗体大小,网络上的绝大部分都是扯蛋,要么不支持鼠标改变界面大小,要么鼠标移到其它按钮...
  • Qt 之 自定义窗口标题栏

    万次阅读 多人点赞 2016-12-06 23:20:44
    今天晚上就如何用Qt自定义窗口标题栏,写了一个小例子,比较基础,实用。在此分享一下。 首先Qt是跨平台的,所以在不同的平台上窗口的外观是不一样的。比如在windows平台上,用Qt显示的一个窗口就跟一般windows程序...

    Qt技术学习班开始了,更多精彩、好玩的内容等着你,赶紧报名吧! 群号:655815739


    一、简述

    今天晚上就如何用Qt自定义窗口标题栏,写了一个小例子,比较基础,实用。在此分享一下。

    首先Qt是跨平台的,所以在不同的平台上窗口的外观是不一样的。比如在windows平台上,用Qt显示的一个窗口就跟一般windows程序窗口的外观一致,如下图。

    这里写图片描述 这里写图片描述

    同时不同windows系统,窗口外观显示也不一致,上面左边是我在win8系统上显示的窗口右边是win7下显示的窗口。可以看出两个窗口外观差别很大,同时在win8系统中标题内容居中了,win7标题则靠左。为了 解决窗口外观在不同系统下不一致的问题,我们干脆去掉窗口自带的边框,Qt中直接用一下代码即可去除窗口边框效果

    this->setWindowFlags(Qt::FramelessWindowHint);

    这里写图片描述

    上图就是去除窗口边框后的效果图。这样是不是看起来奇怪,是不是没有了标题栏。

    一般情况下一个标题栏提供了窗口图标、窗口标题、最小化、最大化、关闭按钮等几个部分,这些对于一个窗口来说是十分重要的,窗口图标标志着这是一个什么程序,标题就表明这个窗口是干什么的,最小化、最大化、关闭等按钮则是用户对该窗口的操作。


    下图是QQ的几个窗口标题栏。可以看出QQ的窗口都用了同一个窗口图标,一看到这个标志就知道是QQ程序的窗口,同时每个窗口标题栏不同,代表着这个窗口的作用以及用户可以在窗口中进行什么样的操作。

    这里写图片描述


    QQ音乐的标题栏

    这里写图片描述

    有道词典的标题栏

    这里写图片描述

    PS软件的标题栏

    这里写图片描述

    以上几款软件的标题栏都涵盖了以上几个重要的组成部分。


    自定义标题栏的好处

    • 首先自定义标题栏解决了我们程序在不同平台乃至同一平台不同的版本中样式不同的问题,使用自定义标题栏,能够保证外观的一致性,这也是为什么像QQ、有道词典、360等软件都没有使用系统标题栏,都是自定义标题栏了。

    • 正是因为自定义标题栏,我们可以自定义不再受约束,想怎么设计就怎么设计。

    • 自定义标题栏可以使用自己设计的图标,当然比系统的图标要美观了,颜值当然更高了。

    下面就讲一讲如何用Qt实现自定义窗口标题栏。

    二、代码之路

    这个是之前模仿QQ做的一个登录界面窗口。

    这里写图片描述


    这里我们先看一下本程序中简单一点的效果图:

    这里写图片描述

    注意:

    本程序的BaseWindow是继承于QWidget,如果大家想要继承QMainWindow,则需要把BaseWindow的基类改为QMainWindow。


    // 标题栏类;

    mytitlebar.h

    #include <QWidget>
    #include <QLabel>
    #include <QPushButton>
    #include <QTimer>
    
    enum ButtonType
    {
        MIN_BUTTON = 0,         // 最小化和关闭按钮;
        MIN_MAX_BUTTON ,        // 最小化、最大化和关闭按钮;
        ONLY_CLOSE_BUTTON       // 只有关闭按钮;
    };
    
    class MyTitleBar : public QWidget
    {
        Q_OBJECT
    
    public:
        MyTitleBar(QWidget *parent);
        //这里parent没有给默认值NULL,保证在创建MyTitleBar对象时父指针必须得赋值;且赋值不为NULL;
        ~MyTitleBar();
    
        // 设置标题栏背景色及是否设置标题栏背景色透明;
        void setBackgroundColor(int r, int g, int b , bool isTransparent = false);
        // 设置标题栏图标;
        void setTitleIcon(QString filePath , QSize IconSize = QSize(25 , 25));
        // 设置标题内容;
        void setTitleContent(QString titleContent , int titleFontSize = 9);
        // 设置标题栏长度;
        void setTitleWidth(int width);
        // 设置标题栏上按钮类型;
        void setButtonType(ButtonType buttonType);
        // 设置标题栏中的标题是否会滚动;具体可以看效果;
        void setTitleRoll();
        // 设置窗口边框宽度;
        void setWindowBorderWidth(int borderWidth);
    
        // 保存/获取 最大化前窗口的位置及大小;
        void saveRestoreInfo(const QPoint point, const QSize size);
        void getRestoreInfo(QPoint& point, QSize& size);
    
    private:
        void paintEvent(QPaintEvent *event);
        void mouseDoubleClickEvent(QMouseEvent *event);
        void mousePressEvent(QMouseEvent *event);
        void mouseMoveEvent(QMouseEvent *event);
        void mouseReleaseEvent(QMouseEvent *event);
    
        // 初始化控件;
        void initControl();
        // 信号槽的绑定;
        void initConnections();
        // 加载样式文件;
        void loadStyleSheet(const QString &sheetName);
    
    signals:
        // 按钮触发的信号;
        void signalButtonMinClicked();
        void signalButtonRestoreClicked();
        void signalButtonMaxClicked();
        void signalButtonCloseClicked();
    
    private slots:
        // 按钮触发的槽;
        void onButtonMinClicked();
        void onButtonRestoreClicked();
        void onButtonMaxClicked();
        void onButtonCloseClicked();
        void onRollTitle();
    
    private:
        QLabel* m_pIcon;                    // 标题栏图标;
        QLabel* m_pTitleContent;            // 标题栏内容;
        QPushButton* m_pButtonMin;          // 最小化按钮;
        QPushButton* m_pButtonRestore;      // 最大化还原按钮;
        QPushButton* m_pButtonMax;          // 最大化按钮;
        QPushButton* m_pButtonClose;        // 关闭按钮;
    
        // 标题栏背景色;
        int m_colorR;
        int m_colorG;
        int m_colorB;
    
        // 最大化,最小化变量;
        QPoint m_restorePos;
        QSize m_restoreSize;
        // 移动窗口的变量;
        bool m_isPressed;
        QPoint m_startMovePos;
        // 标题栏跑马灯效果时钟;
        QTimer m_titleRollTimer;
        // 标题栏内容;
        QString m_titleContent;
        // 按钮类型;
        ButtonType m_buttonType;
        // 窗口边框宽度;
        int m_windowBorderWidth;
        // 标题栏是否透明;
        bool m_isTransparent;
    };
    

    mytitlebar.cpp

    #include "mytitlebar.h"
    #include <QHBoxLayout>
    #include <QPainter>
    #include <QFile>
    #include <QMouseEvent>
    
    #define BUTTON_HEIGHT 30        // 按钮高度;
    #define BUTTON_WIDTH 30         // 按钮宽度;
    #define TITLE_HEIGHT 30         // 标题栏高度;
    
    MyTitleBar::MyTitleBar(QWidget *parent)
        : QWidget(parent)
        , m_colorR(153)
        , m_colorG(153)
        , m_colorB(153)
        , m_isPressed(false)
        , m_buttonType(MIN_MAX_BUTTON)
        , m_windowBorderWidth(0)
        , m_isTransparent(false)
    {
        // 初始化;
        initControl();
        initConnections();
        // 加载本地样式 MyTitle.css文件;
        loadStyleSheet("MyTitle");
    }
    
    MyTitleBar::~MyTitleBar()
    {
    
    }
    
    // 初始化控件;
    void MyTitleBar::initControl()
    {
        m_pIcon = new QLabel;
        m_pTitleContent = new QLabel;
    
        m_pButtonMin = new QPushButton;
        m_pButtonRestore = new QPushButton;
        m_pButtonMax = new QPushButton;
        m_pButtonClose = new QPushButton;
    
        m_pButtonMin->setFixedSize(QSize(BUTTON_WIDTH, BUTTON_HEIGHT));
        m_pButtonRestore->setFixedSize(QSize(BUTTON_WIDTH, BUTTON_HEIGHT));
        m_pButtonMax->setFixedSize(QSize(BUTTON_WIDTH, BUTTON_HEIGHT));
        m_pButtonClose->setFixedSize(QSize(BUTTON_WIDTH, BUTTON_HEIGHT));
    
        m_pTitleContent->setObjectName("TitleContent");
        m_pButtonMin->setObjectName("ButtonMin");
        m_pButtonRestore->setObjectName("ButtonRestore");
        m_pButtonMax->setObjectName("ButtonMax");
        m_pButtonClose->setObjectName("ButtonClose");
    
        m_pButtonMin->setToolTip(QStringLiteral("最小化"));
        m_pButtonRestore->setToolTip(QStringLiteral("还原"));
        m_pButtonMax->setToolTip(QStringLiteral("最大化"));
        m_pButtonClose->setToolTip(QStringLiteral("关闭"));
    
        QHBoxLayout* mylayout = new QHBoxLayout(this);
        mylayout->addWidget(m_pIcon);
        mylayout->addWidget(m_pTitleContent);
    
        mylayout->addWidget(m_pButtonMin);
        mylayout->addWidget(m_pButtonRestore);
        mylayout->addWidget(m_pButtonMax);
        mylayout->addWidget(m_pButtonClose);
    
        mylayout->setContentsMargins(5, 0, 0, 0);
        mylayout->setSpacing(0);
    
        m_pTitleContent->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
        this->setFixedHeight(TITLE_HEIGHT);
        this->setWindowFlags(Qt::FramelessWindowHint);
    }
    
    // 信号槽的绑定;
    void MyTitleBar::initConnections()
    {
        connect(m_pButtonMin, SIGNAL(clicked()), this, SLOT(onButtonMinClicked()));
        connect(m_pButtonRestore, SIGNAL(clicked()), this, SLOT(onButtonRestoreClicked()));
        connect(m_pButtonMax, SIGNAL(clicked()), this, SLOT(onButtonMaxClicked()));
        connect(m_pButtonClose, SIGNAL(clicked()), this, SLOT(onButtonCloseClicked()));
    }
    
    // 设置标题栏背景色,在paintEvent事件中进行绘制标题栏背景色;
    // 在构造函数中给了默认值,可以外部设置颜色值改变标题栏背景色;
    void MyTitleBar::setBackgroundColor(int r, int g, int b, bool isTransparent)
    {
        m_colorR = r;
        m_colorG = g;
        m_colorB = b;
        m_isTransparent = isTransparent;
        // 重新绘制(调用paintEvent事件);
        update();
    }
    
    // 设置标题栏图标;
    void MyTitleBar::setTitleIcon(QString filePath, QSize IconSize)
    {
        QPixmap titleIcon(filePath);
        m_pIcon->setPixmap(titleIcon.scaled(IconSize));
    }
    
    // 设置标题内容;
    void MyTitleBar::setTitleContent(QString titleContent, int titleFontSize)
    {
        // 设置标题字体大小;
        QFont font = m_pTitleContent->font();
        font.setPointSize(titleFontSize);
        m_pTitleContent->setFont(font);
        // 设置标题内容;
        m_pTitleContent->setText(titleContent);
        m_titleContent = titleContent;
    }
    
    // 设置标题栏长度;
    void MyTitleBar::setTitleWidth(int width)
    {
        this->setFixedWidth(width);
    }
    
    // 设置标题栏上按钮类型;
    // 由于不同窗口标题栏上的按钮都不一样,所以可以自定义标题栏中的按钮;
    // 这里提供了四个按钮,分别为最小化、还原、最大化、关闭按钮,如果需要其他按钮可自行添加设置;
    void MyTitleBar::setButtonType(ButtonType buttonType)
    {
        m_buttonType = buttonType;
    
        switch (buttonType)
        {
        case MIN_BUTTON:
            {
                m_pButtonRestore->setVisible(false);
                m_pButtonMax->setVisible(false);
            }
            break;
        case MIN_MAX_BUTTON:
            {
                m_pButtonRestore->setVisible(false);
            }
            break;
        case ONLY_CLOSE_BUTTON:
            {
                m_pButtonMin->setVisible(false);
                m_pButtonRestore->setVisible(false);
                m_pButtonMax->setVisible(false);
            }
            break;
        default:
            break;
        }
    }
    
    // 设置标题栏中的标题是否会自动滚动,跑马灯的效果;
    // 一般情况下标题栏中的标题内容是不滚动的,但是既然自定义就看自己需要嘛,想怎么设计就怎么搞O(∩_∩)O!
    void MyTitleBar::setTitleRoll()
    {
        connect(&m_titleRollTimer, SIGNAL(timeout()), this, SLOT(onRollTitle()));
        m_titleRollTimer.start(200);
    }
    
    // 设置窗口边框宽度;
    void MyTitleBar::setWindowBorderWidth(int borderWidth)
    {
        m_windowBorderWidth = borderWidth;
    }
    
    // 保存窗口最大化前窗口的位置以及大小;
    void MyTitleBar::saveRestoreInfo(const QPoint point, const QSize size)
    {
        m_restorePos = point;
        m_restoreSize = size;
    }
    
    // 获取窗口最大化前窗口的位置以及大小;
    void MyTitleBar::getRestoreInfo(QPoint& point, QSize& size)
    {
        point = m_restorePos;
        size = m_restoreSize;
    }
    
    // 绘制标题栏背景色;
    void MyTitleBar::paintEvent(QPaintEvent *event)
    {
        // 是否设置标题透明;
        if (!m_isTransparent)
        {
            //设置背景色;
            QPainter painter(this);
            QPainterPath pathBack;
            pathBack.setFillRule(Qt::WindingFill);
            pathBack.addRoundedRect(QRect(0, 0, this->width(), this->height()), 3, 3);
            painter.setRenderHint(QPainter::Antialiasing, true);
            painter.fillPath(pathBack, QBrush(QColor(m_colorR, m_colorG, m_colorB)));
        }   
    
        // 当窗口最大化或者还原后,窗口长度变了,标题栏的长度应当一起改变;
        // 这里减去m_windowBorderWidth ,是因为窗口可能设置了不同宽度的边框;
        // 如果窗口有边框则需要设置m_windowBorderWidth的值,否则m_windowBorderWidth默认为0;
        if (this->width() != (this->parentWidget()->width() - m_windowBorderWidth))
        {
            this->setFixedWidth(this->parentWidget()->width() - m_windowBorderWidth);
        }
        QWidget::paintEvent(event);
    }
    
    // 双击响应事件,主要是实现双击标题栏进行最大化和最小化操作;
    void MyTitleBar::mouseDoubleClickEvent(QMouseEvent *event)
    {
        // 只有存在最大化、还原按钮时双击才有效;
        if (m_buttonType == MIN_MAX_BUTTON)
        {
            // 通过最大化按钮的状态判断当前窗口是处于最大化还是原始大小状态;
            // 或者通过单独设置变量来表示当前窗口状态;
            if (m_pButtonMax->isVisible())
            {
                onButtonMaxClicked();
            }
            else
            {
                onButtonRestoreClicked();
            }
        }   
    
        return QWidget::mouseDoubleClickEvent(event);
    }
    
    // 以下通过mousePressEvent、mouseMoveEvent、mouseReleaseEvent三个事件实现了鼠标拖动标题栏移动窗口的效果;
    void MyTitleBar::mousePressEvent(QMouseEvent *event)
    {
        if (m_buttonType == MIN_MAX_BUTTON)
        {
            // 在窗口最大化时禁止拖动窗口;
            if (m_pButtonMax->isVisible())
            {
                m_isPressed = true;
                m_startMovePos = event->globalPos();
            }
        }
        else
        {
            m_isPressed = true;
            m_startMovePos = event->globalPos();
        }
    
        return QWidget::mousePressEvent(event);
    }
    
    void MyTitleBar::mouseMoveEvent(QMouseEvent *event)
    {
        if (m_isPressed)
        {
            QPoint movePoint = event->globalPos() - m_startMovePos;
            QPoint widgetPos = this->parentWidget()->pos();
            m_startMovePos = event->globalPos();
            this->parentWidget()->move(widgetPos.x() + movePoint.x(), widgetPos.y() + movePoint.y());
        }
        return QWidget::mouseMoveEvent(event);
    }
    
    void MyTitleBar::mouseReleaseEvent(QMouseEvent *event)
    {
        m_isPressed = false;
        return QWidget::mouseReleaseEvent(event);
    }
    
    // 加载本地样式文件;
    // 可以将样式直接写在文件中,程序运行时直接加载进来;
    void MyTitleBar::loadStyleSheet(const QString &sheetName)
    {
        QFile file(":/Resources/" + sheetName + ".css");
        file.open(QFile::ReadOnly);
        if (file.isOpen())
        {
            QString styleSheet = this->styleSheet();
            styleSheet += QLatin1String(file.readAll());
            this->setStyleSheet(styleSheet);
        }
    }
    
    // 以下为按钮操作响应的槽;
    void MyTitleBar::onButtonMinClicked()
    {
        emit signalButtonMinClicked();
    }
    
    void MyTitleBar::onButtonRestoreClicked()
    {
        m_pButtonRestore->setVisible(false);
        m_pButtonMax->setVisible(true);
        emit signalButtonRestoreClicked();
    }
    
    void MyTitleBar::onButtonMaxClicked()
    {
        m_pButtonMax->setVisible(false);
        m_pButtonRestore->setVisible(true);
        emit signalButtonMaxClicked();
    }
    
    void MyTitleBar::onButtonCloseClicked()
    {
        emit signalButtonCloseClicked();
    }
    
    // 该方法主要是让标题栏中的标题显示为滚动的效果;
    void MyTitleBar::onRollTitle()
    {
        static int nPos = 0;
        QString titleContent = m_titleContent;
        // 当截取的位置比字符串长时,从头开始;
        if (nPos > titleContent.length())
            nPos = 0;
    
        m_pTitleContent->setText(titleContent.mid(nPos));
        nPos++;
    }
    

    // 窗口基类;

    basewindow.h

    #include <QWidget>
    #include "mytitlebar.h"
    
    class BaseWindow : public QWidget
    {
        Q_OBJECT
    
    public:
        BaseWindow(QWidget *parent = 0);
        ~BaseWindow();
    
    private:
        void initTitleBar();
        void paintEvent(QPaintEvent *event);
        void loadStyleSheet(const QString &sheetName);
    
    private slots:
        void onButtonMinClicked();
        void onButtonRestoreClicked();
        void onButtonMaxClicked();
        void onButtonCloseClicked();
    
    protected:
        MyTitleBar* m_titleBar;
    
    };

    basewindow.cpp

    #include "basewindow.h"
    #include <QDesktopWidget>
    #include <QApplication>
    #include <QPainter>
    #include <QFile>
    
    BaseWindow::BaseWindow(QWidget *parent)
        : QWidget(parent)
    {
        // FramelessWindowHint属性设置窗口去除边框;
        // WindowMinimizeButtonHint 属性设置在窗口最小化时,点击任务栏窗口可以显示出原窗口;
        this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowMinimizeButtonHint);
        // 设置窗口背景透明;
        setAttribute(Qt::WA_TranslucentBackground);
    
        // 注意!!!如果是主窗口不要设置WA_DeleteOnClose属性;
        // 关闭窗口时释放资源;
        setAttribute(Qt::WA_DeleteOnClose);
        // 初始化标题栏;
        initTitleBar();
    }
    
    BaseWindow::~BaseWindow()
    {
    
    }
    
    void BaseWindow::initTitleBar()
    {
        m_titleBar = new MyTitleBar(this);
        m_titleBar->move(0, 0);
    
        connect(m_titleBar, SIGNAL(signalButtonMinClicked()), this, SLOT(onButtonMinClicked()));
        connect(m_titleBar, SIGNAL(signalButtonRestoreClicked()), this, SLOT(onButtonRestoreClicked()));
        connect(m_titleBar, SIGNAL(signalButtonMaxClicked()), this, SLOT(onButtonMaxClicked()));
        connect(m_titleBar, SIGNAL(signalButtonCloseClicked()), this, SLOT(onButtonCloseClicked()));
    
    }
    
    void BaseWindow::paintEvent(QPaintEvent* event)
    {
        //设置背景色;
        QPainter painter(this);
        QPainterPath pathBack;
        pathBack.setFillRule(Qt::WindingFill);
        pathBack.addRoundedRect(QRect(0, 0, this->width(), this->height()), 3, 3);
        painter.setRenderHint(QPainter::SmoothPixmapTransform, true);
        painter.fillPath(pathBack, QBrush(QColor(238, 223, 204)));
    
        return QWidget::paintEvent(event);
    }
    
    void BaseWindow::loadStyleSheet(const QString &sheetName)
    {
        QFile file(":/Resources/" + sheetName + ".css");
        file.open(QFile::ReadOnly);
        if (file.isOpen())
        {
            QString styleSheet = this->styleSheet();
            styleSheet += QLatin1String(file.readAll());
            this->setStyleSheet(styleSheet);
        }
    }
    
    void BaseWindow::onButtonMinClicked()
    {
        showMinimized();
    }
    
    void BaseWindow::onButtonRestoreClicked()
    {
        QPoint windowPos;
        QSize windowSize;
        m_titleBar->getRestoreInfo(windowPos, windowSize);
        this->setGeometry(QRect(windowPos, windowSize));
    }
    
    void BaseWindow::onButtonMaxClicked()
    {
        m_titleBar->saveRestoreInfo(this->pos(), QSize(this->width(), this->height()));
        QRect desktopRect = QApplication::desktop()->availableGeometry();
        QRect FactRect = QRect(desktopRect.x() - 3, desktopRect.y() - 3, desktopRect.width() + 6, desktopRect.height() + 6);
        setGeometry(FactRect);
    }
    
    void BaseWindow::onButtonCloseClicked()
    {
        close();
    }

    以上代码实现了自定义标题栏,新建的窗口类直接继承BaseWindow类,并对标题栏进行设置即可,下面就测试一下吧!

    测试代码

    NoFocusWidget.cpp

    #include "nofocuswidget.h"
    
    NoFocusWidget::NoFocusWidget(QWidget *parent)
        : BaseWindow(parent)
    {
        ui.setupUi(this);
        // 初始化标题栏;
        initTitleBar();
    }
    
    NoFocusWidget::~NoFocusWidget()
    {
    
    }
    
    void NoFocusWidget::initTitleBar()
    {
        // 设置标题栏跑马灯效果,可以不设置;
        m_titleBar->setTitleRoll();
    
        m_titleBar->setTitleIcon(":/Resources/titleicon.png");
        m_titleBar->setTitleContent(QStringLiteral("前行中的小猪-前行之路还需前行"));
        m_titleBar->setButtonType(MIN_MAX_BUTTON);
        m_titleBar->setTitleWidth(this->width());
    }
    

    main.cpp

    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        NoFocusWidget w;
        w.show();
        return a.exec();
    }

    NoFocusWidget为新建的窗口类,通过继承了BaseWindow类,并在initTitleBar()方法中对标题栏进行设置即可。下图为NoFocusWidget窗口的设计图

    这里写图片描述


    动态效果图

    这里写图片描述


    最大化、还原效果图

    这里写图片描述


    注意

    如果在设置窗口属性时不加上Qt::FramelessWindowHint 就是左图效果。

    this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowMinimizeButtonHint);

    这里写图片描述

    如果不加上 Qt::WindowMinimizeButtonHint 就是左图效果。加上之后可以看右图效果。

    这里写图片描述 这里写图片描述


    以上代码用Qt实现了自定义窗口标题栏,代码很简单,但是很实用,可以应用到每一个窗口中去,保持每个窗口外观的一致性,同时自定义的标题栏也比系统自带的漂亮很多,所以还是非常实用的。

    目前我们在MyTitleBar类以及BaseWindow类中只添加了一些基础功能,小伙伴们可以根据需要添加更多自定义的功能,而其他窗口只需继承BaseWindow类即可。

    欢迎大家一起交流 O(∩_∩)O!

    #代码下载

    Qt 实现 自定义窗口标题栏

    展开全文
  • c#自定义标题栏

    千次阅读 2019-10-16 16:24:19
    最近在编写C/S结构应用程序时,感觉窗体的标题栏样式太死板了,标题文字不能更改大小、颜色、字体等,按钮不能隐藏等问题,在网上也查找了许多相关的资料,没有找到合适的解决方案,发现许多人也在寻求这个问题,...

    最近在编写C/S结构应用程序时,感觉窗体的标题栏样式太死板了,标题文字不能更改大小、颜色、字体等,按钮不能隐藏等问题,在网上也查找了许多相关的资料,没有找到合适的解决方案,发现许多人也在寻求这个问题,最后我决定自己研究动手画一个标题栏出来,经过今天一天的研究与编写,终于完成全部功能,现公布一下我的设计思路。

    一、去掉Form类自带的标题栏                         

          要去掉自带的标题栏有两种方法,第一方法是直接将FormBorderStyle设为 System.Windows.Forms.FormBorderStyle.None,但设置过后,窗体无法改变大小,考虑到后期这些功能还是需要的,所以我采用了第二种方法,第二种方法是可以忽略FormBorderStyle,只需要将ControlBox设为 false,并将Text设为空即可,这种方法隐藏标题栏,若FormBorderStyle不是固定模式,则可以通过拉伸窗体边框改变大小的。

    二、创建自定义窗体类                                     

    首先创建一个窗体,如下图:

    然后去掉Text默认的文字,并将ControlBox设为 false,此时标题栏将自动隐藏掉了,如下图:

    去掉标题栏后,就需要重画新的标题栏,画标题栏很简单,方法也很多,我这里是采用一个Panel,将Dock设为Top,让其项部固定,并设高度为30像素,再在其中添加三个按钮,依次为:button1(关闭),button2(最大化),button3(最小化),三个按钮的设为Size相同,且将Anchor都设为Top Right Bottom,这样就实现了让三个按钮在右边固定位置,如下图:

    界面部份已经完工,剩下的就是编写代码了,由于代码较多,我先将代码贴出来,稍后再讲解。

    复制代码

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace ZControls
    {
        /// <summary>
        /// Copyright Zuowenjun
        /// Site Url:http://www.zuowenjun.cn
        /// QQ:77321032
        /// Description:自定义窗体样式,实现标题可自定义化
        /// </summary>
        public partial class ZForm : Form
        {
            private bool moving = false;
            private Point oldMousePosition;
    
            public new FormBorderStyle FormBorderStyle
            {
                get
                {
                    return base.FormBorderStyle;
                }
                set
                {
                    if (value != FormBorderStyle.Sizable && value != FormBorderStyle.SizableToolWindow)
                    {
                        titlepanel.Controls.Remove(button2);
                    }
                    base.FormBorderStyle = value;
                }
            }
    
            #region 隐藏父类的属性,使其不可见
    
            [Browsable(false)]
            public new string Text
            {
                get
                {
                    return titlelabel.Text;
                }
                set
                { }
            }
    
            [Browsable(false)]
            public new bool ControlBox
            {
                get {
                    return false;
                }
                set
                {
                    base.ControlBox = false;
                }
            }
    
            #endregion
    
            [Browsable(true)]
            [EditorBrowsable(EditorBrowsableState.Always)]
            [Description("窗体标题")]
            public string Title
            {
                get { return titlelabel.Text; }
                set { titlelabel.Text = value; }
            }
    
    
    
            [Browsable(true)]
            [EditorBrowsable(EditorBrowsableState.Always)]
            [Description("窗体标题字体样式")]
            public Font TitleFont
            {
                get
                {
                    return titlelabel.Font;
                }
                set
                {
                    titlelabel.Font = value;
                }
            }
    
    
            [Browsable(true)]
            [EditorBrowsable(EditorBrowsableState.Always)]
            [Description("窗体标题字体颜色")]
            public Color TitleColor
            {
                get
                {
                    return titlelabel.ForeColor;
                }
                set
                {
                    titlelabel.ForeColor = value;
                }
            }
    
            [Browsable(true)]
            [EditorBrowsable(EditorBrowsableState.Always)]
            [Description("窗体标题栏背景色")]
            public Color TitleBarBackColor
            {
                get
                {
                    return titlepanel.BackColor;
                }
                set
                {
                    titlepanel.BackColor = value;
                }
            }
    
    
    
    
            public new bool MaximizeBox
            {
                get
                {
                    return titlepanel.Contains(button2);
                }
                set
                {
                    if (!value)
                    {
                        titlepanel.Controls.Remove(button2);
                    }
                    else if (!titlepanel.Contains(button2))
                    {
                        titlepanel.Controls.Add(button2);
                    }
                }
            }
    
            public new bool MinimizeBox
            {
                get
                {
                    return titlepanel.Contains(button3);
                }
                set
                {
                    if (!value)
                    {
                        titlepanel.Controls.Remove(button3);
                    }
                    else if (!titlepanel.Contains(button3))
                    {
                        titlepanel.Controls.Add(button3);
                    }
                }
            }
    
    
            private void ResetTitlePanel()
            {
                base.ControlBox = false;
                base.Text = null;
                SetToolTip(button1, "关闭");
                button2.Size = button1.Size;
                SetToolTip(button2, "最大化或还原");
                button3.Size = button1.Size;
                SetToolTip(button3, "最小化");
            }
    
            private void SetToolTip(Control ctrl, string tip)
            {
                new ToolTip().SetToolTip(ctrl, tip);
            }
            public ZForm()
            {
                InitializeComponent();
                ResetTitlePanel();
            }
    
            private void Titlebutton_Click(object sender, EventArgs e)
            {
                Button btn = (Button)sender;
                switch (btn.Tag.ToString())
                {
                    case "close":
                        {
                            this.Close();
                            break;
                        }
                    case "max":
                        {
                            if (this.WindowState == FormWindowState.Maximized)
                            {
                                this.WindowState = FormWindowState.Normal;
                            }
                            else
                            {
                                this.WindowState = FormWindowState.Maximized;
                            }
                            break;
                        }
                    case "min":
                        {
                            if (this.WindowState != FormWindowState.Minimized)
                            {
                                this.WindowState = FormWindowState.Minimized;
                            }
                            break;
                        }
                }
            }
    
            private void Titlepanel_MouseDown(object sender, MouseEventArgs e)
            {
                if (this.WindowState == FormWindowState.Maximized)
                {
                    return;
                }
                //Titlepanel.Cursor = Cursors.NoMove2D;
                oldMousePosition = e.Location;
                moving = true;
            }
    
            private void Titlepanel_MouseUp(object sender, MouseEventArgs e)
            {
                //Titlepanel.Cursor = Cursors.Default;
                moving = false;
            }
    
            private void Titlepanel_MouseMove(object sender, MouseEventArgs e)
            {
                if (e.Button == MouseButtons.Left && moving)
                {
                    Point newPosition = new Point(e.Location.X - oldMousePosition.X, e.Location.Y - oldMousePosition.Y);
                    this.Location += new Size(newPosition);
                }
            }
    
            private void Titlepanel_DoubleClick(object sender, EventArgs e)
            {
                if (titlepanel.Contains(button2))
                {
                    button2.PerformClick();
                }
            }
    
            private void titlepanel_ControlRemoved(object sender, ControlEventArgs e)
            {
                switch (e.Control.Name)
                {
                    case "button2":
                        {
                            if (titlepanel.Contains(button3))
                            {
                                button3.Left = button1.Left - button1.Width;
                            }
                            break;
                        }
                }
            }
    
            private void titlepanel_ControlAdded(object sender, ControlEventArgs e)
            {
                switch (e.Control.Name)
                {
                    case "button2":
                        {
                            if (titlepanel.Contains(button3))
                            {
                                button3.Left = button2.Left - button2.Width;
                            }
                            break;
                        }
                    case "button3":
                        {
                            if (titlepanel.Contains(button2))
                            {
                                button3.Left = button2.Left - button2.Width;
                            }
                            break;
                        }
                }
            }
    
        }
    }

    复制代码

    以下是系统自动生成的代码:

    复制代码

    namespace ZControls
    {
        partial class ZForm
        {
            /// <summary>
            /// 必需的设计器变量。
            /// </summary>
            private System.ComponentModel.IContainer components = null;
    
            /// <summary>
            /// 清理所有正在使用的资源。
            /// </summary>
            /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
            protected override void Dispose(bool disposing)
            {
                if (disposing && (components != null))
                {
                    components.Dispose();
                }
                base.Dispose(disposing);
            }
    
            #region Windows 窗体设计器生成的代码
    
            /// <summary>
            /// 设计器支持所需的方法 - 不要
            /// 使用代码编辑器修改此方法的内容。
            /// </summary>
            private void InitializeComponent()
            {
                this.titlepanel = new System.Windows.Forms.Panel();
                this.titlelabel = new System.Windows.Forms.Label();
                this.button3 = new System.Windows.Forms.Button();
                this.button2 = new System.Windows.Forms.Button();
                this.button1 = new System.Windows.Forms.Button();
                this.titlepanel.SuspendLayout();
                this.SuspendLayout();
                // 
                // titlepanel
                // 
                this.titlepanel.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(192)))), ((int)(((byte)(0)))));
                this.titlepanel.Controls.Add(this.titlelabel);
                this.titlepanel.Controls.Add(this.button3);
                this.titlepanel.Controls.Add(this.button2);
                this.titlepanel.Controls.Add(this.button1);
                this.titlepanel.Dock = System.Windows.Forms.DockStyle.Top;
                this.titlepanel.Location = new System.Drawing.Point(0, 0);
                this.titlepanel.Margin = new System.Windows.Forms.Padding(0);
                this.titlepanel.Name = "titlepanel";
                this.titlepanel.Size = new System.Drawing.Size(468, 30);
                this.titlepanel.TabIndex = 0;
                this.titlepanel.ControlAdded += new System.Windows.Forms.ControlEventHandler(this.titlepanel_ControlAdded);
                this.titlepanel.ControlRemoved += new System.Windows.Forms.ControlEventHandler(this.titlepanel_ControlRemoved);
                this.titlepanel.DoubleClick += new System.EventHandler(this.Titlepanel_DoubleClick);
                this.titlepanel.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Titlepanel_MouseDown);
                this.titlepanel.MouseMove += new System.Windows.Forms.MouseEventHandler(this.Titlepanel_MouseMove);
                this.titlepanel.MouseUp += new System.Windows.Forms.MouseEventHandler(this.Titlepanel_MouseUp);
                // 
                // titlelabel
                // 
                this.titlelabel.AutoSize = true;
                this.titlelabel.Location = new System.Drawing.Point(12, 9);
                this.titlelabel.Name = "titlelabel";
                this.titlelabel.Size = new System.Drawing.Size(0, 12);
                this.titlelabel.TabIndex = 3;
                // 
                // button3
                // 
                this.button3.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
                | System.Windows.Forms.AnchorStyles.Right)));
                this.button3.Font = new System.Drawing.Font("微软雅黑 Light", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
                this.button3.Location = new System.Drawing.Point(399, 4);
                this.button3.Name = "button3";
                this.button3.Size = new System.Drawing.Size(23, 23);
                this.button3.TabIndex = 2;
                this.button3.Tag = "min";
                this.button3.Text = "-";
                this.button3.UseVisualStyleBackColor = true;
                this.button3.Click += new System.EventHandler(this.Titlebutton_Click);
                // 
                // button2
                // 
                this.button2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
                | System.Windows.Forms.AnchorStyles.Right)));
                this.button2.Font = new System.Drawing.Font("微软雅黑 Light", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
                this.button2.Location = new System.Drawing.Point(421, 4);
                this.button2.Name = "button2";
                this.button2.Size = new System.Drawing.Size(23, 23);
                this.button2.TabIndex = 1;
                this.button2.Tag = "max";
                this.button2.Text = "□";
                this.button2.UseVisualStyleBackColor = true;
                this.button2.Click += new System.EventHandler(this.Titlebutton_Click);
                // 
                // button1
                // 
                this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
                | System.Windows.Forms.AnchorStyles.Right)));
                this.button1.Font = new System.Drawing.Font("微软雅黑 Light", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
                this.button1.Location = new System.Drawing.Point(442, 4);
                this.button1.Name = "button1";
                this.button1.Size = new System.Drawing.Size(23, 23);
                this.button1.TabIndex = 0;
                this.button1.Tag = "close";
                this.button1.Text = "X";
                this.button1.UseVisualStyleBackColor = true;
                this.button1.Click += new System.EventHandler(this.Titlebutton_Click);
                // 
                // ZForm
                // 
                this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
                this.ClientSize = new System.Drawing.Size(468, 246);
                this.ControlBox = false;
                this.Controls.Add(this.titlepanel);
                this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
                this.MaximizeBox = false;
                this.Name = "ZForm";
                this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
                this.titlepanel.ResumeLayout(false);
                this.titlepanel.PerformLayout();
                this.ResumeLayout(false);
    
            }
    
            #endregion
    
            private System.Windows.Forms.Panel titlepanel;
            private System.Windows.Forms.Button button3;
            private System.Windows.Forms.Button button2;
            private System.Windows.Forms.Button button1;
            private System.Windows.Forms.Label titlelabel;
        }
    }

    复制代码

    代码中FormBorderStyle覆盖父类的同名属性,主要是实现根据不同的窗体,能够自动调整标题栏按钮,因为当FormBorderStyle为FormBorderStyle.Sizable或FormBorderStyle.SizableToolWindow时,才需要最大化按钮,否则都是不需要的。不需要的情况下,将移除最大化按钮对象button2,

    titlepanel.Controls.Remove(button2);

    由于隐藏自带的标题栏需要确保Text属性为空,ControlBox为False,所以我这里采取了重写这两个属性,并加上Browsable(false),让其在编辑器中不可见。

    Title,TitleFont,TitleColor,TitleBarBackColor为新增自定义属性,分别用于设置标题文字,标题文字样式,标题文字颜色,标题栏背景色。

    重写MaximizeBox与MinimizeBox两个属性,使其根据设为True与False时,能相应的调整标题栏按钮。

    私有方法:ResetTitlePanel,用于重设标题栏按钮属性。

    方法Titlebutton_Click这个简单,主要用于实现标题栏上三个按钮点击时所要执行的操作。

    Titlepanel_MouseDown,Titlepanel_MouseUp ,Titlepanel_MouseMove 三个方法是用于实现点击鼠标右键并按住移动就能够移动窗体,Titlepanel_DoubleClick方法是实现双击时能够最大化或还原窗体功能。

    最后的titlepanel_ControlRemoved与titlepanel_ControlAdded,实现的功能是当增加或移除按钮时,调整按钮的位置。

    三、使用自定义窗体类                                     

    使用就比较简单了,先是新增一个窗体,然后将窗体类的父类由Form改为自定义窗体类(ZForm)即可,然后再切换到设计视图页面,是不是发现界面已经变化了呢,这时候就可以依据的想法灵活设置窗体标题栏样式,如下图:

    复制代码

        public partial class Form1 : ZControls.ZForm
        {
            public Form1()
            {
                InitializeComponent();
            }
        }

    复制代码

    将MaximizeBox设为False时,运行的效果,是不是有点爽啊!

    好了,都说完了,其实也很简单,我相信大部份高手都是不屑一看的,但此处只是作为一个学习与参考,可能大家有更好的方法,欢迎大家交流,共同进步。

    展开全文
  • 但是声明了又衍生了一个新的问题,你双击之后drag区域会把窗口最大化要么就是贴在左边,背景色变成黑色的(如果你使用了box-shadow的话)。不知道您的问题是否和我一样。坐了N多次梯子都没有找到漂亮的方案,什么ipc...

    本人问题描述:
    Electron无边框模式下,同时启用了:frame:false,transparent:true;这时候窗口是不可以拖动的。但是您想拖动的话,这时候您要在网页中给某个元素声明一个:-webkit-app-region: drag;
    但是声明了又衍生了一个新的问题,你双击之后drag区域会把窗口最大化要么就是贴在左边,背景色变成黑色的(如果你使用了box-shadow的话)。不知道您的问题是否和我一样。坐了N多次梯子都没有找到漂亮的方案,什么ipc发送鼠标偏移,什么嵌套div都试过了效果都不理想。研究了下官方文档总算是看到一丝曙光(我菜鸟一枚,勿喷)

    解决问题:Electron无边框模式下-webkit-app-region: drag;双击最大化的问题。
    废话不多说 使用以下api即可解决:

      mainWindow.setMenu(null)
      // 设置窗口是否可以由用户手动最大化。
      mainWindow.setMaximizable(false)
      // 设置用户是否可以调节窗口尺寸
      mainWindow.setResizable(false)
    
    展开全文
  • 由于Qt的原生窗口带有的标题栏无法定制,然而通常情况下我们需要自定义窗体上的关闭、最小化等按钮、背景,甚至需要不需要标题栏。在QtQuick实现去除标题栏,也即无边框很简单,只需要在Qml-Window中设置: flags: ...
  • 小甲鱼零基础入门学习python笔记

    万次阅读 多人点赞 2019-08-14 11:06:30
    像我们 Windows 那个 cmd 窗口,像 Linux 那个黑乎乎的命令窗口,他们都是 shell,利用他们,我们就可以给操作系统下达命令。同样的,我们可以利用 IDLE 这个 shell 与 Python 进行互动。 注:在 Python 中不能把两...
  • 运行结果: 2、关闭窗口按钮: 取消标题栏后,自定义关闭窗口按钮: //mainwindow.h //声明函数 public slots: void close_btn(); //关闭按钮的槽函数 //mainwindow.cpp中 //隐藏标题栏 setWindowFlags (Qt::...
  • 前端面试题

    万次阅读 多人点赞 2019-08-08 11:49:01
    补充按钮事件的函数,确认用户是否退出当前页面,确认之后关闭窗? 69 写出简单描述html标签(不带属性的开始标签和结束标签)的正则表达式,并将以下字符串中的html标签去除掉 70 完成foo()函数的内容,要求能够...
  • VC 模拟鼠标双击全屏窗口和单击按钮事件,这是个模拟程序,通过单击来模拟双击鼠标的效果,鼠标点击“双击标题栏”按钮后,即可将本窗口全屏显示,模拟出了双击窗口标题栏的效果。另外还模拟了单击关闭按钮的功能。
  • 测试开发笔记

    万次阅读 多人点赞 2019-11-14 17:11:58
    测试开发笔记 第一章 测试基础 7 什么是软件测试: 7 ★软件测试的目的、意义:(怎么做好软件测试) 7 3.软件生命周期: 7 第二章 测试过程 8 1.测试模型 8 H模型: 8 V模型 9 2.内部测试 10 ...
  • C#基础教程-c#实例教程,适合初学者

    万次阅读 多人点赞 2016-08-22 11:13:24
    可以在命令提示符窗口运行可执行文件Welcome.exe,屏幕上出现一行字符提示您输入姓名:请键入你的姓名:输入任意字符并按下回车键,屏幕将打印出欢迎信息:欢迎! 注意,和我们使用过的绝大多数编译器不同,在C#中...
  • 代码说明(1)主窗口(2)标题栏(3)完整代码(4)美化(QSS)3.源代码链接 1. 简述   这几天给老师做项目用到了PyQt5,说一些自己的想法,用python写qt界面我觉得如果懂C++和Qt是最好的,因为PyQt5没有相应的官方文档,我...
  • Winform自定义窗体样式,实现标题栏可灵活自定义 最近在编写C/S结构应用程序时,感觉窗体的标题栏样式太死板了,标题文字不能更改大小、颜色、字体等,按钮不能隐藏等问题,在网上也查找了许多相关的资料,没有找到...
  • 【MATLAB】MATLAB的基础知识

    千次阅读 多人点赞 2017-04-12 11:52:00
    方式一:双击操作系统桌面上的MATLAB快捷方式,即可启动并打开MATLAB命令窗口。 方式二:单击【开始】菜单,依次指向【程序】→【MATLAB】即可启动并打开MATLAB命令窗口。 2.MATLAB的退出 退出MATLAB非常简单,...
  • mac上的红绿灯 实现了无边框后,通过设置titleBarStyle属性,可以在mac上保留红绿灯,titleBarStyle的值可选: default:默认,标准灰色不透明的mac标题栏; hidden : 全尺寸内容窗口,保留标准的控制按钮; ...
  • Qt自定义标题栏 版权声明:若无来源注明,Techie亮博客文章均为原创。 转载请以链接形式标明本文标题和地址: ...1. 标题栏的最大化、最小化、关闭按钮图标 2. QToolBar基本使用 3. QToolBar控件局右...
  • MATLAB GUI界面编程——一些细节问题

    万次阅读 多人点赞 2019-01-06 22:59:58
    十二、自己绘制的GUI界面菜单保留MATLAB Figure窗口菜单的工具条 在 GUI 的 XXX_OpeningFcn() 函数下插入下面这行代码: set( hObject, 'toolbar', 'figure' ); % 在菜单显示figure工具条的内容 % ...
  • 在Windows中关闭窗口的几种快捷方法 方法一:ALT+F4。此方法是指先按住键盘上的ALT功能键不放,再按一下键盘上的F4键,则会关闭当前窗口。 如 果打开了多个窗口,则每按一次Alt+F4键就会关闭一个窗口。 方法二...
  • Dos命令讲解

    千次阅读 多人点赞 2018-08-21 21:47:07
    :在桌面或文件夹中建立一个文本文件,里面输入“cmd.”,保存后缀为.cmd或是.bat格式的,双击打开也可以进入DOS命令行 第四种 :.打开C:\Windows\System32目录,找到文件“cmd.exe”,双击它也可以打开DOS命令行 ...
  • win32gui用于关闭窗口程序(显示最大化最小化) Python调用(运行)外部程序 2019/3/7 在Python中可在脚本中直接使用其他脚本或程序 1 使用os.system(command)运行其他程序 : 参数 command 要执行的命令,...
  • Qt自定义标题栏

    2019-05-20 22:29:30
    1. 标题栏的最大化、最小化、关闭按钮图标 此类按钮建议使用QToolButton实现,图标可以自定义也可以用Qt自带的基础图标 QToolButton *toolButton_mini;//最小化 QToolButton *toolButton_max;//最大化 ...
  • 即可让鼠标在窗口标题栏拖动事件改为标题栏拖动事件。 但是这样的做法并不合理,因为标题栏如果有其他的左键单击/击、右键单/双击、甚至滚动事件处理,那么这些动作在非标题栏上也会响应。 这只是提供一个...
  • [AHK]双击关闭Chrome浏览器的标签页

    千次阅读 2020-07-01 20:09:30
    由于一直习惯了双击关闭标签页 + 滚轮切换标签页,因此更新后无法使用极度不适,最后通过百度 + 自己修改解决。 AutoHotkey 前往AutoHotkey的官方网站下载最新版本的 AutoHotkey 并安装。 AHK 脚本文件 原脚本...
  • Qt自定义外观--自定义标题栏窗口

    千次阅读 2011-12-13 17:13:58
    因为标题栏属于窗口管理器控制,也就受限于操作系统, 所以直接利用Qt来修改是不可行的! 通常情况下利用Qt我们 可以自定义标题栏, 这里提供一个简单的例子!  例子比较简, 大致思路是正常创建窗口后, 屏蔽...
  • 文章目录一、目标原型1. 目标2. 原型设计3. 原型初步实现二、...实现一个无边框窗口,包括最小化、最大化、关闭、拖动等功能 动态改变窗口大小,即在页面跳转的时候根据需要改变窗口大小 2. 原型设计 (1) ...
  • 将这段代码直接复制到主界面中即可 protected override void WndProc(ref Message m) { if (m.Msg == 0x112) { switch ((int)m.WParam) { //禁...
  • 2、基本思路是重载CMainFrame类的DefWindowProc()函数,并判断消息为:WM_NCPAINT,WM_NCACTIVATE,WM_NOTIFY的时候,调用自己的绘制窗口标题栏的函数。用GetSystemMetrics(SM_CSFRAME)和GetSystem
  • 一个表格上有许多列,双击每一列,打开一个窗口显示明细。但是关闭这个窗口之后,再想打开这个窗口,怎么点都没有反应。在代码里面加alert,发现第二次打开时,执行到open时,直接就跳过去了。然后在网上一查,才...
  • 1.窗口最大最小化按纽的控制 ①怎样在程序开始的时候让它最大化? ②vC++做出来的exe文件在窗体的右上方是没有最大化和最小化按钮的,怎样实现这一功能? ③如何在显示窗口时,使最大化按钮变灰? 解决...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,784
精华内容 3,913
关键字:

双击标题栏即可关闭窗口