Qt-C++基础界面开发(3- 简单Input Widget控件和Containers等多窗口操作)

本文详细介绍了Qt-C++中ComboBox、LineEdit和TextEdit的基本操作,以及Containers控件的使用,包括页面跳转、参数传递和多窗口切换技巧。从基础控件到多界面协作,一步步教你构建复杂应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 Input Widget的简单使用

1.1 Combo Box控件的基本操作

1、在界面的UI设计combo box变量
2、在cpp文件中利用lambda表达式实现其功能操作
3、Combo box包括下拉改变状态、获取当前状态、设置当前状态为未选择等基础操作

1、在界面的UI中设计combo box的变量名为cbx,并且添加一个label用于显示状态变化的文字
在这里插入图片描述

2、在界面的cpp文件中,对界面进行实现mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // 代码在此后面添加

    // 1、设计下拉按钮标签文字
    for(int i = 0 ; i < 10;++i){
        QString str = "第" + QString::number(i) + "个";
        ui->cbx->addItem(str);
    }
    // 2、默认未勾选任何批次,将当前index设置为-1即可
    ui->cbx->setCurrentIndex(-1);

    // 3、设计下拉按键实现不同功能(主要在于触发事件为currentTextChanged)
    connect(ui->cbx,&QComboBox::currentTextChanged,this,[=](){
        // 3.1、当前下拉按钮的位置
        int index = ui->cbx->currentIndex();
        //  更改label的内容
        ui->label->setText("我是" +QString::number(index)+"个按钮");
    });
}

MainWindow::~MainWindow()
{
    delete ui;
}

3、实现效果:
在这里插入图片描述

1.2 Line Edit控件的基本操作

1、在界面的UI设计Line Edit变量
2、在cpp文件中利用lambda表达式实现其功能操作
3、Line Edit包括当前内容变化等触发事件和获取当前内容的操作等

1、 在UI中设计Line Edit 并命名

2、 在cpp中实现对line edit的内容读取(触发事件是实时读取的)mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // 代码在此后面添加
    // 1、line edit的内容变化,触发label显示该内容
    connect(ui->let,&QLineEdit::textChanged,this,[=]{
        // 2、 此时的label显示内容是实时的
        // line edit一般用来作为输入窗口配合按钮使用,来获取输入内容
        ui->label->setText(ui->let->text());
    });
}

MainWindow::~MainWindow()
{
    delete ui;
}

3、效果如下所示:
在这里插入图片描述

1.3 Text Edit控件的基本操作

1、在界面的UI设计Text Edit变量
2、在cpp文件中利用lambda表达式实现其功能操作
3、Text Edit包括当前内容变化等触发事件和获取当前内容的操作等
4、Text Edit 和 Line Edit的区别在于Text Edit可以输入多行,且得到的文本还是作为一个字符串,且Text Edit获取文本的函数为toPlainText()

1、 在UI中设计Line Edit 并命名

2、 在cpp中实现对line edit的内容读取(触发事件是实时读取的)mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // 代码在此后面添加

    // 1、类似于line edit利用文件变化触发,获取text edit的内容
    connect(ui->ted,&QTextEdit::textChanged,this,[=]{
        // 2、 text edit和line edit区别在于text edit输入可以是多行文本
        ui->label->setText(ui->ted->toPlainText());
    });
}

MainWindow::~MainWindow()
{
    delete ui;
}

3、效果如下所示:
在这里插入图片描述

2 Containers等控件和多窗口操作

2.1 页面跳转(推荐)

1、该模式比隐藏主界面模式简单
2、控件点击后,直接打开界面B,然后关闭界面A(主界面)
在这里插入图片描述

2.1.1 页面A和页面B的设计

1、其中只包括label显示其为页面1,和按钮push button且命名为pbt实现页面跳转的功能
在这里插入图片描述

2、添加页面B进入到工程

  • 1、右键工程,如test添加新文件,如下图所示,选择Qt中的Qt 设计师界面类
    在这里插入图片描述
  • 2、根据需求,选择Main Window或者 Widget即可
    在这里插入图片描述
  • 3、设计类名,并且是要添加到工程文件夹下面

在这里插入图片描述

  • 4、设计页面B,包含一个label显示这个是页面B和一个按钮返回页面A
    在这里插入图片描述

2.1.2 添加头文件

  • 1、在页面A的头文件中添加页面B,即只要包含一句#include "formb.h"即可,页面A的文件mainwindow.h如下:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "formb.h"

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

  • 2、在页面B的头文件中添加页面A,即只要包含一句#include "mainwindow.h"即可,页面B的formb.h如下所示:
#ifndef FORMB_H
#define FORMB_H

#include <QWidget>
#include "mainwindow.h"

namespace Ui {
class FormB;
}

class FormB : public QWidget
{
    Q_OBJECT

public:
    explicit FormB(QWidget *parent = nullptr);
    ~FormB();

private:
    Ui::FormB *ui;
};

#endif // FORMB_H

2.1.3 在源文件实现打开页面操作

  • 1、对于页面A,此时对按键进行功能实现:点击后打开页面B,并关闭页面A,mainwindow.cpp如下所示:
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    
    // 点击按钮打开页面B,关闭页面A
    connect(ui->pbt_a,&QPushButton::clicked,this,[=]{
        // 新建页面B的对象,并打开
        FormB* nf = new FormB();
        nf->show();
        // 页面A关闭
        this->close();
    });
}

MainWindow::~MainWindow()
{
    delete ui;
}
  • 2、此时即已经实现点击按钮跳转页面就打开了页面B
  • 3、同样的,对页面B进行点击按钮实现打开页面A,关闭页面B,此时formb.cpp如下所示
#include "formb.h"
#include "ui_formb.h"

FormB::FormB(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::FormB)
{
    ui->setupUi(this);
    // 点击按钮打开页面B,关闭页面A
    connect(ui->pbt_b,&QPushButton::clicked,this,[=]{
        MainWindow* nf = new MainWindow();
        nf->show();
        this->close();
    });
}

FormB::~FormB()
{
    delete ui;
}

  • 4、至此完成界面的跳转

总结:
1、以上四个文件即包括了所有代码
2、打开页面B的对象,关闭页面A,即实现页面的切换

2.2 页面跳转(隐藏主界面模式)

1、设计触发跳转页面的控件,例如按钮等
2、控件触发后,打开新页面,自身可以隐藏也可以不隐藏
3、新界面触发事件,发出信号给旧界面实现页面切换

在这里插入图片描述

1、页面A的按钮点击,发送出跳转信号,被页面B接收
2、在页面A头文件中添加页面B
3、在按钮的Lambda或者槽函数中实现页面跳转

2.2.1 界面设计

见前面2.1.1

2.2.2 页面A触发跳转操作并隐藏(非最终跳转代码)

1、在页面A的头文件中添加页面B,即只要包含一句#include "formb.h"即可

2、在.cpp文件实现页面跳转mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // 代码在此后面添加

    // 1、页面A的按钮触发
    connect(ui->pbt_a,&QPushButton::clicked,this,[=]{
        // 2.1 、新建页面B并显示,至此打开新界面
        FormB* nf = new FormB();
        nf->show();
        // 2.2 、主界面A隐藏
        this->hide();

    });
}

MainWindow::~MainWindow()
{
    delete ui;
}

此时实现的效果页面A能打开页面B,但是页面B打开不了页面A!!

2.2.3 页面B触发跳转实现页面AB之间的切换(最终跳转代码)

1、在页面 B的头文件 中添加页面A和信号,返回界面A, 注意信号声明在public 下!!

signals:
    //  返回页面A
    void backA();

整个代码如下所示:formb.h

#ifndef FORMB_H
#define FORMB_H

#include <QWidget>
#include "mainwindow.h"

namespace Ui {
class FormB;
}

class FormB : public QWidget
{
    Q_OBJECT

public:
    explicit FormB(QWidget *parent = nullptr);
    ~FormB();

signals:
    //  返回页面A
    void backA();

private:
    Ui::FormB *ui;
};

#endif // FORMB_H

2、页面B在cpp文件实现向页面A跳转操作formb.cpp

#include "formb.h"
#include "ui_formb.h"

FormB::FormB(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::FormB)
{
    ui->setupUi(this);
    
    // 1、 按键触发页面B隐藏并发信号,打开页面A
    connect(ui->pbt_b,&QPushButton::clicked,this,[=]{
        // 发出信号
        emit backA();
        // 页面B隐藏
        this->hide();
    });
}

FormB::~FormB()
{
    delete ui;
}

此时针对页面A的cpp文件mainwindow.cpp,添加触发事件:值得注意的有:

1、页面B返回页面A的信号是在页面A跳转到页面B的事件中实现的
2、在跳转回页面A时候,页面B被当做一个控件

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // 代码在此后面添加

    // 1、页面A的按钮触发
    connect(ui->pbt_a,&QPushButton::clicked,this,[=]{
        // 2.1 、新建页面B并显示,至此打开新界面
        FormB* nf = new FormB();
        nf->show();
        // 2.2 、主界面A隐藏
        this->hide();
        // 3 页面B触发事件打开页面A
        connect(nf,&FormB::backA,this,[=]{
            // 打开页面A
            this->show();
        });

    });
}

MainWindow::~MainWindow()
{
    delete ui;
}

2.3 页面跳转传递参数

2.3.1 实现页面跳转(隐藏主界面)

此时见 2.2 节实现即可

2.3.2 设计传参控件(可以不需要)

此时,在页面A中添加一个拖动条(Horizontal Silder),且命名为hs

在这里插入图片描述

此时,在页面B中添加一个label命名为lab_hs来显示页面A的托拉条数据
在这里插入图片描述

2.3.3 在页面B中设计传参函数

1、由A打开B,B获得A的参数
2、因此在A打开B的时候,B调用其中某个函数获取A的参数

在这里插入图片描述
此时页面B的头文件中设计传参函数getHsData,注意其添加在页面B的slot函数内,且为public,此时formb.h如下

#ifndef FORMB_H
#define FORMB_H

#include <QWidget>
#include "mainwindow.h"

namespace Ui {
class FormB;
}

class FormB : public QWidget
{
    Q_OBJECT

public:
    explicit FormB(QWidget *parent = nullptr);
    ~FormB();

public slots:
    void getHsData(int);

signals:
    //  返回页面A
    void backA();

private:
    Ui::FormB *ui;
};

#endif // FORMB_H

此时在页面B的cpp文件对该槽函数进行实现,即在lab_hs下显示内容:
此时的formb.cpp有:

#include "formb.h"
#include "ui_formb.h"

FormB::FormB(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::FormB)
{
    ui->setupUi(this);

    // 1、 按键触发页面B隐藏并发信号,打开页面A
    connect(ui->pbt_b,&QPushButton::clicked,this,[=]{
        // 发出信号
        emit backA();
        // 页面B隐藏
        this->hide();
    });
}

FormB::~FormB()
{
    delete ui;
}

// 对获得到的数据进行显示
void FormB::getHsData(int a){
    ui->lab_hs->setText(QString::number(a));
}

2.3.4 在页面A中调用传参函数

由于传参函数是在页面B中的,因此也在打开页面B的时候调用传参函数

此时的页面A的cpp文件mainwindow.cpp如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // 代码在此后面添加

    // 1、页面A的按钮触发
    connect(ui->pbt_a,&QPushButton::clicked,this,[=]{
        // 2.1 、新建页面B并显示,至此打开新界面
        FormB* nf = new FormB();
        nf->show();
        // 2.2 、主界面A隐藏
        this->hide();
        // 传递参数
        nf->getHsData(ui->hs->value());

        // 3 页面B触发事件打开页面A
        connect(nf,&FormB::backA,this,[=]{
            // 打开页面A
            this->show();
        });

    });
}

MainWindow::~MainWindow()
{
    delete ui;
}

此时实现的效果如下所示:
在这里插入图片描述

2.4 在页面A上显示页面B之Scroll Area容器

1、在页面A上设计scroll area容器
2、设计好页面B
3、在页面A的cpp文件实现scroll area显示页面B

1、在页面A界面上设计scroll area重命名为sa

在这里插入图片描述
2、类似2.1.1操作创建页面B

3、在页面A上显示页面Bmainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // 代码在此后面添加

    // 1、新建页面B
    FormB* nf = new FormB();
    // 2、显示页面B
    ui->sa->setWidget(nf);
}

MainWindow::~MainWindow()
{
    delete ui;
}

3、最终实现效果
在这里插入图片描述

同样的,在页面A上添加一个line edit命名为ldt,此时可以在 页面A中对页面B进行操作mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // 代码在此后面添加

    // 1、新建页面B
    FormB* nf = new FormB();
    // 2、显示页面B
    connect(ui->ldt,&QLineEdit::textChanged,this,[=]{

        nf->getHsData(ui->ldt->text().toInt());
    });

    ui->sa->setWidget(nf);
}

MainWindow::~MainWindow()
{
    delete ui;
}

有实现效果:

在这里插入图片描述

2.5 0积分窗口代码下载

窗口代码下载

这是一款真正意义上适合软件界面开发C++界面库。采用XML管理GDI资源(如:图片、字体、颜色等),最大程度将界面与逻辑分开,让程序员有更多的时间去进行软件内部的逻辑处理。SKINSE扩展了非常丰富的API接口,兼容其他界面控件,使界面开发更加灵活、高效。SkinSE只用到了windows几个底层的核心库,没有用到(MFC/ATL等第三方库),采用纯API编写,采用C语言导出方式,增强可移植性,可以用于多种计算机语言。 1.SKINSE界面库内部没有完全采用HOOK拦截窗口的机制,主要采用子类化控件,修改窗口过程函数的方式进行界面美化。但是内置HOOK技术,可以动态设置HOOK,保证了SKINSE在整理构架上的灵活性。 2.SKINSE界面库内置DirectUI绘制思想,将界面绘制元素抽象成图片、文本、矩形区域、线条、动画,并且内置EventItem、DrawItem绘制机制。可以将这些绘制元素以及绘制机制组合开发,实现按钮、单选框、复选框、分组框、Tab控件、动画控件界面控件3.SKINSE界面库提供了非常丰富的API接口,最大限度的让SKINSE界面库更加透明化、个性化,让SKINSE界面库的使用范围得到最大延伸。 4.SKINSE界面库在子类化进行控件美化的时候,尽量不修改控件的默认属性,最大程度地兼容window标准控件的默认属性。比如,目前市场上很多界面库在绘制窗口标题栏的时候,去掉了窗口的WS_CAPTION属性, 导致GetClientRect、GetWindowRect方法失效,从而加大了界面开发设计的难度,当然也导致不能完美支持SDI/MDI等界面框架。 5.SKINSE界面库提供了界面控件动态布局的特性。省去了程序开发中最为繁琐的窗口控件位置的调整。只需要调整一下XML配置属性,就可以进行完美布局。 6.SKINSE界面库支持BMP、ICO、PNG、JPG等图片格式,支持皮肤色调变换,提供SKINSE内部的图像引擎接口。 7.SKINSE界面库支持SDI、MDI等界面框架,支持20余种界面控件,完整兼容window 2000、window2003、window XP、vista、window7当前的主流操作系统。并且支持window平台的VC、.NET、VB6、Delphi、C++ Builder、PowerBuilder、易语言等多种计算机语言开发
C++写的一个简单界面演示系统 void CMiniDrawDoc::AddFigure (CFigure *PFigure) { m_FigArray.Add (PFigure); SetModifiedFlag (); } CFigure *CMiniDrawDoc::GetFigure (int Index) { if (Index m_FigArray.GetUpperBound ()) return 0; return (CFigure *)m_FigArray.GetAt (Index); } int CMiniDrawDoc::GetNumFigs () { return m_FigArray.GetSize (); } void CMiniDrawDoc::DeleteContents() { // TODO: Add your specialized code here and/or call the base class int Index = m_FigArray.GetSize (); while (Index--) delete m_FigArray.GetAt (Index); m_FigArray.RemoveAll (); CDocument::DeleteContents(); } void CMiniDrawDoc::OnEditClearAll() { // TODO: Add your command handler code here DeleteContents (); UpdateAllViews (0); SetModifiedFlag (); } void CMiniDrawDoc::OnUpdateEditClearAll(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable (m_FigArray.GetSize ()); } void CMiniDrawDoc::OnEditUndo() { // TODO: Add your command handler code here int Index = m_FigArray.GetUpperBound (); if (Index > -1) { delete m_FigArray.GetAt (Index); m_FigArray.RemoveAt (Index); } UpdateAllViews (0); SetModifiedFlag (); } void CMiniDrawDoc::OnUpdateEditUndo(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable (m_FigArray.GetSize ()); } // implementation of figure classes: IMPLEMENT_SERIAL (CFigure, CObject, 3) CRect CFigure::GetDimRect () { return CRect (min (m_X1, m_X2), min (m_Y1, m_Y2), max (m_X1, m_X2) + 1, max (m_Y1, m_Y2) + 1); } void CFigure::Serialize (CArchive& ar) { if (ar.IsStoring ()) ar << m_X1 << m_Y1 << m_X2 << m_Y2 <> m_X1 >> m_Y1 >> m_X2 >> m_Y2 >> m_Color; } IMPLEMENT_SERIAL (CLine, CFigure, 3) CLine::CLine (int X1, int Y1, int X2, int Y2, COLORREF Color, int Thickness) { m_X1 = X1; m_Y1 = Y1; m_X2 = X2; m_Y2 = Y2; m_Color = Color; m_Thickness = Thickness; } void CLine::Serialize (CArchive& ar) { CFigure::Serialize (ar); if (ar.IsStoring ()) ar <> m_Thickness; } void CLine::Draw (CDC *PDC) { CPen Pen, *POldPen; // select pen/brush: Pen.CreatePen (PS_SOLID, m_Thickness, m_Color); POldPen = PDC->SelectObject (&Pen); // draw figure: PDC->MoveTo (m_X1, m_Y1); PDC->LineTo (m_X2, m_Y2); // remove pen/brush: PDC->SelectObject (POldPen); } IMPLEMENT_SERIAL (CRectangle, CFigure, 3) CRectangle::CRectangle (int X1, int Y1, int X2, int Y2, COLORREF Color, int Thickness) { m_X1 = X1; m_Y1 = Y1; m_X2 = X2; m_Y2 = Y2; m_Color = Color; m_Thickness = Thickness; } void CRectangle::Serialize (CArchive& ar) { CFigure::Serialize (ar); if (ar.IsStoring ()) ar <> m_Thickness; } void CRectangle::Draw (CDC *PDC) { CPen Pen, *POldPen; // select pen/brush: Pen.CreatePen (PS_INSIDEFRAME, m_Thickness, m_Color); POldPen = PDC->SelectObject (&Pen); PDC->SelectStockObject (NULL_BRUSH); // draw figure: PDC->Rectangle (m_X1, m_Y1, m_X2, m_Y2); // remove pen/brush: PDC->SelectObject (POldPen); } IMPLEMENT_SERIAL (CRectFill, CFigure, 3) CRectFill::CRectFill (int X1, int Y1, int X2, int Y2, COLORREF Color) { m_X1 = min (X1, X2); m_Y1 = min (Y1, Y2); m_X2 = max (X1, X2); m_Y2 = max (Y1, Y2); m_Color = Color; } void CRectFill::Draw (CDC *PDC) { CBrush Brush, *POldBrush; CPen Pen, *POldPen; // select pen/brush: Pen.CreatePen (PS_INSIDEFRAME, 1, m_Color); POldPen = PDC->SelectObject (&Pen); Brush.CreateSolidBrush (m_Color); POldBrush = PDC->SelectObject (&Brush); // draw figure: PDC->Rectangle (m_X1, m_Y1, m_X2, m_Y2); // remove pen/brush: PDC->SelectObject (POldPen); PDC->SelectObject (POldBrush); } IMPLEMENT_SERIAL (CRectRound, CFigure, 3) CRectRound::CRectRound (int X1, int Y1, int X2, int Y2, COLORREF Color, int Thickness) { m_X1 = min (X1, X2); m_Y1 = min (Y1, Y2); m_X2 = max (X1, X2); m_Y2 = max (Y1, Y2); m_Color = Color; m_Thickness = Thickness; } void CRectRound::Serialize (CArchive& ar) { CFigure::Serialize (ar); if (ar.IsStoring ()) ar <> m_Thickness; } void CRectRound::Draw (CDC *PDC) { CPen Pen, *POldPen; // select pen/brush: Pen.CreatePen (PS_INSIDEFRAME, m_Thickness, m_Color); POldPen = PDC->SelectObject (&Pen); PDC->SelectStockObject (NULL_BRUSH); // draw figure: int SizeRound = (m_X2 - m_X1 + m_Y2 - m_Y1) / 6; PDC->RoundRect (m_X1, m_Y1, m_X2, m_Y2, SizeRound, SizeRound); // remove pen/brush: PDC->SelectObject (POldPen); } IMPLEMENT_SERIAL (CRectRoundFill, CFigure, 3) CRectRoundFill::CRectRoundFill (int X1, int Y1, int X2, int Y2, COLORREF Color) { m_X1 = min (X1, X2); m_Y1 = min (Y1, Y2); m_X2 = max (X1, X2); m_Y2 = max (Y1, Y2); m_Color = Color; } void CRectRoundFill::Draw (CDC *PDC) { CBrush Brush, *POldBrush; CPen Pen, *POldPen; // select pen/brush: Pen.CreatePen (PS_INSIDEFRAME, 1, m_Color); POldPen = PDC->SelectObject (&Pen); Brush.CreateSolidBrush (m_Color); POldBrush = PDC->SelectObject (&Brush); // draw figure: int SizeRound = (m_X2 - m_X1 + m_Y2 - m_Y1) / 6; PDC->RoundRect (m_X1, m_Y1, m_X2, m_Y2, SizeRound, SizeRound); // remove pen/brush: PDC->SelectObject (POldPen); PDC->SelectObject (POldBrush); } IMPLEMENT_SERIAL (CCircle, CFigure, 3) CCircle::CCircle (int X1, int Y1, int X2, int Y2, COLORREF Color, int Thickness) { m_X1 = min (X1, X2); m_Y1 = min (Y1, Y2); m_X2 = max (X1, X2); m_Y2 = max (Y1, Y2); m_Color = Color; m_Thickness = Thickness; } void CCircle::Serialize (CArchive& ar) { CFigure::Serialize (ar); if (ar.IsStoring ()) ar <> m_Thickness; } void CCircle::Draw (CDC *PDC) { CPen Pen, *POldPen; // select pen/brush: Pen.CreatePen (PS_INSIDEFRAME, m_Thickness, m_Color); POldPen = PDC->SelectObject (&Pen); PDC->SelectStockObject (NULL_BRUSH); // draw figure: PDC->Ellipse (m_X1, m_Y1, m_X2, m_Y2); // remove pen/brush: PDC->SelectObject (POldPen); } IMPLEMENT_SERIAL (CCircleFill, CFigure, 3) CCircleFill::CCircleFill (int X1, int Y1, int X2, int Y2, COLORREF Color) { m_X1 = min (X1, X2); m_Y1 = min (Y1, Y2); m_X2 = max (X1, X2); m_Y2 = max (Y1, Y2); m_Color = Color; } void CCircleFill::Draw (CDC *PDC) { CBrush Brush, *POldBrush; CPen Pen, *POldPen; // select pen/brush: Pen.CreatePen (PS_INSIDEFRAME, 1, m_Color); POldPen = PDC->SelectObject (&Pen); Brush.CreateSolidBrush (m_Color); POldBrush = PDC->SelectObject (&Brush); // draw figure: PDC->Ellipse (m_X1, m_Y1, m_X2, m_Y2); // remove pen/brush: PDC->SelectObject (POldPen); PDC->SelectObject (POldBrush); }
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值