博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自适应对话框的背景位图&限制大小的对话框
阅读量:7022 次
发布时间:2019-06-28

本文共 2326 字,大约阅读时间需要 7 分钟。

 

这里介绍一下两个比较实用的功能,一个是位对话框绘制自适应的位图背景,随着对话框的变化位图背景能够改变,但是这里的位图效果是平铺效果,我目前还没找到怎么实现一个位图撑满整个对话框,随着变化位图进行拉伸这种效果,希望有知道的人告诉我一下,不过我会查找一下资料的,等到有最新的资料我会更新在这里,这里先介绍平铺效果,效果图如下:

虽然不是很好看,但是固定了对话框大小,设计了相对应的位图之后作为设计程序背景图还是可以的,哈哈,总算是一种技术;这里主要实现代码就下面的几行,这个函数onCtlColor是为控件绘制背景的,获取为对话框绘制背景的那一部分,重新绘制背景即可,这里重点关注利用位图作为画刷那一部分;然后CDC利用selectobject选中画刷,接着客户区绘制矩形即可,填充矩形呀~

HBRUSH CDemo1Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) {	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);	if (nCtlColor == CTLCOLOR_DLG)	{		CBrush brush;		brush.CreatePatternBrush(&m_Bmp);//位图画刷~		CRect clientRC;                                   //获取客户区		GetClientRect(clientRC);		pDC->SelectObject(&brush);             //选中画刷		pDC->FillRect(clientRC, &brush);        //客户区绘制填充矩形		return brush;	}	return hbr;}

补充:如果一张图延伸为背景,则需要在paint中绘制,利用方法如下:

int CDemo1Dlg::drawBackGround(void){	CDC* pDC=this->GetDC();	CRect clientRC;	GetClientRect(clientRC);	CDC memDC;	memDC.CreateCompatibleDC(pDC);	memDC.SelectObject(m_Bmp);	BITMAPINFO bmpinfo;	m_Bmp.GetObject(sizeof(BITMAPINFO),&bmpinfo);	int bmpcx=bmpinfo.bmiHeader.biWidth;	int bmpcy=bmpinfo.bmiHeader.biHeight;	pDC->StretchBlt(clientRC.left,clientRC.top,clientRC.Width(),clientRC.Height(),&memDC,0,0,bmpcx,bmpcy,SRCCOPY);	return 0;}

onPaint中调用此函数即可;在onCtlColor中写这部分没有用,onCtlColor函数中的pDC可能是绘制控件之前的,返回的画笔重新绘制控件就没有了,具体为什么不能再这个函数中进行位图伸缩绘制我也不知道其中原因,如果有谁知道可以告诉我~谢谢啦。

限制对话框的大小主要利用一个函数,如下:(The framework calls this member function whenever Windows needs to know the maximized position or dimensions, or the minimum or maximum tracking size.)这里利用tracking size;

afx_msg void OnGetMinMaxInfo(    MINMAXINFO* lpMMI  );
typedef struct tagMINMAXINFO {   POINT ptReserved;   POINT ptMaxSize;      //最大窗口的宽度和大小   POINT ptMaxPosition;  //最大窗口的左上角的坐标   POINT ptMinTrackSize; //tracking size的最大边框大小   POINT ptMaxTrackSize; //tracking size的最小边框大小} MINMAXINFO;

设置跟踪一个对话框大小的代码如下:

void CDemo2Dlg::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI) {	lpMMI->ptMaxTrackSize.x = lpMMI->ptMaxTrackSize.x > 400 ?  400: lpMMI->ptMaxTrackSize.x;	lpMMI->ptMaxTrackSize.y = lpMMI->ptMaxTrackSize.y > 400 ?  400: lpMMI->ptMaxTrackSize.y;	lpMMI->ptMinTrackSize.x = lpMMI->ptMinTrackSize.x < 200 ?  200: lpMMI->ptMinTrackSize.x;	lpMMI->ptMinTrackSize.y = lpMMI->ptMinTrackSize.y < 200 ?  200: lpMMI->ptMinTrackSize.y;	CDialog::OnGetMinMaxInfo(lpMMI);}

两个简单而实用的技术;

转载地址:http://fdbxl.baihongyu.com/

你可能感兴趣的文章
MySQL内存表的弊端
查看>>
使用SIMILE Timeline 将邮件“事件”可视化
查看>>
SQL:创建某一时间段内的周末日期表以及特殊处理日期表
查看>>
什么是CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI?(转)
查看>>
LindAgile.SchedulingTask~设计一个不错的任务调度组件
查看>>
恶搞之手机垃圾信息发送器 手机短信骚扰器
查看>>
mysql replication之binlog-do-db、binlog-ignore-db
查看>>
Date类型和Long类型的相互转换
查看>>
XMPP协议
查看>>
CSS:给 input 中 type="text" 设置CSS样式
查看>>
Softmax函数
查看>>
hdu4462 Scaring the Birds
查看>>
设计中的道理_6
查看>>
MFC——AfxParseURL用法
查看>>
关于综合布线系统线缆挑选方法
查看>>
面向过程,面向对象,函数式对同一个问题的思考方式
查看>>
盘点:抵御网络攻击哪国强?世界20强国排名
查看>>
混合“白+黑”名单方法是如何帮助企业加强安全的?
查看>>
中国网速竟不到泰国一半、香港的1/4!名副其实"华囧"
查看>>
4G和5G不配物联网 不过死撑
查看>>