MFC界面美化第五篇(汇总篇)----MFC完整美化项目(包含了对菜单栏,标题栏,按钮控件,列表的美化)

1.前言

经过了之前的四篇文章,我们单独实现了对菜单栏,标题栏,按钮,列表的美化。

在这个篇幅中,笔者会把这些整合到一个项目中,实现一个完整的美化效果。

并且还增加了,最大化,最小化,界面的自适应。

2.效果展示

视频运行效果

3.所有的源码链接,笔者使用的是vs2022

1.美化按钮的Demo
链接:https://pan.quark.cn/s/85db8ccec89a

2.列表美化的Demo
链接:https://pan.quark.cn/s/508009790543

3.标题栏美化的Demo
链接:https://pan.quark.cn/s/71c931772f62

4.菜单栏美化的Demo


链接:https://pan.quark.cn/s/265fff48ce6a

5.完整的项目包括了对菜单栏,按钮,列表,标题的美化

做了最大化,最小化的自适应。
链接:https://pan.quark.cn/s/8e2bf037daa2

4.按钮的美化

主要是封装好了mybutton.h,mybutton.cpp。两个文件。然后对按钮进行重绘

使用图片贴图对按钮进行美化。

核心代码

CMyButton m_button_start;
CMyButton m_button_stop;

//启动按钮绘制
	GetClientRect(&rtBtnClo);
	rtBtnClo.left = rtBtnClo.right - 800;
	m_button_start.SetImagePath(_T(".\\res\\start.png"), _T(".\\res\\start.png"), _T(".\\res\\start.png"));
	m_button_start.InitMyButton(rtBtnClo.left, 60, 55, 24, true);
	//停止按钮绘制
	GetClientRect(&rtBtnClo);
	rtBtnClo.left = rtBtnClo.right - 600;
	m_button_stop.SetImagePath(_T(".\\res\\stop.png"), _T(".\\res\\stop.png"), _T(".\\res\\stop.png"));
	m_button_stop.InitMyButton(rtBtnClo.left, 60, 55, 24, true);

详细过程可以查看这篇文章

MFC界面美化第三篇----自绘按钮(重绘按钮)-优快云博客

5.列表的美化

封装好了列表类,主要有8个文件。对列表进行重绘。

主要注意事项,

修改我们的原始list的属性,方便我们后续重绘

边框:true
静态边缘:false
视图:Reporte
无滚动:true

详细过程可以查看这篇文章

MFC界面美化第四篇----自绘list列表(重绘列表)-优快云博客

6.标题栏的美化

为了对标题栏进行重绘,我们要把mfc原始的标题栏去除,然后再mfc上重新绘制一块区域作为标题栏。然后再重新绘制好对应的最大化,最小化按钮。

详细过程查看这篇文章。

MFC界面美化---自绘标题栏_mfc如何做出漂亮的界面-优快云博客

7.菜单栏的美化

核心是因为我们把原始的菜单删除了。现在要选择一块区域,写上文字。比如,文件,菜单,帮助,作为我们新的菜单。当我们点击这个菜单区域的时候,会弹出选项。

MenuEx.h MenuEx.cpp 是封装好的重绘菜单栏的文件。需要注意的是使用了hook.让重绘的时候进入我们的函数。

C++ MFC 界面美化------自绘菜单栏_mfc界面美化-优快云博客

8.关于控件最大化,最小化 的时候的自适应问题。

主要再onsize()函数里面进行处理

对应的相关代码

CDialogEx::OnSize(nType, cx, cy);

	int dlgitem[2] = { IDC_LIST1 };
	for (int i = 0; i < 2; i++)//因为是多个控件,所以这里用了循环
	{
		CWnd* pWnd = GetDlgItem(dlgitem[i]);
		//判断是否为空,因为对话框创建时会调用此函数,而当时控件还未创建
		if (pWnd && nType != 1 && m_wndRect.Width() && m_wndRect.Height())
		{
			CRect rect;   //获取控件变化前的大小 
			pWnd->GetWindowRect(&rect);
			ScreenToClient(&rect);//将控件大小转换为在对话框中的区域坐标
			rect.left = rect.left * cx / m_wndRect.Width();//调整控件大小
			rect.right = rect.right * cx / m_wndRect.Width();
			rect.top = rect.top * cy / m_wndRect.Height();
			rect.bottom = rect.bottom * cy / m_wndRect.Height();
			pWnd->MoveWindow(rect);//设置控件大小 
		}
	}

	//重新获得窗口尺寸
	GetClientRect(&m_wndRect);
	//开始重新绘制

	//m_btnStart.SetImagePath(_T(".\\res\\firing_button.png"), _T(".\\res\\firing_button_press.png"), _T(".\\res\\firing_button_hover.png"));
	//m_btnStart.InitMyButton(11, 70, 70, 28, true);
	CWnd* pWnd = GetDlgItem(IDC_BUTTON4);
	if (pWnd && nType != 1 && m_wndRect.Width() && m_wndRect.Height())
	{
		m_button_start.ReleaseImg();
		CRect rect;   //获取控件变化前的大小 
		pWnd->GetWindowRect(&rect);
		ScreenToClient(&rect);//将控件大小转换为在对话框中的区域坐标
		rect.left = m_wndRect.right * 0.0098;
		rect.top = m_wndRect.bottom * 0.1176;
		rect.right = rect.left + 70;
		rect.bottom = rect.top + 28;
		//pWnd->MoveWindow(rect);//设置控件大小 
		m_button_start.SetImagePath(_T(".\\res\\start.png"), _T(".\\res\\start.png"), _T(".\\res\\start.png"));
		m_button_start.InitMyButton(rect.left, rect.top, 55, 24, true);
	}
	//停止按钮重新绘制

	pWnd = GetDlgItem(IDC_BUTTON5);

	if (pWnd && nType != 1 && m_wndRect.Width() && m_wndRect.Height())
	{
		m_button_stop.ReleaseImg();
		CRect rect;   //获取控件变化前的大小 
		pWnd->GetWindowRect(&rect);
		ScreenToClient(&rect);//将控件大小转换为在对话框中的区域坐标
		rect.left = m_wndRect.right * 0.0811;
		rect.top = m_wndRect.bottom * 0.1176;
		rect.right = rect.left + 70;
		rect.bottom = rect.top + 28;
		m_button_stop.SetImagePath(_T(".\\res\\stop.png"), _T(".\\res\\stop.png"), _T(".\\res\\stop.png"));
		m_button_stop.InitMyButton(rect.left, rect.top, 55, 24, true);
	}

	

	//退出按钮重新绘制
	pWnd = GetDlgItem(IDC_BUTTON3);
	if (pWnd && nType != 1 && m_wndRect.Width() && m_wndRect.Height())
	{
		m_btnExit.ReleaseImg();
		CRect rect;   //获取控件变化前的大小 
		pWnd->GetWindowRect(&rect);
		ScreenToClient(&rect);//将控件大小转换为在对话框中的区域坐标
		rect.left = m_wndRect.right - 20;
		rect.top = 5;
		rect.right = rect.left + 16;
		rect.bottom = rect.top + 16;
		m_btnExit.SetImagePath(_T(".\\res\\icon_popup_off.png"), _T(".\\res\\icon_popup_off.png"), _T(".\\res\\icon_popup_off.png"));
		m_btnExit.InitMyButton(rect.left, rect.top, 16, 16, true);
	}
	//最大化按钮重新绘制
	

	pWnd = GetDlgItem(IDC_BUTTON1);
	if (pWnd && nType != 1 && m_wndRect.Width() && m_wndRect.Height())
	{
		m_btnMax.ReleaseImg();
		CRect rect;   //获取控件变化前的大小 
		pWnd->GetWindowRect(&rect);
		ScreenToClient(&rect);//将控件大小转换为在对话框中的区域坐标
		rect.left = m_wndRect.right - 50;
		rect.top = 5;
		rect.right = rect.left + 16;
		rect.bottom = rect.top + 16;
		
		m_btnMax.SetImagePath(_T(".\\res\\icon_square.png"), _T(".\\res\\icon_square.png"), _T(".\\res\\icon_square.png"));
		
		m_btnMax.InitMyButton(rect.left, rect.top, 16, 16, true);
	}



	//最小化按钮重新绘制

	pWnd = GetDlgItem(IDC_BUTTON2);
	if (pWnd && nType != 1 && m_wndRect.Width() && m_wndRect.Height())
	{
		m_btnMin.ReleaseImg();
		CRect rect;   //获取控件变化前的大小 
		pWnd->GetWindowRect(&rect);
		ScreenToClient(&rect);//将控件大小转换为在对话框中的区域坐标
		rect.left = m_wndRect.right - 80;
		rect.top = 5;
		rect.right = rect.left + 16;
		rect.bottom = rect.top + 16;
		m_btnMin.SetImagePath(_T(".\\res\\icon_minimiz.png"), _T(".\\res\\icon_minimiz.png"), _T(".\\res\\icon_minimiz.png"));
		m_btnMin.InitMyButton(rect.left, rect.top, 16, 16, true);
	}
	Invalidate();

9.关于界面上所有的颜色

1.菜单栏的颜色

OnPaint()中这段代码决定了菜单栏的颜色

dc.FillSolidRect(rect, RGB(45, 51, 60));
		dc.SetBkMode(TRANSPARENT);

2.界面主体的颜色。

OnCtlColor()中这段代码决定了界面主体的颜色

switch (nCtlColor)
	{
	case CTLCOLOR_DLG:
		HBRUSH aBrush;
		aBrush = CreateSolidBrush(RGB(30, 34, 39));
		hbr = aBrush;
		break;
	}

3.列表的颜色

HeaderCtrlEx.cpp中这段代码决定了列表的标题头的颜色

OnNMCustomdraw()函数

 GetClientRect(&rect);
        //pDC->FillSolidRect(&rect, RGB(215, 235, 226));
        pDC->FillSolidRect(&rect, RGB(30, 34, 39));
        *pResult = CDRF_NOTIFYITEMDRAW;

4.ListCtrlComboEx.cpp文件中这段代码决定了列表的主体颜色

DrawItem 函数

if(bSelected)
	{
		pDC->SetBkColor(RGB(30, 34, 39));
		pDC->SetTextColor(RGB(255,255,255)/*::GetSysColor(COLOR_HIGHLIGHTTEXT)*//*GetTableItemColor(nItem, item.iSubItem)*/);
		color = RGB(30, 34, 39);
	}
	else
	{
		pDC->SetBkColor(RGB(30, 34, 39));
		pDC->SetTextColor(RGB(255,255,255)/*::GetSysColor(COLOR_WINDOWTEXT)*//*GetTableItemColor(nItem, item.iSubItem)*/);
	}

5.弹出菜单的颜色

由函数来设置

// 设置边框颜色
	void SetBorderColor(COLORREF clr) { m_clrBorder = clr; }

### 回答1: MFC绘图控件是Microsoft Foundation Class库中的一个工具,它可以用来进行高速图表绘制。该控件具有快速绘图的能力,可以实时更新,并且支持鼠标响应。 MFC绘图控件可以通过MFC绘图示例(MFC Drawing Demo)来演示。该示例程序提供了一个基础的绘图框架,通过这个框架可以创建和绘制各种图形,如直线、矩形、圆等。使用示例程序可以学习和了解MFC绘图控件的基本用法和功能。 在示例程序中,鼠标响应是一个重要的功能。通过对鼠标事件的处理,可以实现一些交互式的操作,比如绘制自由曲线、移动和编辑已有图形等。例如,可以通过鼠标左键点击来创建一个点,通过拖动鼠标可以绘制直线或矩形等。 MFC绘图控件的高速性是其突出的特点之一。在图表绘制中,通常需要频繁地进行绘制操作,如果绘制速度太慢,会导致界面卡顿,影响用户体验。而MFC绘图控件通过利用底层硬件加速和绘图缓冲等技术,可以快速地进行图表绘制,保证了绘制效率和流畅度。 总而言之,MFC绘图控件是一个功能强大的工具,可以用于高速图表绘制。通过鼠标响应,可以实现更多的交互式操作。示例程序提供了一个演示和学习的平台,用户可以深入了解和使用MFC绘图控件的各种功能。 ### 回答2: high-speed charting control(MFC绘图控件)是一种用于在MFC应用程序中绘制快速和高效图表的控件。该控件的作用是帮助开发者在应用程序中实现各种类型的图表,如折线图、柱状图、饼图等。通过使用这个控件,开发者可以轻松地创建具有交互性和响应式的图表。 MFC绘图demo是一个包含了鼠标响应功能的示例程序。该示例程序展示了如何使用high-speed charting control控件来创建图表,并在用户与图表交互时响应鼠标的操作。 在这个demo中,开发者可以看到如何通过添加数据点来绘制折线图。通过鼠标的点击和拖动,用户可以添加、删除和移动数据点,实时更新图表的显示。该demo还演示了如何通过鼠标的滚动来放大和缩小图表的显示范围。 除了基本的绘制功能,MFC绘图demo还提供了一些其他功能,如图表的标注、背景设置和图表的保存与导入等。这些功能使得开发者可以根据实际需要进行图表的定制和扩展。 总结起来,high-speed charting control(MFC绘图控件)以及包含鼠标响应的MFC绘图demo是一种帮助开发者快速绘制高效图表的控件和示例程序。开发者可以根据自己的需求,使用这个控件和示例程序来实现各种类型的交互式图表功能。 ### 回答3: 高速绘图控件MFC(Microsoft Foundation Classes)框架中的一个重要的组件之一,它可以用于在应用程序中实现图表的绘制和展示。MFC绘图Demo是一个示例程序,展示了如何使用MFC绘图控件来实现图表绘制,并通过鼠标响应来交互操作。 MFC绘图控件使用了高效的绘图算法,能够快速地绘制图表数据,并具有良好的性能。它支持多种类型的图表,如曲线图、柱状图、饼状图等,并提供了丰富的参数和选项,可以用于定制图表的外观和行为。 MFC绘图Demo通过鼠标响应实现了图表的交互操作。用户可以使用鼠标来选择图表中的数据点、拖动图表的视图、放大缩小图表等。通过鼠标操作,用户可以方便地查看和分析图表数据,实现更直观的数据展示和操作。 在MFC绘图Demo中,通过监听鼠标事件,获取鼠标的坐标信息,并根据鼠标的操作来改变图表的显示和行为。例如,当用户点击某个数据点时,可以在图表上显示该数据点的数值或详细信息;当用户拖动图表视图时,可以实现平移图表的功能;当用户使用滚轮滚动鼠标时,可以实现图表的放大缩小。 总之,MFC高速绘图控件MFC绘图Demo是用于实现图表绘制和交互操作的工具和示例程序,它们可以帮助开发人员快速构建和定制图表功能,并提供高效的数据展示和操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值