1. 程式人生 > >在分割的檢視內實現CListCtrl控制元件 結合CImageList實現圖片的自動排列顯示

在分割的檢視內實現CListCtrl控制元件 結合CImageList實現圖片的自動排列顯示

把檢視左右分割,在右邊的檢視內顯示圖片,並使其能夠自動排列

先上一個效果圖:

步驟:

1.建立單文件檢視工程ListDemoView

2.分割檢視:

用類嚮導再建立一個以CView類為基類的類ListDemoViewLeft類,作為左側檢視類,將原來工程內自動形成的ListDemoView類作為右側檢視類

過載OnCreateClient的函式

過載OnCmdMsg函式(由於分割檢視後 可能會出現檢視無法響應選單訊息 因此需要過載這個函式)

MainFrm.h中加入:

public:
	BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext);//分割檢視
	BOOL OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo);//分割檢視響應選單訊息
private:
	CSplitterWnd m_splitterWnd;//用於分割視窗


再MainFrm.cpp中加入:

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
       // TODO: Add your specialized code here and/or call the base class
        m_splitterWnd.CreateStatic(this,1,2);
        CRect rect;
       GetClientRect(&rect);
       if (!m_splitterWnd.CreateView(0,0,RUNTIME_CLASS(ListDemoViewLeft),CSize(rect.Width()/4,rect.Height()),pContext)||
       !m_splitterWnd.CreateView(0,1,RUNTIME_CLASS(CListDemoView),CSize(rect.Width()*3/4,rect.Height()),pContext))
       {
              return FALSE;
       }
	
       return TRUE;
}


//過載OnCmdMsg 使得分割檢視中,每個view能夠接收到選單響應訊息
//先呼叫預設函式,如果命令沒有被處理(預設的OnCmdMsg返回FALSE),則獲取當前所有檢視指標,呼叫每個檢視的OnCmdMsg函式,將命令訊息傳送給每個檢視。
BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
{
	if ( CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo) )
		return TRUE;
	CListDemoDoc* pDoc = ( CListDemoDoc* ) GetActiveDocument ();
	POSITION pos = NULL;
	if ( pDoc != NULL )
		pos = pDoc->GetFirstViewPosition ();
	while ( pos != NULL )
	{
		CView* pNextView = pDoc->GetNextView ( pos );
		if ( pNextView != GetActiveView() )
		{
			if ( pNextView->OnCmdMsg ( nID, nCode, pExtra, pHandlerInfo ) )
				return TRUE;
		}
	}

	return FALSE;
}


3. 在右側檢視內實現CListCtrl控制元件

該實現利用了GDI+,因此需要現在stdafx.h中加入:

	#include <gdiplus.h>             //GDI+宣告,可以GDI/GDI+混合使用
	#pragma comment(lib, "gdiplus.lib")
	using namespace Gdiplus;


在ListDemoView.h中加入選單項:

顯示縮圖 設定ID為ID_SHOWPIC

在類嚮導中 在ListDemoView類中加入該選單項的COMMAND訊息響應函式OnShowpic

在ListDemoView.h中加入程式碼:
protected:
	void InitListCtrl();
private:
    CListCtrl     m_listCtrl;
    CImageList    m_imageList;
    short         m_imageW;
    short         m_imageH;
    HANDLE        m_handle;                        //迴圈插入圖片執行緒的控制代碼
    GdiplusStartupInput   m_gdiplusStartupInput;   //只需要在程式執行最開始初始化一次
    ULONG_PTR             m_gdiplusToken;          //只需要在程式執行最開始初始化一次
private:
    bool  insertImageItem(TCHAR* path);
public:
    void UpdateImageList();

在ListDemoView.cpp中加入程式碼: 建構函式中加入程式碼 m_imageW = 0;
m_imageH = 0; OnCreate函式:
int CListDemoView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;
	CRect rect;
	GetClientRect(&rect);
	//動態建立listctrl控制元件 LVS_AUTOARRANGE設定後圖標可隨視窗大小的變化自動排列
	m_listCtrl.Create(LVS_SINGLESEL|LVS_ICON|WS_CHILD|WS_VISIBLE|LVS_SINGLESEL|LVS_AUTOARRANGE,CRect(rect),this,IDC_LIST_DIVISION);
	InitListCtrl();
	return 0;
}

加入其他函式:
void CListDemoView::InitListCtrl()//ListCtrl與imagelist的初始化
{

	GdiplusStartup(&m_gdiplusToken, &m_gdiplusStartupInput, NULL );  //初始化GDI+
	m_listCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);//設定當前的列表檢視控制元件擴充套件的樣式
	m_listCtrl.SetIconSpacing(CSize(140, 130));     //設定圖片間距
	//設定縮圖大小,寬120 高90
	m_imageW = 120;
	m_imageH = 90;
	m_imageList.Create(m_imageW, m_imageH, ILC_COLORDDB|ILC_COLOR32, 1, 1);     //wide of picture is 120,height is 90
	m_listCtrl.SetImageList(&m_imageList,LVSIL_NORMAL);     //CImageList associates CListCtrl//LVSIL_NORMAL:大圖示方式進行影象列表,LVSIL_SMALL為小圖示,LVSIL_STATE 以影象狀態進行影象列表
	//UpdateImageList();
}




void CListDemoView::OnShowpic()//選單響應函式
{
     DWORD  dwID;
     //CreateThread在主執行緒的基礎上建立一個新執行緒。否則圖片無法實時顯示
     m_handle = CreateThread(NULL,  0, GetImageThread, this, 0, &dwID);
}
DWORD WINAPI GetImageThread( LPVOID lpParam )
{
    CListDemoView *pPicListDlg = (CListDemoView*)lpParam;
    pPicListDlg->UpdateImageList();
    return 1;
}
void CListDemoView::UpdateImageList()
{
	CString imagename;
	int a = 1, i =0;
	//while(a<=7)
	while(i<50)
	{
		a = i%7+1;//用於迴圈輸出影象,為方便輸出,此處在image檔案下存的圖片都是1.jpg,2.jpg一直到7.jpg的名稱
		imagename.Format(_T("image/%d.jpg"), a);
		TCHAR* imagename_t = new TCHAR[50];
		imagename_t = imagename.GetBuffer(imagename.GetLength());//cstring convert to tchar*
		imagename.ReleaseBuffer();
		insertImageItem(imagename_t);
		Sleep(300);
		i++;
	}
}
bool  CListDemoView::insertImageItem(TCHAR* path)
{
	Bitmap bmp(path);                     //傳入圖片路徑

	int sourceWidth = m_imageW;           //獲得圖片寬度,這個120和建立的120保持相同。
	int sourceHeight = bmp.GetHeight();   //獲得圖片寬度                                   
	if(sourceHeight>m_imageH)             //和m_ImageList.Create(120…)有很大關係,如果小於設
	{
		sourceHeight= m_imageH;           //定的寬度,圖片將無法顯示
	}


	Bitmap* pThumbnail = (Bitmap*)bmp.GetThumbnailImage(sourceWidth, sourceHeight, NULL, NULL); //設定縮圖的大小
	HBITMAP hBmp;
	pThumbnail->GetHBITMAP(Color(255,255,255),&hBmp);
	CBitmap *pImage = CBitmap::FromHandle(hBmp);         //轉換成CBitmap格式點陣圖

	TCHAR drive[MAX_PATH] = _T("");
	TCHAR dir[MAX_PATH] = _T("");
	TCHAR fname[MAX_PATH] = _T("");
	TCHAR ext[MAX_PATH] = _T("");

	_wsplitpath(path ,drive, dir,fname, ext);
	CString itemName(fname);
	itemName.Append(ext);

	int index = m_imageList.Add(pImage,RGB(255,255, 255));
	m_listCtrl.InsertItem(index, itemName, index);               // itemName,你自己設法得到圖片片的名字。名字會顯示在圖片下
	return true;
}

相關推薦

分割檢視實現CListCtrl控制元件 結合CImageList實現圖片自動排列顯示

把檢視左右分割,在右邊的檢視內顯示圖片,並使其能夠自動排列 先上一個效果圖: 步驟: 1.建立單文件檢視工程ListDemoView 2.分割檢視: 用類嚮導再建立一個以CView類為基類的類ListDemoViewLeft類,作為左側檢視類,將原來工程內自動形成的Li

利用jquery實現inpufile控制元件上傳的圖片在網頁上顯示

程式碼實現: <!Doctype html> <head> <title>擼起袖子加油幹</title> <meta charset='utf-8'> </head> <script src="http://w

安卓常用控制元件RecyclerView+HorizontalScrollView實現item側滑效果 安卓常用控制元件RecyclerView+HorizontalScrollView實現item側滑效果

原 安卓常用控制元件RecyclerView+HorizontalScrollView實現item側滑效果 2017年10月28日 12:23:14 低-調

拋磚引玉 【映象控制元件】 WPF實現毛玻璃控制元件不要太簡單

原文: 拋磚引玉 【映象控制元件】 WPF實現毛玻璃控制元件不要太簡單 原始碼已封裝成 MirrorGrid類 可以直接在XAML裡新增 根據需要可以把Grid 改為  button border等控制元件 注意 Target必須為當前控制元件下層的控制元件物件 &nb

View的學習筆記(二) 實現複合控制元件模板

實現複合控制元件模板 定義屬性 獲取屬性 通過TypedArray來獲取屬性值 組合控制元件 測量子View 放置子View 重寫滑動事件 通過介面來增加控制元件的互動 增加模板的拓展性 引用UI模板

CListCtrl控制元件的標題欄新增checkbox

CListCtrl控制元件的標題欄新增checkbox   CListCtrl控制元件的標題欄新增checkbox CListCtrl控制元件新增checkbox很容易,直接設定CListCtrl的風格就可以了。但是在標題欄也新增checkbox,實現全選和全不選,貌似都只能採

C#GDI+自定義繪製曲線圖表控制元件DataChart 簡單實現 C#GDI+ 繪製線段(實線或虛線)、矩形、字串、圓、橢圓

C#GDI+自定義繪製曲線圖表控制元件DataChart 這裡只說明在計算刻度和曲線繪製的時候 只提供思路,只是做了下簡單的計算,不喜勿噴 還望見諒,高手直接飄過吧。這個要做好,還是需要研究研究演算法的,比如刻度隨著控制元件的大小發生改變的時候計算不同的值,根據刻度範圍來計算刻度以及刻度值等,這裡沒有研究,

VC/MFC 在對話方塊中建立檢視並在檢視區新增ListCtrl控制元件

自定義的view類用於顯示在對話方塊上 class CGroupMenuView : public CScrollView { protected:  CGroupMenuView(); ……………… ………… };   class CWorkView :

android自定義星級評分控制元件,可實現顯示實心星星

話不多說,上圖 近日app需求弄一個等級展示,看了下UI圖,只顯示實星(點亮的星星).如圖 但是網上關於星級評分的例子大多這樣 也展示虛心星星 通過自定義View package com.starsbar; import android.content.C

ApolloStudio高手之路(6):用Python以極簡方式讀寫OPC DA、OPC UA資料並實現UI控制元件自動繫結重新整理顯示

OPC(OLE for Process Control, 用於過程控制的OLE)是一個工業標準,OPC是為了連線資料來源(OPC伺服器)和資料的使用者(OPC應用程式)之間的軟體介面標準。資料來源可以是PLC,DCS,條形碼讀取器等控制裝置。隨控制系統構成的不同,作為資料來源的OPC伺服器既可以

安卓實現任意控制元件view可拖拽,並監聽拖拽和點選事件,可自動拉回螢幕邊緣

因為專案中有需要實現控制元件可任意拖拽的需求,所以簡單寫了個自定義OnTouchListener,以作拋磚引玉,歡迎大家提議反饋。 完整實現類如下,程式碼中有詳細註釋: 使用者可以決定是否開啟自動拖拽邊緣功能,可以監聽控制元件的拖拽和點選事件 public cl

View的學習筆記(二) 實現複合控制元件模板

利用已有的View控制元件,來組合創造出自己所需要的複合控制元件,然後提煉成模板,供自己在同一個專案中複用,確保風格統一 定義屬性 讓新的複合控制元件像原生控制元件一樣,可以在xml中設定屬性 在res資源目錄的values目錄下建立attrs.xml屬性定義

Android控制元件TextView的實現原理分析

                        在前面一個系列的文章中,我們以視窗為單位,分析了WindowManagerService服務的實現。同時,在再前面一個系列的文章中,我們又分析了視窗的組成。簡單來說,視窗就是由一系列的檢視按照一定的佈局組織起來的。實際上,每一個檢視都是一個控制元件,這些控制可以

Delphi實現拍照控制元件的程式程式碼

完整的delphi拍照控制元件程式碼,實現利用攝像頭進行拍照的功能。需要TVideoCap控制元件支援。 procedure Tfrm1.Button2Click(Sender: TObject); Var jpeg: TJPEGImage; bmp: TBitmap; MyStm:TMemo

html表單實現互動,控制元件,可訪問性

實現互動: 背景 什麼是表單表單如何工作,表單在瀏覽器中如何工作(什麼是控制元件)具體操作<form>語法,post和get區別(外觀上,本質上) -------------------

裸寫一個含嵌IE控制元件的視窗

@溪流至於躲開的技巧。。。 其實事情起因是這樣。。。大概08-10年我就在cppblog或者CU(不記得是哪個地方了,又或者都有說)上說interface存在的問題。一個函式f,它對它的引數有一些要求,例如你的程式碼中不是E_NOTIMPL那些。 而不同的函式對它的引數有不同的需求。但interface的問題

Unity3D資料視覺化控制元件的簡單實現-Mysql資料庫

    專案實現的是比較簡易的資料視覺化,用到Mysql資料庫和Unity3D中的Graph_Maker.    直接上實現圖,通過輸入資料庫名、賬號、密碼、資料表名跳轉    展示效果為Graph_Maker中的折線圖,X軸和Y軸座標內容可以手動更改,滑鼠指標滑動到資料點時

CListCtrl控制元件使用

設定焦點: BOOL SetItemState(int nItem, UINT nState, UINT nMask) nItem 要設定狀態項的索引。 pItem LVITEM結構的地址,如聯機文件“平臺SDK”中所述。該結構的 stateMask成員指

C# 實現TrackBar控制元件美化換膚

TrackBar控制元件沒有像其他控制元件那樣,直接提供給使用者重繪的函式,要實現個性化的TrackBar控制元件,一種方法是繼承Control完全的自己實現,這種方法就是實現標準的Windows控制元件功能需要自己處理很多東西,例如:實現一樣的屬性、鍵盤的操作、滑鼠滾

檔案上傳控制元件Fileupload(實現檔案上傳並寫入資料庫)

首先我們來說一下Fileupload這個檔案上傳控制元件的幾大敗筆: 1.上傳之後按F5重新整理,重複提交 2.提交以後按後退鍵Fileupload中的資訊還在 3.不支援多檔案上傳 4.上傳前不能檢測檔案大小 解決方法: 1.建立iframe在子頁面實現或者重定向語句(R