MFC—界面设计(控件自适应,添加背景图,Static背景颜色设置)

时间:2024-05-24 07:21:05

1、控件随着窗口自适应
首先在类视图里面添加OnSize()函数,然后添加一个ChangeSize()函数,头文件中添加如下

//控件自适应变量
	POINT old;
	CRect m_rect;
	void ChangeSize(UINT nID, int x, int y);
	afx_msg void OnSize(UINT nType, int cx, int cy);

在OnInitDialog中

//控件自适应
	GetClientRect(&m_rect);
	old.x = m_rect.right - m_rect.left;
	old.y = m_rect.bottom - m_rect.top;
//窗口自适应
void CTestDlg::ChangeSize(UINT nID, int x, int y)
{
	CWnd *pWnd;
	pWnd = GetDlgItem(nID);
	if (pWnd != NULL)
	{
		CRect rect;
		pWnd->GetWindowRect(&rec);
		ScreenToClient(&rec);
		rect.left = rect.left*x / m_rect.Width();
		rect.top = rect.top*y / m_rect.Height();
		rect.bottom = rect.bottom*y / m_rect.Height();
		rect.right = rect.right*x / m_rect.Width();
		pWnd->MoveWindow(rec); //伸缩控件
	}
}

//窗口自适应
void CTestDlg::OnSize(UINT nType, int cx, int cy)
{
	CDialog::OnSize(nType, cx, cy);

	// TODO:  在此处添加消息处理程序代码
	if (nType != SIZE_MINIMIZED)
	{
		float fsp[2];
		POINT Newp; //获取现在对话框的大小  
		CRect recta;
		GetClientRect(&recta);     //取客户区大小    
		Newp.x = recta.right - recta.left;
		Newp.y = recta.bottom - recta.top;
		fsp[0] = (float)Newp.x / old.x;
		fsp[1] = (float)Newp.y / old.y;
		CRect Rect;
		int woc;
		CPoint OldTLPoint, TLPoint; //左上角  
		CPoint OldBRPoint, BRPoint; //右下角  
		HWND  hwndChild = ::GetWindow(m_hWnd, GW_CHILD);  //列出所有控件    
		while (hwndChild){
			woc = ::GetDlgCtrlID(hwndChild);//取得ID  
			GetDlgItem(woc)->GetWindowRect(Rect);
			ScreenToClient(Rect);
			OldTLPoint = Rect.TopLeft();
			TLPoint.x = long(OldTLPoint.x*fsp[0]);
			TLPoint.y = long(OldTLPoint.y*fsp[1]);
			OldBRPoint = Rect.BottomRight();
			BRPoint.x = long(OldBRPoint.x *fsp[0]);
			BRPoint.y = long(OldBRPoint.y *fsp[1]);
			Rect.SetRect(TLPoint, BRPoint);
			GetDlgItem(woc)->MoveWindow(Rect, TRUE);
			hwndChild = ::GetWindow(hwndChild, GW_HWNDNEXT);
		}
		old = Newp;
	}
}

这个程序有一个bug,需要修改对话框中的Static静态框的ID。

2、给对话框添加背景图片
(1)资源视图右键->添加->资源->Bitmap->导入,将bmp图片放置在工程文件的Res文件夹中,将其导入Bitmap,然后修改其ID为IDB_BITMAP_BACKGROUND
MFC—界面设计(控件自适应,添加背景图,Static背景颜色设置)
(2)在类视图中添加OnPaint()函数

//添加背景颜色
void CTestDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting	
		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CRect rect;
		CPaintDC dc(this);
		GetClientRect(&rect);
		dc.FillSolidRect(rect, RGB(141, 182, 205));
		dc.FillPath();

		//背景图片 能够自适应窗口
		GetClientRect(&rect);
		CDC dcMem;
		dcMem.CreateCompatibleDC(&dc);
		CBitmap bmpBackground;
		bmpBackground.LoadBitmap(IDB_BITMAP_BACKGROUND);   //IDB_BITMAP_BACKGROUND是你自己的图对应的ID 
		BITMAP bitmap;
		bmpBackground.GetBitmap(&bitmap);
		CBitmap *pbmpOld = dcMem.SelectObject(&bmpBackground);
		dc.StretchBlt(0, 0, rect.Width(), rect.Height(), &dcMem, 0, 0, bitmap.bmWidth, bitmap.bmHeight, SRCCOPY);

		//CDialog::OnPaint();
	}
}

我的背景图片已经包括了那个蓝框框
MFC—界面设计(控件自适应,添加背景图,Static背景颜色设置)
3、使Static背景变化
由于为了自适应改变了Static的ID,所以这里需要对不同的Static进行设置

//设置控件颜色
HBRUSH UserInfoDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

	// TODO:  在此更改 DC 的任何特性
	if ((pWnd->GetDlgCtrlID() == IDC_IDTYPE_STATIC) || (pWnd->GetDlgCtrlID() == IDC_NAME_STATIC)
		|| (pWnd->GetDlgCtrlID() == IDC_SEX_STATIC) || (pWnd->GetDlgCtrlID() == IDC_BIRTH_STATIC)
		|| (pWnd->GetDlgCtrlID() == IDC_NATION_STATIC) || (pWnd->GetDlgCtrlID() == IDC_ADDRESS_STATIC)
		|| (pWnd->GetDlgCtrlID() == IDC_AGENCY_STATIC) || (pWnd->GetDlgCtrlID() == IDC_STARTDATE_STATIC)
		|| (pWnd->GetDlgCtrlID() == IDC_ENDDATE_STATIC) || (pWnd->GetDlgCtrlID() == IDC_IDNUM_STATIC))//
	{
		pDC->SetTextColor(RGB(0, 0, 0));//设置文本色	
		pDC->SetBkColor(RGB(141, 182, 205));//设置背景色	
		pDC->SetBkMode(TRANSPARENT);//透明
		return (HBRUSH)::GetStockObject(NULL_BRUSH);
	}

	// TODO:  如果默认的不是所需画笔,则返回另一个画笔
	return hbr;
}

添加背景和使静态框也变成背景色后的界面
MFC—界面设计(控件自适应,添加背景图,Static背景颜色设置)