[MFC] 手动美化 MFC 窗体

去除边框

1.把窗口边框改成无边框:
[MFC] 手动美化 MFC 窗体_第1张图片

但只这样做会导致无法拖动窗口。

2.在类向导中添加这个消息:OnHcHitTest
[MFC] 手动美化 MFC 窗体_第2张图片

3.修改这个消息处理函数的返回值为:HTCAPTION
[MFC] 手动美化 MFC 窗体_第3张图片


添加背景图片

1.准备一张 bmp 格式的图片(其他格式我没有实验,可能会有问题),在项目中添加资源,选择 BitMap ,导入:
[MFC] 手动美化 MFC 窗体_第4张图片

[MFC] 手动美化 MFC 窗体_第5张图片

2.在 OnPaint() 函数中添加如下代码:

// 上面还有一部分代码,是 vs 自动生成的
else
	{
     
		//CDialogEx::OnPaint();			// 这是原本的,注释掉

		/*
			从这里开始是我们自己的代码 ---------------
		*/ 
		
		CPaintDC   dc(this);
		CRect   rect;
		GetClientRect(&rect);												// 获取对话框长宽      
		CDC   dcBmp;															// 定义并创建一个内存设备环境
		dcBmp.CreateCompatibleDC(&dc);						// 创建兼容性DC
		CBitmap   bmpBackground;
		bmpBackground.LoadBitmap(IDB_BITMAP1);    // 载入资源中图片
		BITMAP   m_bitmap;												// 图片变量               
		bmpBackground.GetBitmap(&m_bitmap);			// 将图片载入位图中
		
		//将位图选入临时内存设备环境
		CBitmap* pbmpOld = dcBmp.SelectObject(&bmpBackground);
		
		//调用函数显示图片StretchBlt显示形状可变
		dc.SetStretchBltMode(COLORONCOLOR);			// 防止 bmp 图片压缩后失真
		dc.StretchBlt(0, 0, rect.Width(), rect.Height(), &dcBmp, 0, 0, m_bitmap.bmWidth, m_bitmap.bmHeight, SRCCOPY);
	}

注意:背景图片在窗口拉伸时会失真,但配合无边框使用时不需要在意,因为本身无边框窗体不支持拉伸窗口。

还有一点,这样做需要手动添加关闭按钮,但 bmp 格式文件图片不透明所以就很丑,但使用 png 格式的图片要使用 GDI+ 库。


你可能感兴趣的:(窗口操作)