如题!请赐教!
解决方案 »
- 请教:关于指针和内存释放
- 坑爹的奇怪的new 坑爹的奇怪的GDI+
- 出现这个提示 'FindDIBBits' : undeclared identifier
- 为甚麽画一个点总是不成功
- 这个界面程序的刷新问题在哪里?
- 带有ActiveX的对话框,在没有安装VC的机器上打不开?
- 有没有类似ACCESS设计表视图那样的表格控件
- 我有CPropertyPage,CPropertySheet做成的属性表,如何将属性表放在FormView中。再做不出来我就要被炒了,谢谢大哥们了
- 如何使程序最小化后什么界面都没有?
- 天啊,救救 我,誰來救我?????有沒有人在,看看我的問題吧
- 卖点代码混点饭吃!(网络报表VC源码)
- 读/写文件,以及字符串操作的问题
再设置Static控件的属性General - type - bitmap,image - IDB_BITMAP
BOOL CBmpFieldDlg::ReadFromBLOB(CByteArray & DBArray)
{
CByteArray Array;
Array.Copy( DBArray);
//获得位图文件头信息长度
int HeaderLen = 78 + sizeof(BITMAPFILEHEADER);
Array.RemoveAt( 0, HeaderLen ); // I cut all Headers
//获得位图信息
BITMAPINFOHEADER &bmiHeader = *(LPBITMAPINFOHEADER)
Array.GetData() ;
BITMAPINFO &bmInfo = *(LPBITMAPINFO)Array.GetData() ;
//获得位图颜色数
int nColors = bmiHeader.biClrUsed ?
bmiHeader.biClrUsed : 1 << bmiHeader.biBitCount; //获得位图数据
LPVOID lpDIBBits;
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(NULL); //创建位图
HBITMAP hBmp = CreateDIBitmap( dc.m_hDC,
&bmiHeader,
CBM_INIT,
lpDIBBits,
&bmInfo,
DIB_RGB_COLORS);
OleBmp.Attach( hBmp ); //清除临时数组
Array.RemoveAll(); return TRUE;
}
IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION);
HDC hDC;
CStatic *ps = (CStatic *)GetDlgItem(IDC_TEXT);//IDC_TEXT是Static控件的ID
CDC *pDC = ps->GetDC();
hDC = CreateCompatibleDC(pDC->GetSafeHdc());
SelectObject(hDC, hBitmap);
CRect r;
ps->GetClientRect(&r);
BitBlt(pDC->GetSafeHdc(), 0, 0, r.Width(), r.Height(), hDC, 0, 0, SRCCOPY);
m_mapstore.LoadBitmap(IDB_BITMAP1);
m_Map.SetBitmap(m_mapstore);这样就可以了,m_Map 是Static里的CStatic类型变量
{
HDC hDesDC =::GetDC(hwnd);
BITMAP bm;
RECT rect;
HDC hSrcDC = ::CreateCompatibleDC(hDesDC);
HBITMAP hBitMap;
HBITMAP hOldBitMap; hBitMap = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),szName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE); ::GetObject(hBitMap,sizeof(BITMAP),&bm);
::GetClientRect(hwnd,&rect); ::SetStretchBltMode(hDesDC,
COLORONCOLOR
); hOldBitMap = (HBITMAP)::SelectObject(hSrcDC,hBitMap);
::StretchBlt(hDesDC,rect.left,rect.top,rect.right,rect.bottom,hSrcDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
::SelectObject(hSrcDC,hOldBitMap);
::InvalidateRect(hwnd,&rect,FALSE); ::ReleaseDC(hwnd,hDesDC);
::DeleteDC(hSrcDC);
::DeleteObject(hOldBitMap);
::DeleteObject(hBitMap); return TRUE;
}但是有个问题,控件被覆盖了图像不能刷新,不知道怎么解决?我使用hBitmap为全局变量,又出现新得问题:显示多个图像会造成内存泄漏,大家探讨探讨
不过要使用GDIPLUS// CStaticPic windowclass CStaticPic : public CStatic
{
// Construction
public:
CStaticPic();
CString m_szFile;
// Attributes
public:// Operations
public:// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CStaticPic)
//}}AFX_VIRTUAL// Implementation
public:
virtual ~CStaticPic(); // Generated message map functions
protected:
//{{AFX_MSG(CStaticPic)
afx_msg void OnPaint();
//}}AFX_MSG DECLARE_MESSAGE_MAP()
};/////////////////////////////////////////////////////////////////////////////
// CStaticPicCStaticPic::CStaticPic()
{
m_szFile.Empty();
}CStaticPic::~CStaticPic()
{
}
BEGIN_MESSAGE_MAP(CStaticPic, CStatic)
//{{AFX_MSG_MAP(CStaticPic)
ON_WM_PAINT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
// CStaticPic message handlersvoid CStaticPic::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
CRect rect;
GetClientRect(&rect);
// dc.FillSolidRect(&rect,RGB(0,0,0));
if(m_szFile.IsEmpty())
{
return;
}
rect.DeflateRect(1,1,2,2);
CString szBmpFile=g_GetHomeDirectory();
szBmpFile+="system\\";
m_szFile.TrimRight();
szBmpFile+=m_szFile; Graphics graphics(dc.m_hDC); Image* pImage=g_MyImgae.Get(szBmpFile); graphics.DrawImage(pImage,rect.left,rect.top,rect.right,rect.bottom); // Do not call CStatic::OnPaint() for painting messages
}
{
CDC MemDC; // 内存设备环境指针,在视的整个存在过程都将存在
CBitmap Bitmap,*pOldBmp;
CRect Source, Dest; // 记录源位图尺寸和最终显示尺寸
BITMAP bm;
if(MemDC.GetSafeHdc() == NULL)
{
HBITMAP hbitmap=(HBITMAP)LoadImage(0,strFileName,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE);
Bitmap.Attach(hbitmap);
MemDC.CreateCompatibleDC(pDC);
Bitmap.GetObject(sizeof(bm),&bm);
pOldBmp=MemDC.SelectObject(&Bitmap);
Source.top=0;
Source.left=0;
Source.right= bm.bmWidth;
Source.bottom = bm.bmHeight;
Dest = Source;
}
pDC->DPtoLP(&Dest);
if(pDC->IsPrinting())
{
Dest.left=(int)(Dest.left*((double)pDC->GetDeviceCaps(LOGPIXELSX))/iLogPixelX);
Dest.right=(int)(Dest.right*((double)pDC->GetDeviceCaps(LOGPIXELSX))/iLogPixelX);
Dest.top=(int)(Dest.top*((double)pDC->GetDeviceCaps(LOGPIXELSY))/iLogPixelY);
Dest.bottom=(int)(Dest.bottom*((double)pDC->GetDeviceCaps(LOGPIXELSY))/iLogPixelY);
}
pDC->StretchBlt(Dest.left, Dest.top, Dest.right, Dest.bottom,
&MemDC, Source.left, Source.top, Source.right,Source.bottom, SRCCOPY);
MemDC.SelectObject(pOldBmp);
Bitmap.DeleteObject();
MemDC.DeleteDC();
return;
}