22上位机VC MFC设计畸形的程序界面
功能展示
在我们开发上位机应用例程时,为使程序界面更加美观,可以将程序界面设计成各种不规则的图形,我们当前实例就实现了利用位图设计畸形的程序界面,效果如图
22上位机VC MFC设计畸形的程序界面
要点提示
利用位图设计不规则窗体的主要思路是把想去除的区域设成,然后利用GetPixe函数去除背景色,将不是背景色的区域用CombineRgn函数连接起来,最后用SetWindowRgn函数设置窗口的区域。
实现功能
1.新建一个对话框的应用程序
2.添加一个位图做为程序界面的背景
3.在程序对话框的OnInitDialog()函数中实现实体的不规则效果
CBitmap bitmap;
BITMAP bm;
bitmap.LoadBitmap(IDB_BITMAP1);
bitmap.GetBitmap(&bm);
SetWindowPos(&wndTop,0,0,bm.bmWidth,bm.bmHeight,SWP_NOMOVE);
CDC *pDC = GetDC(); //获得设备上下文
CDC memDC; //声明位图对象
CBitmap* bmp = NULL;
COLORREF col;
CRect rc;
int x, y;
CRgn rgn, tmp;
GetWindowRect(&rc); //获得窗体区域
memDC.CreateCompatibleDC(pDC); //创建与内存兼容的设备上下文
bmp = memDC.SelectObject(&bitmap);
rgn.CreateRectRgn(0, 0, rc.Width(), rc.Height()); //初始化区域
//计算得到区域
for(x=0; x<=rc.Width(); x++)
{
for(y=0; y<=rc.Height(); y++)
{
//将背景部分去掉
col = memDC.GetPixel(x, y); //得到像素颜色
if(col == RGB(255,255,255)) //如果是背景颜色
{
tmp.CreateRectRgn(x, y, x+1, y+1); //创建区域
rgn.CombineRgn(&rgn, &tmp,RGN_XOR ); //去除相互重叠的区域
tmp.DeleteObject(); //删除区域对象
}
}
}
SetWindowRgn((HRGN)rgn,TRUE); //设置窗体为区域的形状
4.添加WM_CTLCOLOR消息,在消息的处理函数体中完成窗体的背景绘制
HBRUSH CGkbc8Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Change any attributes of the DC here
CBitmap BKGround;
BKGround.LoadBitmap(IDB_BITMAP1);
if (nCtlColor==CTLCOLOR_DLG)
{
CBrush Brush(&BKGround); //定义一个位图画刷
CRect rect;
GetClientRect(rect);
pDC->SelectObject(&Brush); //选中画刷
pDC->FillRect(rect,&Brush); //填充客户区域
return Brush;
}
else
hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Return a different brush if the default is not desired
return hbr;
}
下面我们来演示整个功能实现的过程
|