在分割的檢視內實現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