MFC---控制线条粗细,线型,颜色
  5Z6Aj0LQwRjK 2023年12月10日 33 0


public/protected/private

public:可以被该类中的函数、子类的函数、友元函数访问,也可以由该类的对象访问;
protected:可以被该类中的函数、子类的函数、友元函数访问,但不可以由该类的对象访问;
private:可以被该类中的函数、友元函数访问,但不可以由子类的函数、该类的对象、访问。

创建对话框资源

MFC---控制线条粗细,线型,颜色_ide

生成对话框类

MFC---控制线条粗细,线型,颜色_滑动条_02

生成新类Setup

MFC---控制线条粗细,线型,颜色_ide_03

•修改应用菜单,处理配置信息

MFC---控制线条粗细,线型,颜色_ide_04

•选项处理函数
定义应用如何使用"配置对话框"设置应用参数

void Cdraw3View::OnSetup()
{
    // TODO: 在此添加命令处理程序代码
    Setup setup;
    setup.m_nLineWidth = m_nLineWidth;
    setup.m_nLineStyle = m_nLineStyle;
    setup.m_cc = m_color;
    if (IDOK == setup.DoModal())
    {
        m_color = setup.m_cc;
        m_nLineWidth = setup.m_nLineWidth;
        m_nLineStyle = setup.m_nLineStyle;
        if (m_nLineStyle != PS_SOLID )
        {
            m_nLineWidth = 1;
        }
    }
}

线条宽度

CSliderCtrl 滑动条

BOOL Setup::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    // TODO:  在此添加额外的初始化
    // 得到滑动条对象指针
    CSliderCtrl* sli = (CSliderCtrl*)GetDlgItem(IDC_SLIDER1);
    // 设置滑动条范围
    sli->SetRange(1, 30);
    // 设置标尺间隔
    sli->SetTicFreq(1);
    return TRUE;  // return TRUE unless you set the focus to a control
                  // 异常: OCX 属性页应返回 FALSE
}

•将滑动条绑定成员变量

MFC---控制线条粗细,线型,颜色_控件_05

线条类型

•设计界面,使用GroupBox 和 3个 RadioButton(单选按钮)

MFC---控制线条粗细,线型,颜色_控件_06

•将第1个RadioButton的Group属性设置为True,这一步将3个RadioButton编为一组

MFC---控制线条粗细,线型,颜色_c++_07

•将这组选项绑定到成员变量m_nLineStyle

MFC---控制线条粗细,线型,颜色_控件_08

画笔颜色

•在选项对话框中新增Button,改Button标题为"颜色"
•为Button添加点击事件响应函数

void Setup::OnBnClickedButton1()
{
    // 打开颜色对话框
    CColorDialog cdlg;
    cdlg.m_cc.Flags |= CC_RGBINIT;
    cdlg.m_cc.rgbResult = m_cc;
    if (IDOK == cdlg.DoModal())
    {
        //获取颜色
        m_cc = cdlg.m_cc.rgbResult;
    }
    Invalidate();
}

•在Draw3View.cpp中获取对话框中的颜色值

colDlg.m_cc.Flags 的成员是一个标志位,通过按位或运算 |= 操作,将 CC_RGBINIT 标志位设置到 colDlg.m_cc.Flags 中。这个标志位的含义是告诉颜色对话框使用 RGB 颜色模式。

示例效果

•在选项对话框上用GroupBox画一个区域,将在这个区域中画一条线展示画线效果

MFC---控制线条粗细,线型,颜色_滑动条_09

•分别对CSlideCtrl和RadioButton设置响应事件

void Setup::OnBnClickedRadio3()
{
    Invalidate();
}

void Setup::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
    // 响应滑块控件的水平移动消息
    Invalidate();
    CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
}

•在WM_PAINT事件中完成画线绘制工作

void Setup::OnPaint()
{
    CPaintDC dc(this); // device context for painting
                       // TODO: 在此处添加消息处理程序代码
                       // 不为绘图消息调用 CDialogEx::OnPaint()
	//同步控件和变量
	UpdateData();

	//在示例区域绘制一条线
	CPen pen(m_nLineStyle,m_nLineWidth,m_color);
	CPen *pOldPen=dc.SelectObject(&pen);

	//获得IDC_SAMPLE控件的坐标(CRect)
	CRect rect;
	//将IDC_SAMPLE控件的坐标信息存放到rect变量中
	GetDlgItem(IDC_SAMPLE)->GetWindowRect(&rect);

	//将屏幕坐标和应用坐标进行转换
	ScreenToClient(&rect);
	dc.MoveTo(rect.left+20,rect.top+rect.Height()/2 );
	dc.LineTo(rect.right-20,rect.top+rect.Height()/2);



	dc.SelectObject(pOldPen);
}


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月10日 0

暂无评论

推荐阅读
  A32uB2Hhmc6N   2023年12月12日   36   0   0 MySQLMySQLideide
5Z6Aj0LQwRjK