显示位图,急! 怎样在一个对话框里显示一个位图?位图要是某个路经下文件而不是作为图标资源。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 CClientDC dc(this); CDC *cdc1; cdc1=new CDC;//定义一暂存DC CBitmap *bmp1; bmp1=new CBitmap;//位图对象 cdc1->CreateCompatibleDC(&dc);//将cdc转化为与dc兼容的DC bmp1->m_hObject=(HBITMAP)::LoadImage(NULL,".\\res\\icon.bmp",IMAGE_BITMAP,100,100,LR_LOADFROMFILE);//.\\res\\icon.bmp表示文件路径名,100,100分别表示这个图片的宽和高 cdc1->SelectObject(bmp1);//将位图放在暂存dc中 dc.BitBlt(30,30,100,100,cdc1,0,0,SRCCOPY);//将放在暂存DC中的位图贴于界面上,其中两个30表示贴图的左上角x,y坐标,100,100表示位图贴到目的地的宽和高,后面的0,0表示从位图的左上角x,y坐标开始贴 delete cdc1; delete bmp1; HBITMAP hBmp = ::LoadBitmap(::AfxGetInstanceHandle(), "文件名");//加载图象HDC hDC = ::GetDC(your hWnd);//显示图像的窗口HWND.这里是你的对话框句柄HDC hMemDC = ::CreateCompatibleDC(hDC);//内存中建立绘画句柄HBITMAP hBmpOld = (HBITMAP)::SelectObject(hMemDC, hBmp);//关联...................................你的操作...................................::BitBlt(hDC, 0, 0, nWidth, nHeight, hMemDC, 0, 0, SRCCOPY);//可以是StretchBlt以便改变显示大小::SelectObject(hMemDC, hBmpOld);::DeleteObject(hBmp);::DeleteObject(hMemDC);::ReleaseDC(your hWnd, hDC);//显示后处理 void LoadPictureFile(LPCTSTR szFile, CBitmap* pBitmap, CSize& mSize){ // open file HANDLE hFile = CreateFile(szFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); _ASSERTE(INVALID_HANDLE_VALUE != hFile); // get file size DWORD dwFileSize = GetFileSize(hFile, NULL); _ASSERTE(-1 != dwFileSize); LPVOID pvData = NULL; // alloc memory based on file size HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize); _ASSERTE(NULL != hGlobal); pvData = GlobalLock(hGlobal); _ASSERTE(NULL != pvData); DWORD dwBytesRead = 0; // read file and store in global memory BOOL bRead = ReadFile(hFile, pvData, dwFileSize, &dwBytesRead, NULL); _ASSERTE(FALSE != bRead); GlobalUnlock(hGlobal); CloseHandle(hFile); LPSTREAM pstm = NULL; // create IStream* from global memory HRESULT hr = CreateStreamOnHGlobal(hGlobal, TRUE, &pstm); _ASSERTE(SUCCEEDED(hr) && pstm); // Create IPicture from image file LPPICTURE gpPicture; hr = ::OleLoadPicture(pstm, dwFileSize, FALSE, IID_IPicture, (LPVOID *)&gpPicture); _ASSERTE(SUCCEEDED(hr) && gpPicture); pstm->Release(); OLE_HANDLE m_picHandle; /* long hmWidth, hmHeight; gpPicture->get_Width(&hmWidth); gpPicture->get_Height(&hmHeight); int nWidth = MulDiv(hmWidth, GetDeviceCaps(hdc, LOGPIXELSX), HIMETRIC_INCH); int nHeight = MulDiv(hmHeight, GetDeviceCaps(hdc, LOGPIXELSY), HIMETRIC_INCH); */ gpPicture->get_Handle(&m_picHandle); pBitmap->DeleteObject(); pBitmap->Attach((HGDIOBJ) m_picHandle); BITMAP bm; GetObject(pBitmap->m_hObject, sizeof(bm), &bm); mSize.cx = bm.bmWidth; //nWidth; mSize.cy = bm.bmHeight; //nHeight;} 将以下这段代码加在你的消息处理函数中就可以了!!注意bmp是一个CBitmap对象!!! // 设定打开文件的类型 CString csFilter = "Chart Files (*.bmp)|*.bmp|All Files (*.*)|*.*||"; // 设定默认扩展名 CString scStr = "dcm"; // 初始化CFileDialog CFileDialog OpenFileDialog ( TRUE, scStr, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT |OFN_ALLOWMULTISELECT ,csFilter ); // 打开文件对话框 if ( OpenFileDialog.DoModal () == IDOK ) { HBITMAP m_hBitmap=(HBITMAP)::LoadImage(NULL,OpenFileDialog.GetFileName(), IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION); bmp.Attach(m_hBitmap); CDC *pDC=GetDC(); CDC MemDC; MemDC.CreateCompatibleDC(pDC); CBitmap *pOldBitmap=MemDC.SelectObject(&bmp); BITMAP bm; bmp.GetObject(sizeof(BITMAP),&bm); pDC->BitBlt(0,0,bm.bmWidth,bm.bmHeight,&MemDC,0,0,SRCCOPY); MemDC.SelectObject(pOldBitmap); bmp.Detach(); } LoadImage()就可以从文件读取啊!!怎么画应该不是什么困难的事情吧 移动按钮位置的疑问 如何使用一个封装好的类? 请教帮助界面的问题 这个问题困扰我很久了。。如何隐藏窗口啊 谁能给我们一份有关Word文件格式的资料?[email protected] 急!CFormView去掉Client部分的边框,或变成Flat! 如何生成*.olb文件? 求中文的水晶报表设计器的下载地址,我知道.net有,但是我还不想用.net,在说我的硬盘也没有地方了。谢谢 怎样实现类似VB的赋记录集功能? VC+水晶报表,动态设置水晶报表数据源 如何把一个CString 转化成COleDateTime ===关于获取IP问题===
CDC *cdc1;
cdc1=new CDC;//定义一暂存DC
CBitmap *bmp1;
bmp1=new CBitmap;//位图对象
cdc1->CreateCompatibleDC(&dc);//将cdc转化为与dc兼容的DC
bmp1->m_hObject=(HBITMAP)::LoadImage(NULL,".\\res\\icon.bmp",IMAGE_BITMAP,100,100,LR_LOADFROMFILE);//.\\res\\icon.bmp表示文件路径名,100,100分别表示这个图片的宽和高
cdc1->SelectObject(bmp1);//将位图放在暂存dc中
dc.BitBlt(30,30,100,100,cdc1,0,0,SRCCOPY);//将放在暂存DC中的位图贴于界面上,其中两个30表示贴图的左上角x,y坐标,100,100表示位图贴到目的地的宽和高,后面的0,0表示从位图的左上角x,y坐标开始贴
delete cdc1;
delete bmp1;
HDC hDC = ::GetDC(your hWnd);//显示图像的窗口HWND.这里是你的对话框句柄
HDC hMemDC = ::CreateCompatibleDC(hDC);//内存中建立绘画句柄
HBITMAP hBmpOld = (HBITMAP)::SelectObject(hMemDC, hBmp);//关联
...................................
你的操作
...................................
::BitBlt(hDC, 0, 0, nWidth, nHeight, hMemDC, 0, 0, SRCCOPY);
//可以是StretchBlt以便改变显示大小
::SelectObject(hMemDC, hBmpOld);
::DeleteObject(hBmp);::DeleteObject(hMemDC);
::ReleaseDC(your hWnd, hDC);//显示后处理
void LoadPictureFile(LPCTSTR szFile, CBitmap* pBitmap, CSize& mSize)
{
// open file
HANDLE hFile = CreateFile(szFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
_ASSERTE(INVALID_HANDLE_VALUE != hFile); // get file size
DWORD dwFileSize = GetFileSize(hFile, NULL);
_ASSERTE(-1 != dwFileSize); LPVOID pvData = NULL;
// alloc memory based on file size
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
_ASSERTE(NULL != hGlobal); pvData = GlobalLock(hGlobal);
_ASSERTE(NULL != pvData); DWORD dwBytesRead = 0;
// read file and store in global memory
BOOL bRead = ReadFile(hFile, pvData, dwFileSize, &dwBytesRead, NULL);
_ASSERTE(FALSE != bRead);
GlobalUnlock(hGlobal);
CloseHandle(hFile); LPSTREAM pstm = NULL;
// create IStream* from global memory
HRESULT hr = CreateStreamOnHGlobal(hGlobal, TRUE, &pstm);
_ASSERTE(SUCCEEDED(hr) && pstm); // Create IPicture from image file
LPPICTURE gpPicture; hr = ::OleLoadPicture(pstm, dwFileSize, FALSE, IID_IPicture, (LPVOID *)&gpPicture);
_ASSERTE(SUCCEEDED(hr) && gpPicture);
pstm->Release(); OLE_HANDLE m_picHandle;
/*
long hmWidth, hmHeight;
gpPicture->get_Width(&hmWidth);
gpPicture->get_Height(&hmHeight);
int nWidth = MulDiv(hmWidth, GetDeviceCaps(hdc, LOGPIXELSX), HIMETRIC_INCH);
int nHeight = MulDiv(hmHeight, GetDeviceCaps(hdc, LOGPIXELSY), HIMETRIC_INCH);
*/
gpPicture->get_Handle(&m_picHandle);
pBitmap->DeleteObject();
pBitmap->Attach((HGDIOBJ) m_picHandle); BITMAP bm;
GetObject(pBitmap->m_hObject, sizeof(bm), &bm);
mSize.cx = bm.bmWidth; //nWidth;
mSize.cy = bm.bmHeight; //nHeight;
}
// 设定打开文件的类型
CString csFilter = "Chart Files (*.bmp)|*.bmp|All Files (*.*)|*.*||";
// 设定默认扩展名
CString scStr = "dcm";
// 初始化CFileDialog
CFileDialog OpenFileDialog ( TRUE, scStr, NULL,
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT |OFN_ALLOWMULTISELECT ,csFilter );
// 打开文件对话框
if ( OpenFileDialog.DoModal () == IDOK )
{
HBITMAP m_hBitmap=(HBITMAP)::LoadImage(NULL,OpenFileDialog.GetFileName(),
IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
bmp.Attach(m_hBitmap); CDC *pDC=GetDC();
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
CBitmap *pOldBitmap=MemDC.SelectObject(&bmp);
BITMAP bm;
bmp.GetObject(sizeof(BITMAP),&bm);
pDC->BitBlt(0,0,bm.bmWidth,bm.bmHeight,&MemDC,0,0,SRCCOPY);
MemDC.SelectObject(pOldBitmap);
bmp.Detach();
}
怎么画应该不是什么困难的事情吧