檔案預覽對話方塊的實現

2021-04-02 12:37:19 字數 2263 閱讀 8102

檔案預覽可對所有在資源管理器中能夠進行影象預覽的檔案進行預覽,而不僅僅只是檔案。如網頁檔案,甚至是cad檔案,像作者在進行ug二次開發時就使用了本文所使用的方法預覽ug的part檔案。

關於怎麼定製通用對話方塊已經有很多文章講了,這裡就不講了,我這裡主要講的是如何從檔案中提取出它的預覽影象。

對於檔案預覽圖的提取,系統提供了乙個shell介面,iextractimage,通過它的extract方法就可以取出預覽圖的點陣圖控制代碼。而iextractimage介面可以通過ishellfolder介面的getuiobect方法獲得。這個ishellfolder是檔案所在資料夾的ishellfolder。要取得任意資料夾的ishellfolder,必須從桌面的ishellfolder開始一級一級的往下找,因為取得ishellfolder需要從其父ishellfolder的bindtoobject得到,在其中使用相對的pidl。整個操作都是以pidl為基礎的,這個pidl就是外殼命名空間的物件的id,關於外殼命名空間及專案id的解釋見我的另一篇翻譯《外殼命名空間》。下面給出幾個有用的函式:

// 從檔案的全路徑得到它的絕對pidl

lpitemidlist parsepidlfrompath(lpcstr lpszpath)

// 取出乙個pidl的下乙個pidl,請參看《外殼命名空間》的空間物件的id的圖示

lpitemidlist getnextitem(lpitemidlist pidl)

// 取得idl的大小

int getpidlsize(lpitemidlist lpidl)

return (unsigned short)(cb + 2);

}// 將兩個pidl相減,得到相對的id,lpi1必須比包含lpi2

lpitemidlist subtractidlist(lpitemidlist lpi1, lpitemidlist lpi2)

lpitemidlist lpinew = null;

ushort cb1 = getpidlsize(lpi1);

ushort cb2 = getpidlsize(lpi2);

if(cb1 != 0)

if(cb2 != 0)

ushort cb = cb1 - cb2 + 2;

lpmalloc lpmalloc = 0;

shgetmalloc(&lpmalloc);

if(!lpmalloc)

lpinew = (lpitemidlist)lpmalloc ->alloc(cb);

if(lpinew)

return lpinew;

}// 根據空間物件的全路徑pidl取得物件的父資料夾的ishellfolder及物件本身的專案id

// lpsfdesktop 桌面的ishellfolder,可以通過shgetdesktopfolder得到

// lpi 檔案物件的全路徑pidl,可通過上面的parsepidlfrompath由路徑名獲得

// lpiret 返回的檔案物件自身的專案id

// 返回值 檔案物件所在資料夾的ishellfolder

lpshellfolder extractparentshellfolder(lpshellfolder lpsfdesktop, lpitemidlist lpi, lpitemidlist &lpiret)

if(lpiret)

lpiret = subtractidlist(lpi1, lpi2);

lpsftemp->bindtoobject(lpiret, null, iid_ishellfolder, (void**)&lpsfparent);

if(lpsftemp != lpsfdesktop)

lpsftemp = lpsfparent;

lpi1 = lpi2;

}if(pmalloc)

return lpsfparent;

}// 檔案預覽對話方塊在檔案選中被改變時的通知處理函式

// m_stthumbnail為預覽影象的static控制項

void cpreviewfiledialog::onfilenamechange()

m_stthumbnail.setbitmap(hbmthumbnail);

m_stthumbnail.invalidate();

m_pextimg->release();

}lpmalloc pmalloc = null;

shgetmalloc(&pmalloc);

if(pmalloc)

lpsfparent->release();}}

MFC 實現開啟檔案對話方塊 儲存檔案對話方塊

cfiledialog cfiledialog bool bopenfiledialog,lpctstr lpszdefext null,lpctstr lpszfilename null,dword dwflags ofn hidereadonly ofn overwriteprompt,lpct...

模態對話方塊 非模態對話方塊 標準對話方塊 檔案對話方塊

模態對話方塊 qdialog 非模態對話方塊 qdialog 標準對話方塊 關於對話方塊 問題對話方塊等 qmessagebox 檔案對話方塊 qfiledialog 標準對話方塊還有 qcolordialog 選擇顏色 qfiledialog 選擇檔案或者目錄 qfontdialog 選擇字型 q...

檔案選擇對話方塊 路徑選擇對話方塊的函式實現

在專案中,我們有時需要對一些檔案進行處理。這時,我們需讓使用者從資源管理器中選擇這些檔案。函式的功能是實現彈出檔案選擇對話方塊,並獲取使用者選擇的檔案。檔案選擇對話方塊實現 bool filesselect cstring csfilespath return false bool filessel...