要实现窗体的绘制并不像想象中那么复杂。首先需要准别几个漂亮的位图,然后利用设备上下文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;
}
语法:
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;
}