如何在dialog上放一个图片,这个图片还要“平铺” 图片好放,但是图片一定要平铺,当dialog拉申的时候,图片随着dialog平铺变大。谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在内存中根据dialog大小把图进行缩放,然后用BitBlt把内存的图COPY到屏幕上。 在dlg的OnSize函数中,用StretchBlt试试 void Draw_Picture(CDC *pDC, CRect rect, LPCTSTR pszResourceName){ ASSERT(pDC); ASSERT(!rect.IsRectNull()); CBitmap bitmap; if(bitmap.LoadBitmap(pszResourceName))//加载图片成功 { BITMAP BitMapHead; bitmap.GetBitmap(&BitMapHead); //获取图片信息 CDC memDC; memDC.CreateCompatibleDC(pDC); //创建兼容内存DC CBitmap *pBitmap = memDC.SelectObject(&bitmap); //将位图选入设备 //绘图 pDC->StretchBlt(rect.left,rect.top,rect.Width(),rect.Height(), &memDC, 0,0,BitMapHead.bmWidth,BitMapHead.bmHeight, SRCCOPY); //恢复和释放内存设备 memDC.SelectObject(pBitmap); memDC.DeleteDC(); //释放位图 bitmap.DeleteObject(); }}加入 LOGO 图片 ID命名为IDB_BITMAP_LOGO OnPaint()中加入 CDC *pDrawDC = GetDC(); CRect rect; GetClientRect(&rect); Draw_Picture(pDrawDC,rect, MAKEINTRESOURCE(IDB_BITMAP_LOGO) ); 用StretchDIBits试试这里有个例子// TODO: Add your command handler code here BOOL bSuccess ; DWORD dwFileSize, dwHighSize, dwBytesRead ; HANDLE hFile ; BITMAPFILEHEADER * pbmfh ; BITMAPINFO * pbmi ; BYTE * pBits ; int cxDib, cyDib ; CString pstrFileName="c:\\mypic.bmp"; hFile = CreateFile (pstrFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL) ; if (hFile == INVALID_HANDLE_VALUE) return ; dwFileSize = GetFileSize (hFile, &dwHighSize) ; if (dwHighSize) { CloseHandle (hFile) ; return ; } pbmfh = (BITMAPFILEHEADER *)malloc (dwFileSize) ; if (!pbmfh) { CloseHandle (hFile) ; return ; } bSuccess = ReadFile (hFile, pbmfh, dwFileSize, &dwBytesRead, NULL) ; CloseHandle (hFile) ; if (!bSuccess || (dwBytesRead != dwFileSize) || (pbmfh->bfType != * (WORD *) "BM") || (pbmfh->bfSize != dwFileSize)) { free (pbmfh) ; return ; } this->Invalidate(); if (pbmfh == NULL) { MessageBox (TEXT ("Cannot load DIB file"), "ShowDIB", MB_ICONEXCLAMATION | MB_OK) ; return ; } // 取得位图信息结构体的指针和位图数据数组的指针 pbmi = (BITMAPINFO *) (pbmfh + 1) ; pBits = (BYTE *) pbmfh + pbmfh->bfOffBits ; // Get the DIB width and height if (pbmi->bmiHeader.biSize == sizeof (BITMAPCOREHEADER)) { cxDib = ((BITMAPCOREHEADER *) pbmi)->bcWidth ; cyDib = ((BITMAPCOREHEADER *) pbmi)->bcHeight ; } else { cxDib = pbmi->bmiHeader.biWidth ; cyDib = abs (pbmi->bmiHeader.biHeight) ; } PAINTSTRUCT ps ; HDC hdc = hdc = ::BeginPaint (this->GetSafeHwnd(), &ps) ; CRect winrect; this->GetClientRect(&winrect); StretchDIBits (hdc, 0, 0, winrect.Width(), winrect.Height(), 0, 0, cxDib, cyDib, pBits, pbmi, DIB_RGB_COLORS, SRCCOPY) ; ::EndPaint (this->GetSafeHwnd(), &ps) ; 怎么个不行法?我这边好用的阿如果要拖动改变 Dialog 大小,对话框属性风格中Border选择Resizing映射 WM_SIZE 消息在 OnSize(UINT nType, int cx, int cy) 中添加Invalidate(); //vc6测试通过void CTestResizeDlg::OnPaint() { ////////////////////////////////////////////////////////////////////////// //贴图 CPaintDC dc(this) ; CDC dcmem ; CBitmap bitmap ; BITMAP bmbitmap ; CRect rcclient ; GetClientRect(&rcclient) ; bitmap.LoadBitmap(MAKEINTRESOURCE(IDB_BITMAP1)) ; bitmap.GetBitmap(&bmbitmap); dcmem.CreateCompatibleDC(&dc) ; dcmem.SelectObject(&bitmap) ; dc.StretchBlt(0,0,rcclient.right,rcclient.bottom, &dcmem, 0,0,bmbitmap.bmWidth,bmbitmap.bmHeight,SRCCOPY) ; CDialog::OnPaint() ; //////////////////////////////////////////////////////////////////////////}void CTestResizeDlg::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); // TODO: Add your message handler code here Invalidate();}//只是有点闪 在WM_SIZE里面做StretchBl的动作就可以了, 究竟是要 平铺 还是要 拉伸 ?拉伸的话直接在OnPaint()里面做就行了。OnSize是多余的。闪的话,把OnEraseBkground()函数屏蔽掉就OK了。 在onerasebkgnd事件中使用StretchBlt来画图就可以了,onsize有时候不好用....... 请教打印机串口编程仿真模式的问题 做BHO的一个难题 对话框上状态显示用什么好? 基于对话框程序,怎样使对话框可调大小,但要限制能调到的最小尺寸? List Box 怎么响应键盘消息? 请高手帮忙,问个简单的SQL语句,在线等等,谢谢 CDialogBar,怎么设置使它的右上角有个关闭按钮? 打印预览与工具条。 vc.net2003 以类模板作为类模板参数的问题 找兼职(只限北京) 如何取得,鼠标当前的在屏幕上XY位置 请问大家如何在VC里显示网络链接图片?
void Draw_Picture(CDC *pDC, CRect rect, LPCTSTR pszResourceName)
{
ASSERT(pDC);
ASSERT(!rect.IsRectNull());
CBitmap bitmap;
if(bitmap.LoadBitmap(pszResourceName))//加载图片成功
{
BITMAP BitMapHead;
bitmap.GetBitmap(&BitMapHead); //获取图片信息 CDC memDC;
memDC.CreateCompatibleDC(pDC); //创建兼容内存DC
CBitmap *pBitmap = memDC.SelectObject(&bitmap); //将位图选入设备 //绘图
pDC->StretchBlt(rect.left,rect.top,rect.Width(),rect.Height(),
&memDC,
0,0,BitMapHead.bmWidth,BitMapHead.bmHeight,
SRCCOPY); //恢复和释放内存设备
memDC.SelectObject(pBitmap);
memDC.DeleteDC(); //释放位图
bitmap.DeleteObject();
}
}加入 LOGO 图片 ID命名为IDB_BITMAP_LOGO
OnPaint()中加入
CDC *pDrawDC = GetDC();
CRect rect;
GetClientRect(&rect);
Draw_Picture(pDrawDC,rect, MAKEINTRESOURCE(IDB_BITMAP_LOGO) );
这里有个例子
// TODO: Add your command handler code here
BOOL bSuccess ;
DWORD dwFileSize, dwHighSize, dwBytesRead ;
HANDLE hFile ;
BITMAPFILEHEADER * pbmfh ;
BITMAPINFO * pbmi ;
BYTE * pBits ;
int cxDib, cyDib ; CString pstrFileName="c:\\mypic.bmp"; hFile = CreateFile (pstrFileName, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL) ; if (hFile == INVALID_HANDLE_VALUE)
return ; dwFileSize = GetFileSize (hFile, &dwHighSize) ; if (dwHighSize)
{
CloseHandle (hFile) ;
return ;
} pbmfh = (BITMAPFILEHEADER *)malloc (dwFileSize) ;
if (!pbmfh)
{
CloseHandle (hFile) ;
return ;
} bSuccess = ReadFile (hFile, pbmfh, dwFileSize, &dwBytesRead, NULL) ;
CloseHandle (hFile) ;
if (!bSuccess || (dwBytesRead != dwFileSize)
|| (pbmfh->bfType != * (WORD *) "BM")
|| (pbmfh->bfSize != dwFileSize))
{
free (pbmfh) ;
return ;
}
this->Invalidate(); if (pbmfh == NULL)
{
MessageBox (TEXT ("Cannot load DIB file"),
"ShowDIB", MB_ICONEXCLAMATION | MB_OK) ;
return ;
}
// 取得位图信息结构体的指针和位图数据数组的指针 pbmi = (BITMAPINFO *) (pbmfh + 1) ;
pBits = (BYTE *) pbmfh + pbmfh->bfOffBits ; // Get the DIB width and height if (pbmi->bmiHeader.biSize == sizeof (BITMAPCOREHEADER))
{
cxDib = ((BITMAPCOREHEADER *) pbmi)->bcWidth ;
cyDib = ((BITMAPCOREHEADER *) pbmi)->bcHeight ;
}
else
{
cxDib = pbmi->bmiHeader.biWidth ;
cyDib = abs (pbmi->bmiHeader.biHeight) ;
} PAINTSTRUCT ps ;
HDC hdc = hdc = ::BeginPaint (this->GetSafeHwnd(), &ps) ; CRect winrect;
this->GetClientRect(&winrect);
StretchDIBits (hdc, 0, 0, winrect.Width(), winrect.Height(),
0, 0, cxDib, cyDib,
pBits, pbmi, DIB_RGB_COLORS, SRCCOPY) ;
::EndPaint (this->GetSafeHwnd(), &ps) ;
我这边好用的阿如果要拖动改变 Dialog 大小,对话框属性风格中Border选择Resizing
映射 WM_SIZE 消息
在 OnSize(UINT nType, int cx, int cy) 中添加
Invalidate();
void CTestResizeDlg::OnPaint()
{
//////////////////////////////////////////////////////////////////////////
//贴图
CPaintDC dc(this) ;
CDC dcmem ;
CBitmap bitmap ;
BITMAP bmbitmap ;
CRect rcclient ;
GetClientRect(&rcclient) ;
bitmap.LoadBitmap(MAKEINTRESOURCE(IDB_BITMAP1)) ;
bitmap.GetBitmap(&bmbitmap);
dcmem.CreateCompatibleDC(&dc) ;
dcmem.SelectObject(&bitmap) ;
dc.StretchBlt(0,0,rcclient.right,rcclient.bottom, &dcmem, 0,0,bmbitmap.bmWidth,bmbitmap.bmHeight,SRCCOPY) ;
CDialog::OnPaint() ; //////////////////////////////////////////////////////////////////////////
}void CTestResizeDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
Invalidate();
}
//只是有点闪
闪的话,把OnEraseBkground()函数屏蔽掉就OK了。