歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> SHELL編程 >> CMFCShellList和自定義ShellList結合使用,達到“直接浏覽縮略圖,雙擊打開圖片”

CMFCShellList和自定義ShellList結合使用,達到“直接浏覽縮略圖,雙擊打開圖片”

日期:2017/3/2 17:30:14   编辑:SHELL編程
同樣,也可以對CMFCShellTreeCtrl進行重載,得到當前的目錄地址。 三、但是還是需要顯示縮略圖; 但是,核心問題還是沒有解決,現在還是顯示不了縮略圖。 一開始我想通過重寫List的CUSTOMDRAW事件來達到效果,但是研究一些資料之後,可以修改ListCtrl的樣式,卻無法修改主要內容。雖然CUSTOMDRAW中也提供了控價重構的機制,但是隱藏在許多宏中,不方便使用; 最後我開始反思之前我的ThumbNail是如何實現的,最後決定還是采用imagelist綁定的方法來解決問題。 這時,可以肯定基本是不用CMFCShellListCtrl了,而是要繼承原始的CListCtrl,基本思路就是從CMFCTreeListCtrl中獲得路徑名稱,而後在自定義的List控件中顯示出來。並且還要截獲List的點擊事件,那麼獲得選擇圖片的絕對地址。 其實在這個過程中,過濾後綴名等操作也是可以完成的。 四、DLG下的實驗 為了進行試驗,我首先在DLG下面進行了實驗。效果良好: 雙擊打開圖片,感覺速度上面還是有些問題。 這個DLG的例子可以參考附錄裡面的thumbnail例子,基本就是根據其修改的。 五、融合到GOPaint中去: GOPaint是我目前正在做的OpenCV圖像處理框架庫,力圖能夠提供大中型圖像處理軟件所需的基礎環境。那麼縮略圖也是必須的一個環節。 采用的是浮動窗口,比較美觀。畢竟要把主要區域用出來,顯示圖片。 在這裡融合的時候,我就有意識地將代碼進行合並。 對於ListCtrl和CMFCShellTreeCtrl分別進行了重載。這裡還是選擇了ListCtrl進行重載,因為CMFCShellListCtrl中的優秀特性這裡用不起來。 SplitePane繼承於CDockablePane,是一個懸浮框類。那麼在這個懸浮框中我將 CGOShellTreeCtrl m_wndTree;
CGOListCtrl m_ListThumbnail;
CPaneSplitter m_wndSplitter;
CImageList m_ImageListThumb; 都放在其中,還包括一些存儲用的變量。這樣的結果就是如果以後在其他地方需要使用,只需要將這幾個文件拷貝過去復用就可以了。 #pragma once
#include "afxshelltreectrl.h"
#include "afxshelllistctrl.h"
#include "panesplitter.h"
#include "GOShellTreeCtrl.h"
#include "GOListCtrl.h"
#include "afxwin.h"
#include <vector>
// CSplitePane
class CSplitePane : public CDockablePane
{
DECLARE_DYNAMIC(CSplitePane)
public:
CSplitePane();
virtual ~CSplitePane();
protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg void OnDestroy();
public:
CGOShellTreeCtrl m_wndTree;
CGOListCtrl m_ListThumbnail;
CPaneSplitter m_wndSplitter;
CPaneToolBar m_wndToolbar;
CImageList m_ImageListThumb;
int m_nSelectedItem;
void DrawThumbnails(void);
std::vector<CString> m_VectorImageNames;
BOOL GetImageFileNames(void);
void GetThumbnailsAndShow(void);
}; 具體的實現代碼已經不重要了,因為原理已經講明白了。這裡的代碼編寫需要對繼承、控件等都有一些了解。如果有不清楚的地方可以跟帖討論。 五、小結: 這樣一個效果,前後做了有2天,6-8個小時。我想還需要加強以下幾個方面的聯系: 1、對VS環境中提供的幾個新控件的認識。不僅是能夠了解使用,最好是能夠找到實現的代碼去跟一根。這樣以後需要實現自己想要的效果的時候有所依據。 MFC本身是系統的、連貫的。它自己的代碼很多時候就是最好的參考; 2、對繼承、復用等面向對象基本原理要加強理解。 3、解決問題的方法比結果更重要。這個縮略圖的問題可以說我一直就在思考和想解決,最後還是下定決心,達到了預計目的,各中過程也比較漫長。現在反思過來看,還是要緊緊抓住需要解決問題的核心,不要過度耽擱於細節。解決問題的方法一定是有的,相關的資料及時少,也是肯定有幫助的; 4、不斷積累。這裡探索的過程和探索的結果,將來都會成為很好的基礎。 六、參考資料 找到一了一些的例子: 1、http://blog.csdn.net/jiangsheng/article/details/3796 能夠直接顯示縮略圖,但是版本比較老了,很多地方需要修改。 2、http://bbs.csdn.net/topics/390709031 也是提供customeview修改的. 3、codeprojects Thumbnails viewer and image processing using GDI+ and MFC 這篇我跟了一下,效果很好,但是太復雜。 3、最後還是在自己的以前看過的代碼裡面找到了最合適的例子 thumbnail。原始鏈接可能是codeprojects上的,這裡直接放出代碼。 http://files.cnblogs.com/files/jsxyhelu/Thumbnail.rar 4、如果想學習DockPane,那麼codeprojects Understanding CDockablePane 這篇是最好的 感謝閱讀至此,希望有所幫助。

Copyright © Linux教程網 All Rights Reserved