如何给对话框放一个背景图片 2。答:对话框属性中style的border属性不设为resizing 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 感觉24bit的位图也行。先读入图片,再blt HBITMAP CDandelionDlg::BufferToBITMAP(LPSTR path){ LPSTR p; DWORD size; CFile pf; pf.Open(path,CFile::modeRead); size=pf.GetLength(); p=new char[size]; pf.ReadHuge(p,size); pf.Close(); HBITMAP hBmp; LPSTR hDIB,lpBuffer=p; LPVOID lpDIBBits; BITMAPFILEHEADER bmfHeader; DWORD bmfHeaderLen; bmfHeaderLen=sizeof(bmfHeader); strncpy((LPSTR)&bmfHeader,(LPSTR)lpBuffer,bmfHeaderLen); if(bmfHeader.bfType!=((WORD)('M'<<8)|'B'))return NULL; hDIB=lpBuffer+bmfHeaderLen; BITMAPINFOHEADER &bmiHeader=*(LPBITMAPINFOHEADER)hDIB; BITMAPINFO &bmInfo=*(LPBITMAPINFO)hDIB; int nColors=bmiHeader.biClrUsed ? bmiHeader.biClrUsed : 1<<bmiHeader.biBitCount; //Specail process for more than 256 color bitmap. if(bmInfo.bmiHeader.biBitCount>8) lpDIBBits=(LPVOID)((LPDWORD)(bmInfo.bmiColors+bmInfo.bmiHeader.biClrUsed)+ ((bmInfo.bmiHeader.biCompression==BI_BITFIELDS) ? 3 : 0)); else lpDIBBits=(LPVOID)(bmInfo.bmiColors+nColors); CClientDC dc(this); hBmp=CreateDIBitmap(dc.m_hDC,&bmiHeader,CBM_INIT,lpDIBBits,&bmInfo,DIB_RGB_COLORS); delete[] p; return hBmp;} 第一个问题:先在对话框类的头文件中定义:CBrush mybrush;在你的对话框中重载OnInitDialog()函数并加入以下代码:CBitmap *lsbitmap=new CBitmap;lsbitmap->LoadBitmap(IDB_BITMAP1);//IDB_BITMAP1为位图的资源符号;mybrush.CreatePatternBrush(lsbitmap);第二个问题如 freeleo(粑粑) 所说:)第三个问题:你可以灵活一点嘛,如果对话框大小已经固定,那就用图象处理软件把图象处理一下嘛!或对话框的大小依据图象而定:)第四个问题:Visual C++ 5.0以前的版本不能用,可现在的已可以把8位以上位图作为资源加入应用程序中了呀!这方面的用法有很多介绍的,很好找的:)) 可以啊,用bitmap资源中的import导入图片生成资源,在用bitblt或stretchblt即可 加入背景图,可自动平铺#ifndef _BACKGROUNDUTIL_H_#define _BACKGROUNDUTIL_H_#if _MSC_VER >= 1000#pragma once#endif // _MSC_VER >= 1000class CBackgroundUtil {public: BOOL SetBitmap(UINT uResourceID = 0); CBackgroundUtil(); virtual ~CBackgroundUtil();protected: BOOL TileBitmap(CDC* pDC, CRect rc); BOOL GetBitmapAndPalette(UINT nIDResource, CBitmap& bitmap, CPalette& pal); // For background bitmap CBitmap m_BmpPattern; CPalette m_BmpPalette; int m_nBmpWidth; int m_nBmpHeight;};#endif#include "stdafx.h"#include "BackgroundUtil.h"#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE[]=__FILE__;#define new DEBUG_NEW#endif//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////CBackgroundUtil::CBackgroundUtil(){}CBackgroundUtil::~CBackgroundUtil(){ m_BmpPattern.Detach(); m_BmpPalette.Detach();}BOOL CBackgroundUtil::SetBitmap(UINT uResourceID){ BITMAP bm; BOOL bRet; // Detach previous resources m_BmpPattern.Detach(); m_BmpPalette.Detach(); // Default return value bRet = TRUE; // Load new bitmap if (uResourceID != 0) { bRet = GetBitmapAndPalette(uResourceID, m_BmpPattern, m_BmpPalette); // If all ok if (bRet == TRUE) { // Get dimension m_BmpPattern.GetBitmap(&bm); // Width of the bitmap m_nBmpWidth = bm.bmWidth; // Height of the bitmap m_nBmpHeight = bm.bmHeight; } } return bRet;} // End of SetBitmapBOOL CBackgroundUtil::GetBitmapAndPalette(UINT nIDResource, CBitmap & bitmap, CPalette & pal){ LPCTSTR lpszResourceName = (LPCTSTR)nIDResource; HBITMAP hBmp = (HBITMAP)::LoadImage( AfxGetInstanceHandle(), lpszResourceName, IMAGE_BITMAP, 0,0, LR_CREATEDIBSECTION); if (hBmp == NULL) return FALSE; bitmap.Attach(hBmp); // Create a logical palette for the bitmap DIBSECTION ds; BITMAPINFOHEADER &bmInfo = ds.dsBmih; bitmap.GetObject(sizeof(ds), &ds); int nColors = bmInfo.biClrUsed ? bmInfo.biClrUsed : 1 << bmInfo.biBitCount; // Create a halftone palette if colors > 256. CClientDC dc(NULL); // Desktop DC if(nColors > 256) pal.CreateHalftonePalette(&dc); else { // Create the palette RGBQUAD *pRGB = new RGBQUAD[nColors]; CDC memDC; memDC.CreateCompatibleDC(&dc); memDC.SelectObject( &bitmap ); ::GetDIBColorTable( memDC, 0, nColors, pRGB ); UINT nSize = sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY) * nColors); LOGPALETTE *pLP = (LOGPALETTE *) new BYTE[nSize]; pLP->palVersion = 0x300; pLP->palNumEntries = nColors; for (int i=0; i < nColors; i++) { pLP->palPalEntry[i].peRed = pRGB[i].rgbRed; pLP->palPalEntry[i].peGreen = pRGB[i].rgbGreen; pLP->palPalEntry[i].peBlue = pRGB[i].rgbBlue; pLP->palPalEntry[i].peFlags = 0; } pal.CreatePalette( pLP ); delete[] pLP; delete[] pRGB; } return TRUE;} // End of GetBitmapAndPaletteBOOL CBackgroundUtil::TileBitmap(CDC* pDC, CRect rc){ CDC MemDC; int x = 0, y = 0; // If there is a bitmap loaded if (m_BmpPattern.m_hObject != NULL) { MemDC.CreateCompatibleDC(pDC); CBitmap* pOldBitmap = MemDC.SelectObject(&m_BmpPattern); // Tile the bitmap while (y < rc.Height()) { while(x < rc.Width()) { pDC->BitBlt(x, y, m_nBmpWidth, m_nBmpHeight, &MemDC, 0, 0, SRCCOPY); x += m_nBmpWidth; } x = 0; y += m_nBmpHeight; } MemDC.SelectObject(pOldBitmap); return TRUE; } return FALSE; // Normal behaviour} // End of TileBitmap使用,在你的对话框类上加入基类如class CMyDlg : public CDialog,public CBackgroundUtil加入消息函数 ON_WM_ERASEBKGND() afx_msg BOOL OnEraseBkgnd(CDC* pDC);BOOL CCurPriceDlg::OnEraseBkgnd(CDC* pDC) { CRect rc; GetClientRect(rc); if (TileBitmap(pDC, rc) == TRUE) return TRUE; else return CDialog::OnEraseBkgnd(pDC);} // End of OnEraseBkgnd在OnInitDialog()中加入SetBitmap(IDB_BMPBACK);或SetBitmap("c:\wwww.bmp");//位图文件 一、在对话类声明一个CBrush m_brush的全局刷子.二、重载OnCtlColor();HBRUSH CMyTmpLateDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { if(pWnd == this) return m_brush; else return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);}三、在OnInitDialog取得背景刷BOOL CMyTmpLateDlg::OnInitDialog() { CDialog::OnInitDialog(); CBitmap m_bitmap; MakeMyBkBrush(m_bitmap,"e:\\1.bmp"); m_brush.CreatePatternBrush(&m_bitmap); return TRUE; }四、背景图象函数。BOOL CMyTmpLateDlg::MakeBitmapFromFile(CBitmap & DesBitmap,LPCTSTR FileName){ CFile m_file; HGLOBAL m_hGlobal; int filelen; LPVOID pvData; IStream *pStm; IPicture *pPic; CDC *pDC,SrcDC; OLE_XSIZE_HIMETRIC hmWidth; OLE_YSIZE_HIMETRIC hmHeight; if (!m_file.Open(FileName,CFile::modeRead|CFile::shareDenyWrite)) { MessageBox("无法打开图片文件!"); return FALSE; } filelen = m_file.GetLength(); m_hGlobal = GlobalAlloc(GMEM_MOVEABLE, filelen); if(!m_hGlobal){ MessageBox("获取内存出错!"); return FALSE; } pvData = GlobalLock(m_hGlobal); if(!pvData){ MessageBox("取内存指针出错!"); GlobalUnlock(m_hGlobal); GlobalFree(m_hGlobal); return FALSE; } m_file.Read(pvData, filelen); m_file.Close(); GlobalUnlock(m_hGlobal); if(CreateStreamOnHGlobal(m_hGlobal, TRUE, &pStm)!=S_OK) { MessageBox("无法创建流!"); GlobalFree(m_hGlobal); return FALSE; } if(!(SUCCEEDED(OleLoadPicture(pStm,filelen,TRUE,IID_IPicture,(LPVOID*)&pPic)))) { MessageBox("无法从流中装载图片!"); pStm->Release(); GlobalFree(m_hGlobal); return FALSE; } GlobalFree(m_hGlobal); pPic->get_Width(&hmWidth); pPic->get_Height(&hmHeight); if(DesBitmap.GetSafeHandle()) DesBitmap.DeleteObject(); pDC = GetDC(); DesBitmap.CreateCompatibleBitmap(pDC,m_size.cx,m_size.cy); SrcDC.CreateCompatibleDC(pDC); ReleaseDC(pDC); SrcDC.SelectObject(&DesBitmap); CRect rect; GetClientRect(&rect); CSize m_size(rect.Width(),rect.Height()); if(FAILED(pPic->Render(SrcDC,0,0,m_size.cx,m_size.cy,0, hmHeight,hmWidth,-hmHeight,NULL))) { MessageBox("无法显示图片!"); pPic->Release(); pStm->Release(); return FALSE; } pPic->Release(); pStm->Release(); return TRUE;} 俄罗斯方块问题 skype乱码问题 VC程序怎么在其它机子上运行不了呢? 请教各位高手:在Tab Control控件中加入List Control控件的问题? 实现用程序控制QQ自动登陆 100分请教一个简单问题 菜单问题 怎么样让一个程序传递数据给另一个程序? 大虾帮忙看看我这个分割窗口有什么问题 一个关于VC设置的小问题 为什么我的一个.lib文件在程序连接执行的时候,提示告诉我打不开该文件! 一个关于句柄的问题
先读入图片,再blt
{
LPSTR p;
DWORD size;
CFile pf; pf.Open(path,CFile::modeRead);
size=pf.GetLength();
p=new char[size];
pf.ReadHuge(p,size);
pf.Close();
HBITMAP hBmp;
LPSTR hDIB,lpBuffer=p;
LPVOID lpDIBBits;
BITMAPFILEHEADER bmfHeader;
DWORD bmfHeaderLen; bmfHeaderLen=sizeof(bmfHeader);
strncpy((LPSTR)&bmfHeader,(LPSTR)lpBuffer,bmfHeaderLen);
if(bmfHeader.bfType!=((WORD)('M'<<8)|'B'))return NULL; hDIB=lpBuffer+bmfHeaderLen; BITMAPINFOHEADER &bmiHeader=*(LPBITMAPINFOHEADER)hDIB;
BITMAPINFO &bmInfo=*(LPBITMAPINFO)hDIB;
int nColors=bmiHeader.biClrUsed ? bmiHeader.biClrUsed : 1<<bmiHeader.biBitCount; //Specail process for more than 256 color bitmap.
if(bmInfo.bmiHeader.biBitCount>8)
lpDIBBits=(LPVOID)((LPDWORD)(bmInfo.bmiColors+bmInfo.bmiHeader.biClrUsed)+
((bmInfo.bmiHeader.biCompression==BI_BITFIELDS) ? 3 : 0));
else
lpDIBBits=(LPVOID)(bmInfo.bmiColors+nColors);
CClientDC dc(this);
hBmp=CreateDIBitmap(dc.m_hDC,&bmiHeader,CBM_INIT,lpDIBBits,&bmInfo,DIB_RGB_COLORS); delete[] p;
return hBmp;
}
先在对话框类的头文件中定义:
CBrush mybrush;
在你的对话框中重载OnInitDialog()函数并加入以下代码:
CBitmap *lsbitmap=new CBitmap;
lsbitmap->LoadBitmap(IDB_BITMAP1);//IDB_BITMAP1为位图的资源符号;
mybrush.CreatePatternBrush(lsbitmap);
第二个问题如 freeleo(粑粑) 所说:)
第三个问题:
你可以灵活一点嘛,如果对话框大小已经固定,那就用图象处理软件把图象处理一下嘛!或对话框的大小依据图象而定:)
第四个问题:
Visual C++ 5.0以前的版本不能用,可现在的已可以把8位以上位图作为资源加入应用程序中了呀!这方面的用法有很多介绍的,很好找的:))
#ifndef _BACKGROUNDUTIL_H_
#define _BACKGROUNDUTIL_H_#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000class CBackgroundUtil
{
public:
BOOL SetBitmap(UINT uResourceID = 0);
CBackgroundUtil();
virtual ~CBackgroundUtil();protected:
BOOL TileBitmap(CDC* pDC, CRect rc);
BOOL GetBitmapAndPalette(UINT nIDResource, CBitmap& bitmap, CPalette& pal);
// For background bitmap
CBitmap m_BmpPattern;
CPalette m_BmpPalette;
int m_nBmpWidth;
int m_nBmpHeight;
};#endif#include "stdafx.h"
#include "BackgroundUtil.h"#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////CBackgroundUtil::CBackgroundUtil()
{
}
CBackgroundUtil::~CBackgroundUtil()
{
m_BmpPattern.Detach();
m_BmpPalette.Detach();
}
BOOL CBackgroundUtil::SetBitmap(UINT uResourceID)
{
BITMAP bm;
BOOL bRet; // Detach previous resources
m_BmpPattern.Detach();
m_BmpPalette.Detach(); // Default return value
bRet = TRUE; // Load new bitmap
if (uResourceID != 0)
{
bRet = GetBitmapAndPalette(uResourceID, m_BmpPattern, m_BmpPalette);
// If all ok
if (bRet == TRUE)
{
// Get dimension
m_BmpPattern.GetBitmap(&bm);
// Width of the bitmap
m_nBmpWidth = bm.bmWidth;
// Height of the bitmap
m_nBmpHeight = bm.bmHeight;
}
} return bRet;
} // End of SetBitmap
BOOL CBackgroundUtil::GetBitmapAndPalette(UINT nIDResource, CBitmap & bitmap, CPalette & pal)
{
LPCTSTR lpszResourceName = (LPCTSTR)nIDResource; HBITMAP hBmp = (HBITMAP)::LoadImage( AfxGetInstanceHandle(),
lpszResourceName, IMAGE_BITMAP, 0,0, LR_CREATEDIBSECTION); if (hBmp == NULL) return FALSE; bitmap.Attach(hBmp); // Create a logical palette for the bitmap
DIBSECTION ds;
BITMAPINFOHEADER &bmInfo = ds.dsBmih;
bitmap.GetObject(sizeof(ds), &ds); int nColors = bmInfo.biClrUsed ? bmInfo.biClrUsed : 1 << bmInfo.biBitCount; // Create a halftone palette if colors > 256.
CClientDC dc(NULL); // Desktop DC if(nColors > 256)
pal.CreateHalftonePalette(&dc);
else
{
// Create the palette
RGBQUAD *pRGB = new RGBQUAD[nColors];
CDC memDC;
memDC.CreateCompatibleDC(&dc);
memDC.SelectObject( &bitmap );
::GetDIBColorTable( memDC, 0, nColors, pRGB );
UINT nSize = sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY) * nColors);
LOGPALETTE *pLP = (LOGPALETTE *) new BYTE[nSize];
pLP->palVersion = 0x300;
pLP->palNumEntries = nColors;
for (int i=0; i < nColors; i++)
{
pLP->palPalEntry[i].peRed = pRGB[i].rgbRed;
pLP->palPalEntry[i].peGreen = pRGB[i].rgbGreen;
pLP->palPalEntry[i].peBlue = pRGB[i].rgbBlue;
pLP->palPalEntry[i].peFlags = 0;
}
pal.CreatePalette( pLP );
delete[] pLP;
delete[] pRGB;
}
return TRUE;
} // End of GetBitmapAndPalette
BOOL CBackgroundUtil::TileBitmap(CDC* pDC, CRect rc)
{
CDC MemDC; int x = 0, y = 0; // If there is a bitmap loaded
if (m_BmpPattern.m_hObject != NULL)
{
MemDC.CreateCompatibleDC(pDC);
CBitmap* pOldBitmap = MemDC.SelectObject(&m_BmpPattern); // Tile the bitmap
while (y < rc.Height())
{
while(x < rc.Width())
{
pDC->BitBlt(x, y, m_nBmpWidth, m_nBmpHeight, &MemDC, 0, 0, SRCCOPY);
x += m_nBmpWidth;
}
x = 0;
y += m_nBmpHeight;
} MemDC.SelectObject(pOldBitmap); return TRUE;
} return FALSE; // Normal behaviour
} // End of TileBitmap使用,在你的对话框类上加入基类
如class CMyDlg : public CDialog,public CBackgroundUtil加入消息函数 ON_WM_ERASEBKGND()
afx_msg BOOL OnEraseBkgnd(CDC* pDC);BOOL CCurPriceDlg::OnEraseBkgnd(CDC* pDC)
{
CRect rc; GetClientRect(rc); if (TileBitmap(pDC, rc) == TRUE)
return TRUE;
else
return CDialog::OnEraseBkgnd(pDC);
} // End of OnEraseBkgnd在OnInitDialog()中加入
SetBitmap(IDB_BMPBACK);
或
SetBitmap("c:\wwww.bmp");//位图文件
HBRUSH CMyTmpLateDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
if(pWnd == this)
return m_brush;
else
return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
}三、在OnInitDialog取得背景刷BOOL CMyTmpLateDlg::OnInitDialog()
{
CDialog::OnInitDialog();
CBitmap m_bitmap;
MakeMyBkBrush(m_bitmap,"e:\\1.bmp");
m_brush.CreatePatternBrush(&m_bitmap);
return TRUE;
}四、背景图象函数。
BOOL CMyTmpLateDlg::MakeBitmapFromFile(CBitmap & DesBitmap,LPCTSTR FileName)
{
CFile m_file;
HGLOBAL m_hGlobal;
int filelen;
LPVOID pvData;
IStream *pStm;
IPicture *pPic;
CDC *pDC,SrcDC; OLE_XSIZE_HIMETRIC hmWidth;
OLE_YSIZE_HIMETRIC hmHeight; if (!m_file.Open(FileName,CFile::modeRead|CFile::shareDenyWrite))
{
MessageBox("无法打开图片文件!");
return FALSE;
} filelen = m_file.GetLength();
m_hGlobal = GlobalAlloc(GMEM_MOVEABLE, filelen); if(!m_hGlobal){
MessageBox("获取内存出错!");
return FALSE;
}
pvData = GlobalLock(m_hGlobal); if(!pvData){
MessageBox("取内存指针出错!");
GlobalUnlock(m_hGlobal);
GlobalFree(m_hGlobal);
return FALSE;
} m_file.Read(pvData, filelen);
m_file.Close();
GlobalUnlock(m_hGlobal);
if(CreateStreamOnHGlobal(m_hGlobal, TRUE, &pStm)!=S_OK)
{
MessageBox("无法创建流!");
GlobalFree(m_hGlobal);
return FALSE;
} if(!(SUCCEEDED(OleLoadPicture(pStm,filelen,TRUE,IID_IPicture,(LPVOID*)&pPic))))
{
MessageBox("无法从流中装载图片!");
pStm->Release();
GlobalFree(m_hGlobal);
return FALSE;
} GlobalFree(m_hGlobal); pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight); if(DesBitmap.GetSafeHandle())
DesBitmap.DeleteObject(); pDC = GetDC();
DesBitmap.CreateCompatibleBitmap(pDC,m_size.cx,m_size.cy);
SrcDC.CreateCompatibleDC(pDC);
ReleaseDC(pDC);
SrcDC.SelectObject(&DesBitmap); CRect rect;
GetClientRect(&rect);
CSize m_size(rect.Width(),rect.Height());
if(FAILED(pPic->Render(SrcDC,0,0,m_size.cx,m_size.cy,0,
hmHeight,hmWidth,-hmHeight,NULL)))
{
MessageBox("无法显示图片!");
pPic->Release();
pStm->Release();
return FALSE;
} pPic->Release();
pStm->Release(); return TRUE;
}