I am attempting to use IPreviewHandler to create a dll that can preview an image in the file preview pane. I am basing it off of:
To boil down my current approach I am hard coding in the path to an image, loading it as a HBITMAP and sending it to the pane window via SendMessage(). This approach is causing the following issues:
I am unable to resize HBITMAP without reloading it, this seems highly inefficient.
I am unable to choose to change the path of the bitmap depending on which file I click on. I would ideally like to extract the file name and use that to determine a path to the bitmap in another folder of the same name.
If anyone knows or can guide me to a better approach please let me know. I would ideally like it to act like how VLC treats its preview panes with an image previewing the video alongside the software's logo.
=========================EDIT============================
Here is how I have implemented the above:
Starting with loadPreview() which loads the bitmap.
boolean CRecipePreviewHandler::loadPreview
(
void
)
//*Description
// change the bitmap control part of this to show the preview
// from the file associated with m_bitmapFile
{
boolean r = TRUE;
// Find dimension of bitmap
std::ifstream file;
file.open(m_bitmapFile, std::ios::binary);
if (file.fail())
{
// File does not exist
file.close();
return r;
}
BITMAPINFOHEADER bmiHeader;
file.seekg(sizeof(BITMAPFILEHEADER));
file.read((char*)&bmiHeader, sizeof(BITMAPINFOHEADER));
file.close();
UINT cx = bmiHeader.biWidth;
UINT cy = bmiHeader.biHeight;
if (cx == 0 || cy == 0)
{
return r;
}
// transfer picture to dialog control
m_b = (HBITMAP)LoadImage(NULL, m_bitmapFile, IMAGE_BITMAP, cx, cy, LR_LOADFROMFILE);
r = FALSE;
return r;
}
Where m_b is type HBITMAP, and m_bitmapFile is type LPCWSTR containing the path to the bitmap.
This is called by DoPreview(), an override from the IPreviewHandler class which sends the bitmap to the preview pane child window.
HRESULT CRecipePreviewHandler::DoPreview()
{
HRESULT hr = E_FAIL;
if (_hwndPreview == NULL && _pStream) // cannot call more than once (Unload should be called before another DoPreview)
{
int border = 0;
// Create the preview window
_hwndPreview = CreateWindowExW(0, L"STATIC", NULL,
SS_BITMAP | SS_CENTERIMAGE | SS_REALSIZECONTROL | WS_CHILDWINDOW, // Always create read-only
_rcParent.left+border, _rcParent.top+border, RECTWIDTH(_rcParent)+border, RECTHEIGHT(_rcParent)+border,
_hwndParent, NULL, NULL, NULL);
if (_hwndPreview == NULL)
{
hr = HRESULT_FROM_WIN32(GetLastError());
}
else
{
if (loadPreview())
{
hr = HRESULT_FROM_WIN32(GetLastError());
}
else
{
SendMessage(_hwndPreview, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)m_b);
ShowWindow(_hwndPreview, SW_SHOW);
}
}
}
return hr;
}
The rest of the code is fairly standard with an initializer, an uninitializer and a rectangle size setter (I am currently not changing the size of the bitmap due to the high cost).