圆角窗体
可以通过CreateRoundRectRgn()函数实现圆角窗体的效果。
语法:
CreateRoundRectRgn(int nLeftRect,int nTopRect,int nRightRect,int nBottomRect,int nWidthEllipse,int nHeightEllipse);
参数说明: 依次为矩形左上角的横纵坐标,矩形右下角的横纵坐标,圆角椭圆的宽和高。
实例:
在OnInitDialog()函数中添加如下代码即可:
CRect rect;
GetClientRect(&rect);
HRGN rgn;
rgn=CreateRoundRectRgn(0,0,rect.Width()+5,rect.Height(),50,50);
SetWindowRgn(rgn,TRUE);
本实例中窗体形状是由SetWindowRgn函数实现的,通过这个函数可以根据CRgn类指定的形状 生成窗体,CRgn类还可以将多个形状组合成一个形状,也就是通过CombineRgn函数将需要的 部分连接起来。
位图背景窗体的实现
要实现窗体的绘制并不像想象中那么复杂。
首先需要准别几个漂亮的位图,然后利用设备上下文CDC将其绘制在窗体上就可以了。CDC提供了StretchBlt方法,用回绘制图像
语法: BOOL StretchBlt(int x,int y,int nWidth,int nHeight,CDC* pSrcDC,int xSrc,int ySrc,int nSrcWidth,int nSrcHeight,DWORD dwRop);
参数说明: a x,y: 表示目标区域的左上角坐标
nWidth,nHeight:表示目标区域的宽度和高度
pSrcDC:表示源设备上下文指针
xSrc,ySrc:表示源设备上下文左上角的坐标
nSrcWidth,nSrcHeight:表示源设备上下文的宽度和高度
dwRop:表示光栅效果
实例:、
void CAbcDlg::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
{
CPaintDC dc(this);
CBitmap m_bitmap;
m_bitmap.LoadBitmap(IDB_BITMAP1); //IDB_BITMAP1是自己导入的bitmap图片
CDC memdc;
memdc.CreateCompatibleDC(&dc);
memdc.SelectObject(&m_bitmap);
int width,height;
BITMAP bmp;
m_bitmap.GetBitmap(&bmp);
width=bmp.bmWidth;
height=bmp.bmHeight;
CRect rect;
this->GetClientRect(&rect);
dc.StretchBlt(rect.left,rect.top,rect.Width(),rect.Height(),&memdc,0,0,width,height,SRCCOPY);
CDialog::OnPaint();
}
}
秘籍:位图的缩放 在绘图操作中,StretchBlt实现了位图的缩放复制,通过这一机制可以随意地将图片进行缩放并绘制在窗体上或者其他控件上。下面给出了实现位图缩放绘制的关键代码: switch(num) { case 0: // 50%缩放 pDC->StretchBlt(r.left,r.top,(int)(width*0.5),(int)(height*0.5),&memdc,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY); break; case 1: // 75%缩放 pDC->StretchBlt(r.left,r.top,(int)(width*0.75),(int)(height*0.75),&memdc,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY); break; case 2: // 100%缩放 pDC->StretchBlt(r.left,r.top,r.width(),r.height(),&memdc,0,0,SRCCOPY); break; case 3: // 150%缩放 pDC->StretchBlt(r.left,r.top,(int)(width*1.5),(int)(height*1.5),&memdc,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY); break; case 4: // 50%缩放 case 2: // 100%缩放 pDC->StretchBlt(r.left,r.top,r.width(),r.height(),&memdc,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY); break; }
随机更换背景窗体
CStatic 类的SetBitmap成员函数用来将一个新的位图与此静态控件关联。这个位图将被自动绘制在此静态控件中。 默认的,他将被绘制在左上角,并且此静态控件将根据位图的大小来调整尺寸
语法: HBITMAP SetBitmap(HBITMAP hBitmap);
参数说明: hBitmap:要绘制在此静态控件中的位图的句柄
实例:
在该对话框窗体上添加一个静态控件,设置关联变量为m_Picture; 在OnInitDialog方法中添加如下代码: CTime Time; Time=CTime::GetCurrentTime(); srand(Time.GetSecond()); int i=rand()%2; m_Picture.SetBitmap(LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP1+i))); 注意: 随机数的使用 在使用rand函数生成随机数时,必须使用srand函数设置随机种子,否则每次生成的随机数就有可能时一样的。 而随机种子的设置需要传递一个整型值,这个值每次又不能相同,所以利用时间来设置这个整型值最合适。
在窗体的OnCtlColor方法中实现通过画刷绘制窗体的背景,代码如下:
HBRUSH CAbcDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Change any attributes of the DC here CBrush m_brush;
m_brush.CreateSolidBrush(RGB(255,0,0));
CRect m_rect;
GetClientRect(&m_rect);
pDC->SelectObject(&m_brush);
pDC->FillRect(m_rect,&m_brush); // TODO: Return a different brush if the default is not desired
return hbr;
}
秘籍:创建画刷的方法: 该实例是利用画刷来完成窗体背景的填充的,并且在创建画刷时使用了两行命令。其实, 创建画刷只需要使用一行名利即可,如CBrush m_brush(RGB(255,0,0));