自适应对话框的背景位图&限制大小的对话框
这里介绍一下两个比较实用的功能,一个是位对话框绘制自适应的位图背景,随着对话框的变化位图背景能够改变,但是这里的位图效果是平铺效果,我目前还没找到怎么实现一个位图撑满整个对话框,随着变化位图进行拉伸这种效果,希望有知道的人告诉我一下,不过我会查找一下资料的,等到有最新的资料我会更新在这里,这里先介绍平铺效果,效果图如下:
虽然不是很好看,但是固定了对话框大小,设计了相对应的位图之后作为设计程序背景图还是可以的,哈哈,总算是一种技术;这里主要实现代码就下面的几行,这个函数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); }
两个简单而实用的技术;