Re[2]: Сохранение битмапа - еще короче !!!
От: Vinni-puh Россия  
Дата: 29.04.04 11:32
Оценка:
Несколько замечаний к приведённому коду:
1. Не знаю, как в других компиляторах, а в VC 2003 атрибута lpVtbl нет.
2. Такой функции как ltrlenA я не нашёл.
В итоге, код, котовый к вставке в программу (проверено на VC 2003, он же 7.1):

BOOL SaveBitmap(HBITMAP hBitmap,HPALETTE hPal,LPCTSTR szPath)
{ PICTDESC pDesc;
  pDesc.cbSizeofstruct = sizeof(PICTDESC);
  pDesc.bmp.hbitmap = hBitmap;
  pDesc.bmp.hpal = hPal;
  pDesc.picType =  PICTYPE_BITMAP;
  return SavePictureIndirect(pDesc,szPath);
}
BOOL SavePictureIndirect(PICTDESC pDesc,LPCTSTR szPath)
{ IPicture* pPicture = NULL;
  BOOL bResult = TRUE;
  OleCreatePictureIndirect(&pDesc,IID_IPicture,FALSE,(void**)&pPicture);
  if(pPicture == NULL) bResult = FALSE;
    else bResult = SavePicture(pPicture,szPath);
  if(pPicture != NULL) pPicture->Release();
  return bResult;
}
BOOL SavePicture(IPicture* pPicture,LPCTSTR szPath)
{ HRESULT hr; int size = strlen(szPath);
 #ifdef _UNICODE
  BSTR bstrPath = SysAllocString(szPath);
  if (bstrPath == NULL) return FALSE;
 #else
  int len = strlen(szPath);
  BSTR bstrPath = SysAllocStringLen(NULL, len);
  if (bstrPath == NULL) return FALSE;
  MultiByteToWideChar(CP_ACP, 0, szPath, -1, bstrPath, len + 1);
 #endif
  hr = OleSavePictureFile((LPDISPATCH)pPicture,bstrPath);
  SysFreeString(bstrPath);
  return SUCCEEDED(hr);
}

Можно вызвать SaveBitmap, положив hPal=NULL, в этом случае будет использована палитра экрана.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.