精华内容
下载资源
问答
  • 但是拖动,双击标题栏时窗体就会缩小。烦死了+_+。 最后,终于找到了解决方法。 //禁止通过拖动,双击标题栏改变窗体大小。 public const int WM_NCLBUTTONDBLCLK = 0xA3; const int WM_NCLBUTTONDOWN = 0x00A1; ...
  • 但是拖动,双击标题栏时窗体就会缩小。烦死了+_+。最后,终于找到了解决方法。//禁止通过拖动,双击标题栏改变窗体大小。 public const int WM_NCLBUTTONDBLCLK = 0xA3; const int WM_NCLBUTTONDOWN =
    最近写windows窗体程序,发现一个烦人的问题。
    
    窗体初始化时禁用了最大化按钮,并使之最大化。本希望窗体一直保持最大化。但是拖动,双击标题栏时窗体就会缩小。烦死了+_+。
    
    最后,终于找到了解决方法。
    
    //禁止通过拖动,双击标题栏改变窗体大小。
        public const int WM_NCLBUTTONDBLCLK = 0xA3;
        const int WM_NCLBUTTONDOWN = 0x00A1;
        const int HTCAPTION = 2;
        protected override void WndProc(ref Message m)
        {
            if (m.Msg == WM_NCLBUTTONDOWN && m.WParam.ToInt32() == HTCAPTION)
                return;
            if (m.Msg == WM_NCLBUTTONDBLCLK)
                return;
    
                base.WndProc(ref m)·}
            }
         }
    
    展开全文
  • 第一个问题:只要禁止了非客户区的双击消息即可实现 (1)添加WM_NCLBUTTONDBLCLK事件处理函数 (2)在相应的函数处理中注释掉一下代码,不然父类默认处理 第二个问题做法有很多,我这里还要求最小...

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

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

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


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



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

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

    (2)添加一下代码


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

    展开全文
  • c#代码 protected override void WndProc(ref Message m) { //拦截双击标题栏、移动窗体的系统消息 if (m.Msg != 0xA3 && m.Msg != 0x0003 && m.WParam != (IntPtr)0xF012) {
    c#代码
    
    protected override void WndProc(ref Message m)
            {
                //拦截双击标题栏、移动窗体的系统消息
                if (m.Msg != 0xA3 && m.Msg != 0x0003 && m.WParam != (IntPtr)0xF012)
                {
                    base.WndProc(ref m);
                }
            }

    vb代码
    Protected Overrides Sub WndProc(ByRef m As Message)
    
            '拦截双击标题栏、移动窗体的系统消息
            If m.Msg <> Convert.ToInt32("0xA3", 16) And m.Msg <> Convert.ToInt32("0x0003", 16) And m.WParam <> CType(Convert.ToInt32("0xF012", 16), IntPtr) Then
                MyBase.WndProc(m)
            End If
    
        End Sub


    说明:

    拦截双击标题栏的系统信息:m.Msg<>0xA3

    拦截移动窗体的系统消息:m.Msg<> 0x0003 && m.WParam = (IntPtr)0xF012


    展开全文
  • qt5 自定义标题栏

    2015-03-20 18:16:39
    用qt5写的自定义标题栏,做相应的改变也可以在其他版本运行,去掉了系统默认的标题栏,自己实现关闭,最大化,最小化,双击最大化最小化功能,这对标题栏的美化有帮助
  • Win10正式版非活动窗口标题栏颜色修改 是一个注册表文件,直接双击导入win10 可以更改窗口标题颜色,明显区分活动窗口 和 前置窗口
  • 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 实现 自定义窗口标题栏

    展开全文
  • 无边框窗口,可以拖动,可以缩放,双击可以...可加上自定义图标、标题、最小最大化按钮、关闭按钮,实现自定义自绘标题栏,就可以模仿QQ聊天窗口界面或微信聊天窗口界面。 在 Windows7 64位平台上用 DevCPP 编译通过。
  • C# 中怎样不能拖动窗体,使其固定在一个位置。...using System.Windows.Forms; using System.Runtime.InteropServices; class Test : Form { const int MF_BYPOSITION = 0x0400; const int MF_REMO
  • c#自定义标题栏

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

    千次阅读 热门讨论 2018-11-22 16:31:24
    这里只讲标题栏的创建方法,透明效果与样式我会在下一次介绍。为了让大家能够看清楚效果,上图是我以桌面作为背景。 相信大家可能已经查了很多资料,或者说刚看到我的这篇博客,不过都没关系,因为,看完我这篇,...
  • 前言使用Qt自带的标题栏可能没有办法适合我们的需求,例如标题栏的颜色,标题栏的宽度、高度,标题栏的放大、缩小、还原、关闭按钮等都没有办法发生改变。因为默认的标题栏是和操作系统相关的、它会根据操作系统的...
  • case WM_NCLBUTTONDBLCLK://在非工作区双击右击 return 0; break; case WM_DESTROY: PostQuitMessage(0); break; case WM_TIMER: OnTimer(wParam, lParam); break; default: return ...
  • Qt5.9自定义标题栏用法

    千次阅读 2018-07-19 18:39:58
    本博客主要总结创建Qt工程时,不用系统自带的标题栏,而是用自定义的标题栏。其中,自定义标题栏主要原理是,屏蔽原来的标题栏,然后用QVBoxLayout垂直布局管理器,加载一个标题栏QWidget。其中,这个标题栏QWidget...
  • Qt 之自定义界面(添加自定义标题栏

    万次阅读 多人点赞 2016-01-21 14:58:12
    简述通过上节内容,我们实现了自定义窗体的移动,但是我们缺少一个标题栏来显示窗体的图标、标题,以及控制窗体最小化、最大化、关闭的按钮。自定义标题栏后,所有的控件我们都可以定制,比如:在标题栏中添加换肤、...
  • 标题所示:windows状态里显示实时网速 图如下 在这里插入图片描述 U:Upload-上传速度 D:Download-下载速度 接下来贴出我成功的步骤 下载网速检测模块netspeedmonitor,以下为下载地址,等待下载完成并解压 ...
  • pb单击标题栏对数据窗口数据排序。对于Windows操作系统的资源管理器,若查看方式为“详细资料”时,会显示文件或文件夹的四个属性:名称、大小、类型和修改时间,当单击其中一列时,就会按此列属性进行排序。在...
  • 填空题1、在Windows2000中,用于进行硬件设置的程序组是控制面板。2、若选定多个连续文件,应先单击选定第一个文件,然后按下Shift键,再单击要选定的最后一个文件;若要选定多个不连续的文件,可以在按下Ctrl键的...
  • 这篇文章应该是昨天的 , 昨天布局一个游戏代练平台的项目,因为界面的美观需要隐藏window自带的标题栏,重新自定义标题栏. 我想这种事情很多人都做过,现在大多数项目中都会为了用户体验而重新定义界面的布局. 当我去掉...
  • WPF中自制窗口标题栏

    2019-08-04 06:46:52
    在WPF程序开发中,我们常常会发现默认的窗口标题栏过于不...不过,这样一来又有一个问题,即模拟的标题栏毕竟不是真正的标题栏,按住它无法拖动窗口,也无法双击最大化。Aland Li提供了一个好办法解决这一问题。 Wi...
  • 【Win10】修改标题栏颜色

    千次阅读 2017-11-18 21:07:11
    Win10标题栏颜色有多种选择,但是默认的那个颜色却很难看。所以就有必要修改一下Win10窗口标题栏颜色,怎么修改呢?一起来看一下:  修改Win10标题栏颜色步骤  1、首先在win10系统打开文件夹到C:/...
  • 双击标题栏你可以处理WM_NCHITTEST这个消息,在添加这个消息响应函数时要注意,这个消息,不是在界面上,而在windows消息响应层上。下面是一个处理例子: UINT CTestDlg::OnNcHitTest(CPoint point) {//屏蔽双击...
  • wpf 窗口自定义标题栏

    2020-09-14 10:15:01
    XAML内容: ​ ​ 下面是标题拖动及缩放事件代码: ​ #region 标题事件 /// /// 关闭 /// /// /// private void btnClose_Click(object sender, RoutedEventArgs e) { this.Close(); } /// /// 窗口放大 /// /// //...
  • 简述在Windows 2000中获得帮助的几种方法。1)通过“开始”菜单的“帮助”命令获得帮助信息。2)用“这是什么”图标,在对话框中直接获取帮助。3)在命令提示符下,键人想获得“帮助”的命令名,后接4)通过应用程序的...
  • Winform自定义窗体样式,实现标题栏可灵活自定义 最近在编写C/S结构应用程序时,感觉窗体的标题栏样式太死板了,标题文字不能更改大小、颜色、字体等,按钮不能隐藏等问题,在网上也查找了许多相关的资料,没有找到...
  • 备注:缓存文件,复制以下内容到文本文件,保存为bat格式的文件,双击运行。重新生成应用程序即可。 rem 关闭Windows explorer taskkill /f /im explorer.exe rem 清理系统图标缓存数据库 attrib -h -s -r "%...
  • 屏蔽窗体标题栏双击和移动事件protected: virtual void WndProc( Message % m) override { __super::WndProc (m); if(m.Msg == 0x84 && m.Result == (System::IntPtr)2) // 不让拖动标题栏 {
  • //这个函数允许我们对 windows鼠标消息进行处理 对于基类函数的返回值 ...//也就是说 我们可以对鼠标消息做任意处理 比如 是菜单栏上的消息 我们可以返回标题栏的值 //对应的消息类型有如下 查找MSDN此函数的 值

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,710
精华内容 8,684
关键字:

windows7双击标题栏