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

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

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

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


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



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

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

    (2)添加一下代码


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

    展开全文
  • 去掉Qt窗口的标题边框,重新定义标题栏,可以在标题栏上实现更多的功能,能满足更多的开发需求,可以实现标题栏的拖动,双击,自定义放大缩小。  本文引用自:http://www.devbean.net/2011/10/custom-qt-titlebar/...

        去掉Qt窗口的标题边框,重新定义标题栏,可以在标题栏上实现更多的功能,能满足更多的开发需求,可以实现标题栏的拖动,双击,自定义放大缩小。

         本文引用自:http://www.devbean.net/2011/10/custom-qt-titlebar/,感谢原作者,本文对其进行了重新整理,并且修改了一些小问题。

        运行界面如下:


        详细代码如下:

    #include <QWidget>
    #include <QToolButton>
    #include <QPixmap>
    
    class XMainWindowTitle : public QWidget
    {
        Q_OBJECT
    public:
        XMainWindowTitle(QWidget *parent);
    
    public slots:
        void showSmall();
    
        void showMaxRestore();
    
    protected:
        void mousePressEvent(QMouseEvent *e);
        void mouseMoveEvent(QMouseEvent *e);
        void mouseDoubleClickEvent(QMouseEvent *e);
    
    private:
        QToolButton *minimize;
        QToolButton *maximize;
        QToolButton *close;
        QPixmap restorePix, maxPix;
        bool maxNormal;
        QPoint startPos;
        QPoint clickPos;
    };
    #include "XMainWindowTitle.h"
    #include <QHBoxLayout>
    #include <QMouseEvent>
    #include <QStyle>
    #include <QLabel>
    
    XMainWindowTitle::XMainWindowTitle(QWidget *parent)
    {
        // 不继承父组件的背景色
        setAutoFillBackground(true);
        // 使用 Highlight 作为背景色
        setBackgroundRole(QPalette::Highlight);
    
        minimize = new QToolButton(this);
        maximize = new QToolButton(this);
        close= new QToolButton(this);
    
        QPixmap pix = style()->standardPixmap(QStyle::SP_TitleBarCloseButton);
        close->setIcon(pix);
        close->setToolTip("close");
        close->setStyleSheet("QToolButton:hover{background-color:rgb(219,75,75);}");
    
        maxPix = style()->standardPixmap(QStyle::SP_TitleBarMaxButton);
        maximize->setIcon(maxPix);
        maximize->setToolTip("restore");
    
        pix = style()->standardPixmap(QStyle::SP_TitleBarMinButton);
        minimize->setIcon(pix);
        minimize->setToolTip("minsize");
    
        restorePix = style()->standardPixmap(QStyle::SP_TitleBarNormalButton);
    
        minimize->setMinimumSize(30,25);
        close->setMinimumSize(30,25);
        maximize->setMinimumSize(30,25);
    
        QLabel *label = new QLabel(this);
        label->setText("Window Title");
        parent->setWindowTitle("Window Title");
    
        QHBoxLayout *hbox = new QHBoxLayout(this);
    
        hbox->addWidget(label);
        hbox->addWidget(minimize);
        hbox->addWidget(maximize);
        hbox->addWidget(close);
    
        hbox->insertStretch(1, 500);
        hbox->setSpacing(0);
        setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
    
        maxNormal = false;
    
        connect(close, SIGNAL( clicked() ), parent, SLOT(close() ) );
        connect(minimize, SIGNAL( clicked() ), this, SLOT(showSmall() ) );
        connect(maximize, SIGNAL( clicked() ), this, SLOT(showMaxRestore() ) );
    }
    
    void XMainWindowTitle::showSmall()
    {
        parentWidget()->showMinimized();
    }
    
    void XMainWindowTitle::showMaxRestore()
    {
        if (maxNormal) {
            parentWidget()->showNormal();
            maxNormal = !maxNormal;
            maximize->setIcon(maxPix);
        } else {
            parentWidget()->showMaximized();
            maxNormal = !maxNormal;
            maximize->setIcon(restorePix);
        }
    }
    
    void XMainWindowTitle::mousePressEvent(QMouseEvent *e)
    {
        startPos = e->globalPos();
        clickPos = mapToParent(e->pos());
    }
    void XMainWindowTitle::mouseMoveEvent(QMouseEvent *e)
    {
        if (maxNormal)
            return;
        parentWidget()->move(e->globalPos() - clickPos);
    }
    
    void XMainWindowTitle::mouseDoubleClickEvent(QMouseEvent *e)
    {
        if(e->button() == Qt::LeftButton)
        {
            showMaxRestore();
        }
    }
    

    #include "XMainWindowTitle.h"
    #include <QFrame>
    
    class XMainWindow : public QFrame
    {
    public:
    
        XMainWindow();
    
        // 通过 getter 允许外界访问 frame 的 content 区域
        // 其它子组件应该添加到这里
        QWidget *contentWidget() const ;
    
        XMainWindowTitle *mainWindowTitle() const ;
    
    protected:
        void mousePressEvent(QMouseEvent *e);
    
        void mouseMoveEvent(QMouseEvent *e);
    
        void mouseReleaseEvent(QMouseEvent *e);
    
    private:
        XMainWindowTitle *titleBar;
        QWidget *content;
        QPoint oldPos;
        bool mouseDown;
        bool left, right, bottom;
    };
    #include "XMainWindow.h"
    #include <QVBoxLayout>
    #include <QMouseEvent>
    #include <QDebug>
    
    XMainWindow::XMainWindow()
    {
        mouseDown = false;
        setFrameShape(Panel);
    
        setWindowFlags(Qt::FramelessWindowHint);
        setMouseTracking(true);
    
        titleBar = new XMainWindowTitle(this);
        titleBar->setCursor(Qt::ArrowCursor);
    
        content = new QWidget(this);
    
        content->setMouseTracking(true);
        QVBoxLayout *vbox = new QVBoxLayout(this);
        vbox->addWidget(titleBar);
        vbox->setContentsMargins(0,0,0,0);
        vbox->setSpacing(0);
    
        QVBoxLayout *layout = new QVBoxLayout;
        layout->addWidget(content);
        layout->setContentsMargins(5,5,5,5);
        layout->setSpacing(0);
        vbox->addLayout(layout);
    }
    
    QWidget *XMainWindow::contentWidget() const { return content; }
    
    XMainWindowTitle *XMainWindow::mainWindowTitle() const { return titleBar; }
    
    void XMainWindow::mousePressEvent(QMouseEvent *e)
    {
        oldPos = e->pos();
        mouseDown = e->button() == Qt::LeftButton;
    }
    
    void XMainWindow::mouseMoveEvent(QMouseEvent *e)
    {
        int x = e->x();
        int y = e->y();
    
        if (mouseDown) {
            int dx = x - oldPos.x();
            int dy = y - oldPos.y();
    
            QRect g = geometry();
    
            if (left)
                g.setLeft(g.left() + dx);
            if (right)
                g.setRight(g.right() + dx);
            if (bottom)
                g.setBottom(g.bottom() + dy);
    
            setGeometry(g);
    
            oldPos = QPoint(!left ? e->x() : oldPos.x(), e->y());
        } else {
            QRect r = rect();
            left = qAbs(x - r.left()) <= 5;
            right = qAbs(x - r.right()) <= 5;
            bottom = qAbs(y - r.bottom()) <= 5;
            bool hor = left | right;
    
            if (hor && bottom) {
                if (left)
                    setCursor(Qt::SizeBDiagCursor);
                else
                    setCursor(Qt::SizeFDiagCursor);
            } else if (hor) {
                setCursor(Qt::SizeHorCursor);
            } else if (bottom) {
                setCursor(Qt::SizeVerCursor);
            } else {
                setCursor(Qt::ArrowCursor);
            }
        }
    }
    
    void XMainWindow::mouseReleaseEvent(QMouseEvent *e)
    {
        mouseDown = false;
    }
    




    展开全文
  • DuiLib禁用双击标题栏窗口最大化

    千次阅读 2016-06-06 13:02:05
    要禁用窗口最大化只要屏蔽掉非客户区的双击消息就可以了 主要代码如下: //屏蔽双击放大 if (WM_NCLBUTTONDBLCLK == uMsg) { return 0; } return WindowImplBase::HandleMessage(uMsg, wParam, lParam); ...

    要禁用窗口最大化只要屏蔽掉非客户区的双击消息就可以了 主要代码如下:

    //屏蔽双击放大
    	if (WM_NCLBUTTONDBLCLK == uMsg)
    	{
    		return 0;
    	}
    
    	return WindowImplBase::HandleMessage(uMsg, wParam, lParam);



    要截取到这个消息必须override WindowImplBase类中的 LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) 成员函数,如下即可实现屏蔽双击放大。override是c++ 11新增的关键字 可以了解下。vs2013以下的编译器删除即可






    展开全文
  • Border为标题栏的边框,Border名称为"header" header = (Border)Template.FindName("header", this); header.MouseMove += (o, e) => { if (e.LeftButton == MouseButtonState.Pressed)

    1.手动实现

    Border为标题栏的边框,Border的名称为"header"

      			header = (Border)Template.FindName("header", this);
                header.MouseMove += (o, e) =>
                {
                    if (e.LeftButton == MouseButtonState.Pressed)
                    {
                        this.DragMove();
                    }
                };
                header.MouseLeftButtonDown += (o, e) =>
                {
                    if (e.ClickCount >= 2)
                    {
                        maxBtn.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));
                    }
                };
    

    2.继承微软的Title功能

    1.使用依赖项属性对header的高度进行绑定,当点击这一高度会有点击title的功能

     public int HeaderHeight
            {
                get { return (int)GetValue(HeaderHeightProperty); }
                set { SetValue(HeaderHeightProperty, value); }
            }
    
    // Using a DependencyProperty as the backing store for HeaderHeight.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty HeaderHeightProperty =DependencyProperty.Register("HeaderHeight", typeof(int), typeof(CommonWindow), new PropertyMetadata(0));
    
    public CustomWindow
    {
    	BindingOperations.SetBinding(chrome, WindowChrome.CaptionHeightProperty,new Binding(nameof(HeaderHeight)) { Source = this });
    }
    
    
    1. 在xaml中进行依赖属性的绑定,并且在不需要title功能的地方加上WindowChrome.IsHitTestVisibleInChrome="True"
    <Border Name="header" Background="{DynamicResource WindowTitleBrush}" BorderThickness="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=BorderThickness}">
    	<StackPanel WindowChrome.IsHitTestVisibleInChrome="True" DockPanel.Dock="Right"  HorizontalAlignment="Right" VerticalAlignment="Top" Orientation="Horizontal" Height="Auto" >
                 <Button x:Name="btnMin"/>
                 <Button x:Name="btnMax"/>
                 <Button x:Name="btnClose"/>
        </StackPanel>
    </Boder>
    
    展开全文
  • DuiLib如何禁用双击标题栏窗口最大化?其实很简单,禁用方法如下面所示: 1 LRESULT CLoginWin::HandleMessage(UINT uMsg,WPARAM wParam,LPARAM lParam) 2 { 3 if(WM_NCLBUTTONDBLCLK != uMsg) 4 { 5 ...
  • 窗口弹出时为指定大小,每次双击标题栏,或单击还原按钮将会回到窗口指定大小位置。
  • ![图片说明](https://img-ask.csdn.net/upload/202007/10/1594371634_442739.png) 点击按钮,窗口弹出,变成悬浮窗。再点击一下弹出的窗口的标题栏,窗口又合成一个窗口。请问大神们,这是怎么实现的???
  • 如图: 当双击红线一下时,firefox总是打开一个新标签,要想双击最小化必须双击的区域在箭头所指红线以上方可最小化。
  • 主要介绍了C#实现WinForm禁止最大化、最小化、双击标题栏双击图标等操作方法,涉及C#使用WinForm针对窗口操作各种常用技巧,具有一定参考借鉴价值,需要朋友可以参考下
  • 允许您自定义要包含的标题栏按钮,其顺序和布局 ...通过双击标题栏添加了最大化/取消最大化浮动窗口的功能,当然,通过单击并按住也可以移动它们 ...增加了像窗帘一样“卷起”和“下卷”客户端窗口的功能! 在标题栏...
  • WPF中自制窗口标题栏

    2019-08-04 06:46:52
    在WPF程序开发中,我们常常会发现默认的窗口标题栏过于不...不过,这样一来又有一个问题,即模拟的标题栏毕竟不是真正的标题栏,按住它无法拖动窗口,也无法双击最大化。Aland Li提供了一个好办法解决这一问题。 Wi...
  • 近期做QT,我也是新手,这个主要是用重构父类事件实现,即子类化。此文章是在http://blog.csdn.net/zmm19861210/article/details/9036779上看到,但是我做了一定修改[主要是析构函数修改]//CTabWidget.h #...
  • 在做Qt应用的时候,由于美观等问题经常会使用自定义的标题栏并将窗口默认的标题栏进行隐藏。随之带来的问题就是窗口失去了平移,缩放等功能。本文根据拦截自定义标题栏widget的事件,实现了通过移动标题栏进而移动...
  • 程序界面是一个三无窗口:无任务栏、无标题栏、无边框。 为方便控制,程序具有托盘图标,且托盘图标随Gif图像动态改变。 程序异形窗口函数是SetLayeredWindowAttributes,把某种颜色设为全透明。 并且该透明颜色...
  • 1. 怎么设置标题栏区域? 只需在XML的Window节点加上caption="0,0,0,32"即可,其中32是指从窗口顶部开始,往下32个像素的区域,...不过可以发现有些Demo的标题栏文字区域不能拖动,比如360Demo,那是因为...
  • 程序界面是一个三无窗口:无任务栏、无标题栏、无边框。 为方便控制,程序具有托盘图标,且托盘图标随Gif图像动态改变。 程序异形窗口函数是SetLayeredWindowAttributes,把某种颜色设为全透明。 并且该透明颜色...
  • 添加变量:Public Const SC_MAXMIZE As Int32 = 61730 最大化时双击标题栏消息值,还可设置其他值,完成相应功能添加方法: Protected Overrides Sub WndProc(ByRef m As Message) If m.WParam.ToInt32 = SC_MAXMIZE...
  • 窗口内使用ModifyStyleEx(0, WS_EX_TOOLWINDOW);可以去使窗口不在任务栏显示。...不想显示在任务栏肯定是有原因,结果左下角又出现小窗口,目的未达到,本来以为是标题栏没去掉,使用ModifyStyle(WS_CAPTION, ...
  • 添加变量:Public Const SC_MAXMIZE As Int32 = 61730 最大化时双击标题栏消息值,还可设置其他值,完成相应功能添加方法: Protected Overrides Sub WndProc(ByRef m As Message) If m.WParam.ToInt32 = SC_MAXMIZE...
  • 拦截 浮动工具栏的标题双击事件

    千次阅读 2011-03-05 16:04:00
    在MDI中,工具一般在主框架CMainFrame中,工具是主框架CMainFrame窗口,所以可以在主框架CMainFrame中处理子窗口(工具)事件: BOOL CMainFrame::PreTranslateMessage(MSG* pMsg) {  /...
  • #widget_main{border:1px solid rgb(100, 149, 237);}#widget_title{background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(27, 137, 202, 255), stop:1 rgba(16, 119, 181, 255));...
  • VC 模拟鼠标双击全屏窗口和单击按钮事件,这是个模拟程序,通过单击来模拟双击鼠标效果,鼠标点击“双击标题栏”按钮后,即可将本窗口全屏显示,模拟出了双击窗口标题栏的效果。另外还模拟了单击关闭按钮功能。
  • 浮动窗口是一个窗口容器dockablepane,窗口中含一个表格控件vsflexgrid,窗口处于浮动状态时候,而vsflexgrid处于编辑状态,这时候双击窗口标题栏,触发双击事件以及vsflexgridonaftereditvsflexgrid事件,然后...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 411
精华内容 164
关键字:

双击窗口的标题栏