MFC笔记 位图背景窗体的实现

要实现窗体的绘制并不像想象中那么复杂。首先需要准别几个漂亮的位图,然后利用设备上下文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);
参数说明:
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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值