【MFC】之优化笔记

最近一直在考虑用什么语言做上位机程序比较好?固然,C#是比较成熟,也是大家乐意选择的,但是MFC怎么不可以呢?

昨天逛了好多论坛,看大家对做图形化界面语言的想法,后来总结了一条,只要把其中一个玩熟,什么都可以做!

在MFC优化的过程中,逐渐领悟到美学的重要性,我觉得程序员,特别是嵌入式开发的程序员(从BSP-->Kernel-->APP)更是要涉猎广泛。

另外我说一个自己的想法:程序要不仅需要过硬的技术,还需要严谨的思维,独特的美学素养,差不多的文学功底(因为你要写技术文档和博客嘛);


说了一堆废话:总之,我后来决定,接着MFC的道路,继续发展! 【PS:其实我是一只小菜鸟!】

1、如何更改生成的程序图标?

方法一:找一张ICO图标,res/programname.ico文件,就可以啦,这时候你运行后得到的图标可能还是原来MFC的默认图标,这时候你只要把工程目录下的Debug和Release文件删除掉,重新编译生成就能得到更换图标后的程序。或者直接RebuildAll,再运行,怎么样很简单吧。
当然,你如果你在你的工程里操作也没有问题,在工作区的resorce页中的Icon中把ID为IDR_MAIN的图标资源删除,再导入自己制作的图标资源,把资源ID改为IDR_MAIN就OK啦。

方法二:
上面这个的工作十分简单,但是如果要在程序中写代码改变我们应用程序的图标,比如有时候我们要在程序中动态改变程序的标题栏、任务栏图标或是托盘的图标,那就要花点功夫了。其实也不是很难,主要用几个函数搞定,如果是MFC主要就是 LoadIcon和 SetIcon。
比如我们在OnInitDialog或是OnCreate中加入:
AfxGetApp()->LoadIcon(IDI_ICON1);
SetIcon(ico,true);
SetIcon(ico,false);
另外你可能要问,MFC程序默认是怎么加载它的图标的,其实很简单,在主对话框的构造函数中有这样一句:
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAIN);
这就是加载默认图标的,而在OnInitDialog初始化函数中有这两行代码:
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
这两行代码就将应用程序的图标设置好了。到这里聪明的你应该能触类旁通了吧,其实在MFC中更换或设置图标的方式有很多种,像QQ这样动态更换图标也不是一件太难的事。

2、如何更改主界面的背景为图片?

修改OnPint()函数的else部分为

		//CDialog::OnPaint();				//注释掉
		CPaintDC dc(this);
		CBitmap   bitmap;
		bitmap.LoadBitmap(IDB_BITMAP2);		//这个IDB_BITMAP2要自己添加
		CBrush   brush;
		brush.CreatePatternBrush(&bitmap);
		CBrush* pOldBrush = dc.SelectObject(&brush);
		dc.Rectangle(0,0,900,480);			// 这些参数可以调整图片添加位置和大小
		dc.SelectObject(pOldBrush);

3、如何设置按钮(Button)标签为图片?

首先设置按键的属性:在Styles里面选中Bitmap

HBITMAP hBmp=::LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP_FOR_BUTTON));
m_button.SetBitmap(hBmp);

m_button 为按键添加的控制变量;

IDB_BITMAP_FOR_BUTTON 为添加的按键位图

4、如何设置静态字体颜色?

重载OnCtlColor函数,在ClassWizard里面添加WM_CTLCOLOR->Add Function->Edit Code

#define CTLCOLOR_MSGBOX         0
#define CTLCOLOR_EDIT           1
#define CTLCOLOR_LISTBOX        2
#define CTLCOLOR_BTN            3
#define CTLCOLOR_DLG            4
#define CTLCOLOR_SCROLLBAR      5
#define CTLCOLOR_STATIC         6
#define CTLCOLOR_MAX            7
根据上面的定义我们来判断我们要设置那个,这里是静态字体那么我们就要选CTLCOLOR_STATIC

HBRUSH CServerDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
	// TODO: Change any attributes of the DC here
	UINT uid=pWnd->GetDlgCtrlID();
	if(nCtlColor == CTLCOLOR_STATIC)
	{
		pDC->SetTextColor(0x99cc32);
		pDC->SetBkColor(0x000000);
	}
	if(nCtlColor == CTLCOLOR_EDIT)
	{
		pDC->SetTextColor(0x99cc32);
		pDC->SetBkColor(0xFFFF00);
	}
	// TODO: Return a different brush if the default is not desired
	return hbr;
}

5、文本框字体颜色和背景色的设置

重载OnCtlColor函数,在ClassWizard里面添加WM_CTLCOLOR->Add Function->Edit Code

除了上面一种方法外还可以按照下面的重装办法:

HBRUSH CServerDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
	// TODO: Change any attributes of the DC here
	UINT uid=pWnd->GetDlgCtrlID();
	if(this->m_display.GetDlgCtrlID() == uid)
	{
		pDC->SetTextColor(RGB(0xff,0xff,0xff));
		pDC->SetBkColor(RGB(0x7f,0,225));
	}
	// TODO: Return a different brush if the default is not desired
	return hbr;
}
这里的m_display变量为Edit Box的控制变量;这种方法,能针对某一个模块进行配置!根据上面两个,关于其他的大家可以触类旁通了!







【MFC】之优化笔记

上一篇:C#之"0x{0:x}"


下一篇:Web前端 — Bootstrap(4)