⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 treeview.cpp

📁 用win32sdk实现的迷你阅读器
💻 CPP
字号:
#include"TreeView.h"

#include <stdio.h>
#include <string.h>

static char * buf = NULL;

extern BSTTREE			*MySTRTree;
extern WNDPROC			OldEditProc;
extern HWND				hStr;
extern LPCTSTR			TmpStr;
extern COLORREF			bgcolor; //背景色


int CALLBACK WndProcTree(HWND hWnd, unsigned wMessage,WPARAM wParam, LPARAM lParam)
{
	long style;
	BYTE Red,Green,Blue;
	switch (wMessage)
	{
		//	case WM_NCHITTEST:
		//	TreeView_Expand(hWnd,TVGN_CARET,TVE_TOGGLE);
		//	break;
		//	case WM_LBUTTONDOWN:
			//SetCapture(hWnd);
			//	return 	DefWindowProc(hWnd, wMessage, wParam, lParam);
			case WM_PAINT:
				DefWindowProc(hWnd, wMessage, wParam, lParam);
				Red  = BYTE((255+GetRValue(bgcolor))/3); ///得到红颜色
				Green= BYTE((255+GetGValue(bgcolor))/3); ///得到绿颜色
				Blue = BYTE((255+GetBValue(bgcolor))/3); ///得到兰颜色
			//	Red  = min(255,BYTE(0.30 *GetRValue(bgcolor))); ///得到红颜色
			//	Green= min(255,BYTE(0.59 *GetGValue(bgcolor))); ///得到绿颜色
			//	Blue = min(255,BYTE(0.11 *GetBValue(bgcolor))); ///得到兰颜色
			//	Red  = min(255,255-GetRValue(bgcolor)); ///得到红颜色
			//	Green= min(255,255-GetGValue(bgcolor)); ///得到绿颜色
			//	Blue = min(255,255-GetBValue(bgcolor)); ///得到兰颜色
				SendMessage(hWnd,TVM_SETBKCOLOR,0,RGB(Red,Green,Blue));
				style = GetWindowLong(hWnd, GWL_STYLE);
				if(style&&TVS_HASLINES)
				{
					SetWindowLong(hWnd, GWL_STYLE, style|TVS_HASLINES) ;
					SetWindowLong(hWnd, GWL_STYLE, style);
				}
			break;
	    	case WM_DROPFILES:
			char lpszFile[ 80 ];
			char szBuff[ 1024 ];
			SHFILEINFO sfi;
			HDROP hDropInfo;
			hDropInfo = ( HDROP )wParam;
			WORD cFiles = DragQueryFile( hDropInfo,( UINT )0xFFFFFFFF,( LPTSTR )NULL,( UINT )NULL );
			if(cFiles==1)
			{
				DragQueryFile( hDropInfo,0,lpszFile,sizeof( lpszFile ) );
				if( SHGetFileInfo(lpszFile,0,&sfi,sizeof( SHFILEINFO ),SHGFI_DISPLAYNAME | SHGFI_TYPENAME ) )
				{
					memset( szBuff,0,sizeof( szBuff ) );
					wsprintf( szBuff,"Name: %s Type: %s",sfi.szDisplayName,sfi.szTypeName );
					//MessageBox(hWnd,szBuff,"",MB_OK);
					//MessageBox(hWnd,lpszFile,"",MB_OK);
					AddStr(hWnd,lpszFile);
				//	InvalidateRect(hStr,NULL,FALSE);
				}
			}
			DragFinish( hDropInfo );
			return 0;
	}
	return CallWindowProc(OldEditProc,hWnd,wMessage,wParam,lParam);
	//return (DefWindowProc(hWnd, wMessage, wParam, lParam));
}

LPCTSTR GetItemText(HWND hTree, HTREEITEM hItem)
{
	static TCHAR		szString[MAX_PATH]={0};
	TVITEM				stTVI;

	ZeroMemory( szString, sizeof(szString));
	stTVI.hItem			= hItem;
	stTVI.mask			= TVIF_TEXT;
	stTVI.cchTextMax	= sizeof(szString);
	stTVI.pszText		= szString;
	SendMessage( hTree, TVM_GETITEM, 0, (LPARAM)&stTVI);	

	return (szString);
}

char * szcpy_ret_dstnext( char * dst, const char * src )
{
	while( *dst++ = *src++ );
	return dst;
}

void putChild (FILE *fp/*,char * buf*/, int chRows, int chLines ,HWND hTree, HTREEITEM hItem)
{
	static TV_INSERTSTRUCT		stTVIS;
    elemtype			MyTreeNode;
	char				* pszbegin;		
	HTREEITEM			hTreeItem;
	int					rows, lines, i;	
	TCHAR				szString[32768]= {0};
	static TCHAR		szTempStr[32768]={0};
	rows = chRows, lines = chLines;	
	if (! rows && ! lines) {
		if (fscanf (fp, "%ld", &rows) != 1
			|| fscanf (fp, "%ld", &lines) != 1)
			return;
	}
	if ((chLines = fgetc (fp)) != '\n')		
			ungetc (chLines, fp);
	if (fgets (szString, 32768, fp) == NULL) {
		MessageBox(hTree,"目前无法支持打开该文件!","系统提示",48);
		TreeView_DeleteAllItems(hTree);
		return;
	}
	if(hItem==NULL)
	{
		stTVIS.hParent	=TVI_ROOT;
		stTVIS.hInsertAfter = TVI_LAST;
		stTVIS.item.mask	= TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
		stTVIS.item.pszText =szString;
		stTVIS.item.iImage			=ID_ROOT;
		stTVIS.item.iSelectedImage	=ID_ROOT;
		hTreeItem=TreeView_InsertItem(hTree, &stTVIS);
	}
	else
	{
		stTVIS.hParent	= hItem;
		stTVIS.hInsertAfter = TVI_LAST;
		stTVIS.item.mask	= TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
		stTVIS.item.iImage			=ID_CLOSEFOLD;
		stTVIS.item.iSelectedImage	= ID_OPENFOLD;
		stTVIS.item.pszText = szString;
		hTreeItem=TreeView_InsertItem( hTree, &stTVIS);
	}
	ZeroMemory(szString, sizeof(szString));
	pszbegin = buf;
	for (i = 0; i < lines; i++) {
		ZeroMemory(szTempStr, sizeof(szTempStr));
	//	if ((chLines = fgetc (fp)) != '\n')	
	//		ungetc (chLines, fp);
		if (fgets (szTempStr, 32768, fp) == NULL) {
		MessageBox(hTree,"目前无法支持打开该文件!","系统提示",48);
		TreeView_DeleteAllItems(hTree);
		return;
		}
		lstrcat(szString, szTempStr);
	//	buf=szcpy_ret_dstnext(buf,szTempStr);
	//	MessageBox(hTree,szString,"",MB_OK);
	} 
		buf=szcpy_ret_dstnext(buf,szString);
		ZeroMemory(szString, sizeof(szString));
	//	MessageBox(hTree,pszbegin,"",MB_OK);
		MyTreeNode.key=(keytype)hTreeItem;
		MyTreeNode.MyStr=pszbegin;
		MySTRTree->insert(MyTreeNode);
		for (i =0; i < rows; i++) {
		if (fscanf (fp, "%ld", &chRows) != 1
			|| fscanf (fp, "%ld", &chLines) != 1)
			return;
	//	if ((chLines = fgetc (fp)) != '\n')	
	//		ungetc (chLines, fp);
		putChild (fp/*, buf*/, chRows, chLines,hTree,hTreeItem);
		}
}

/*
void putChild (FILE *fp, int chRows, int chLines ,HWND hTree, HTREEITEM hItem)
{
	static TV_INSERTSTRUCT		stTVIS;
    elemtype			MyTreeNode;
//	MyTreeNode.MyStr =	TEXT("");
//	char * pszbegin;		
	HTREEITEM				hTreeItem;
	int rows, lines, i;				// rows == childs
	TCHAR		szString[32768]= {0};
	static TCHAR		szTempStr[MAX_PATH]={0};
//	static char nodeStr[32768];			 // not create this str every call

	rows = chRows, lines = chLines;
	
	if (! rows && ! lines) {
		if (fscanf (fp, "%ld", &rows) != 1
			|| fscanf (fp, "%ld", &lines) != 1)
			return;//EOF
//		if ((chLines = fgetc (fp)) != '\n')		// skip the '\n' of the end of line
//			ungetc (chLines, fp);
	}
//  先读一行
	if ((chLines = fgetc (fp)) != '\n')		// skip the '\n' of the end of line
			ungetc (chLines, fp);
	if (fgets (szString, 32768, fp) == NULL) {
		return;
		//delete thisNODE,and return;
	}
//	pszbegin = buf;
//	buf=szcpy_ret_dstnext(buf,nodeStr);
//	*(buf - 2) = '\0';
	if(hItem==NULL)
	{
		stTVIS.hParent	=TVI_ROOT;////TreeView_InsertItem( hTree, &stTVIS);
		stTVIS.hInsertAfter = TVI_LAST;
		stTVIS.item.mask	= TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
		stTVIS.item.pszText =szString;//TEXT("");// pszbegin;
		stTVIS.item.iImage			=ID_ROOT;// ID_CLOSEFOLD;
		stTVIS.item.iSelectedImage	=ID_ROOT;// ID_OPENFOLD;
		hTreeItem=TreeView_InsertItem(hTree, &stTVIS);
	}
	else
	{
		stTVIS.hParent	= hItem;
		stTVIS.hInsertAfter = TVI_LAST;//TVI_ROOT;
		stTVIS.item.mask	= TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
		stTVIS.item.iImage			=ID_CLOSEFOLD;
		stTVIS.item.iSelectedImage	= ID_OPENFOLD;
		stTVIS.item.pszText = szString;//TEXT("");//pszbegin;
		hTreeItem=TreeView_InsertItem( hTree, &stTVIS);
	}
	ZeroMemory(szString, sizeof(szString));
//	pszbegin = buf;
	for (i = 0; i < lines; i++) {
		ZeroMemory(szTempStr, sizeof(szTempStr));
		if ((chLines = fgetc (fp)) != '\n')		// skip the '\n' of the end of line
			ungetc (chLines, fp);
		if (fgets (szTempStr, 32768, fp) == NULL) {
			return;
			//delete thisNODE,and return;
		}
		lstrcat(szString, szTempStr);
//		MessageBox(hTree,szString,"",MB_OK);
//		wsprintf( nodeStr,"%d",lstrlen(nodeStr));					
//		MessageBox(hTree,nodeStr,"",MB_OK);
//		buf=szcpy_ret_dstnext(buf,nodeStr);
//		lstrcat( szBuffer, szBuffer);
	}

//	*(buf - 2) = '\0';
//	MessageBox(hTree,szString,"",MB_OK);
		MyTreeNode.key=(keytype)hTreeItem;
		MyTreeNode.MyStr=TEXT("try");
//		MyTreeNode.MyStr=(TCHAR*)malloc(sizeof(TCHAR)*MAX_PATH);
	//	CopyMemory(MyTreeNode.MyStr,szString, sizeof(szString));
//		lstrcpy(MyTreeNode.MyStr,szString);
	//	ZeroMemory(MyTreeNode.MyStr, sizeof(MyTreeNode.MyStr));
	//	MyTreeNode.MyStr=NULL;
	//	CopyMemory(MyTreeNode.MyStr,szString, sizeof(*szString));
	//  MyTreeNode.MyStr=szString;//TEXT("");//pszbegin;
	//	lstrcat(MyTreeNode.MyStr, szString);
	//	szcpy_ret_dstnext(MyTreeNode.MyStr, szString);
	//	MessageBox(hTree,MyTreeNode.MyStr,"",MB_OK);
		ZeroMemory(szString, sizeof(szString));
		MySTRTree->insert(MyTreeNode);
	for (i =0; i < rows; i++) {
		if (fscanf (fp, "%ld", &chRows) != 1
			|| fscanf (fp, "%ld", &chLines) != 1)
			return;
	//	if ((chLines = fgetc (fp)) != '\n')		// skip the '\n' of the end of line
	//		ungetc (chLines, fp);
//		putChild (fp, buf, chRows, chLines,hTree,hTreeItem);
		putChild (fp, chRows, chLines,hTree,hTreeItem);
	}
	//	ZeroMemory(nodeStr, sizeof(nodeStr));
}

*/


int AddStr(HWND hTree,LPCTSTR lpfile)
{
	HANDLE hFile; 
	DWORD dwFileSize; 
	hFile=CreateFile(lpfile,GENERIC_READ,
                FILE_SHARE_READ, NULL,
                OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,
                (HANDLE)NULL);
	if(hFile!=INVALID_HANDLE_VALUE)
	{	 //检取文件字节大小。
          dwFileSize=GetFileSize(hFile,NULL);
		  CloseHandle(hFile) ;
	}
	else
		return 0;
	FILE * fp;
	if ((fp = fopen (lpfile, "rt")) == NULL)
		return 1;
	TreeView_DeleteAllItems(hTree);
	MySTRTree->deleteAll();
//	MessageBox(hTree,"","",MB_OK);
	//delete 	MySTRTree;
	//MySTRTree=new BSTTREE;	
	// MKNODE root	
	if (buf != NULL) {
		GlobalFree (buf);
		buf = NULL;
	}	 
	buf = (char *)GlobalAlloc (0,dwFileSize+10240);

//	putChild (fp, buf, 0, 0,hTree,NULL);
	putChild (fp, 0, 0,hTree,NULL);
	TmpStr=TEXT("");
	TreeView_Expand(hTree,TreeView_GetChild(hTree,TVI_ROOT),TVE_EXPAND);
	TreeView_SelectItem(hTree,TreeView_GetChild(hTree,TVI_ROOT));
	//	SendMessage(hTree,TVM_SELECTITEM,TVGN_CARET,NULL);
	//	TVE_COLLAPSE TVE_EXPAND 
	InvalidateRect(hStr, NULL, TRUE);
	return 0;
}

void AddNode( HWND hTree)
{	
	TV_INSERTSTRUCT		stTVIS;
	TCHAR				szBuffer[128] = {0};
	elemtype			MyTreeNode;
//	MySTRTree=new BSTTREE;
/*	szBuffer[0] = 'A';
	lstrcat( szBuffer, TEXT(":\\"));
	stTVIS.hInsertAfter = TVI_ROOT;
	stTVIS.item.mask	= TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
	stTVIS.item.pszText = szBuffer;

	stTVIS.item.iImage			= ID_ROOT;
	stTVIS.item.iSelectedImage	= ID_ROOT;
*/	stTVIS.hParent	=TVI_ROOT;////TreeView_InsertItem( hTree, &stTVIS);
    stTVIS.hInsertAfter = TVI_LAST;
	stTVIS.item.mask	= TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
	stTVIS.item.pszText = TEXT("玻璃心语");
	stTVIS.item.iImage			=ID_ROOT;// ID_CLOSEFOLD;
	stTVIS.item.iSelectedImage	=ID_ROOT;// ID_OPENFOLD;
	HTREEITEM hItem=TreeView_InsertItem( hTree, &stTVIS);
	MyTreeNode.key=(keytype)hItem;
	MyTreeNode.MyStr=TEXT("一颗破碎的玻璃心\n以禁不住任何的风浪了\n她需要一片宁静的天空疗伤\n让自己痊愈\n----玻璃心\n");
	MySTRTree->insert(MyTreeNode);
	HTREEITEM hItemtmp;
	stTVIS.hParent		= hItem;
	stTVIS.hInsertAfter = TVI_LAST;//TVI_ROOT;
	stTVIS.item.mask	= TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
	//stTVIS.item.pszText = TEXT("第一章");
	stTVIS.item.iImage			=ID_CLOSEFOLD;
	stTVIS.item.iSelectedImage	= ID_OPENFOLD;

	stTVIS.item.pszText = TEXT("一个人");
	hItemtmp=TreeView_InsertItem( hTree, &stTVIS);
	MyTreeNode.key=(keytype)hItemtmp;
	MyTreeNode.MyStr=TEXT("一个人\n一个人在追求什么?不是真实是幻想。\n一个人在害怕什么?不是寒冷是孤寂。\n一个人在逃避什么?不是别人是自己。\n一个人在征服什么?不是世界是心灵。\n");
	MySTRTree->insert(MyTreeNode);

	stTVIS.item.pszText = TEXT("想着");
	HTREEITEM hItem1=TreeView_InsertItem( hTree, &stTVIS);

   	MyTreeNode.key=(keytype)hItem1;
	MyTreeNode.MyStr=TEXT("想着\n\n想着\n做一片小小的叶\n到你怀里\n摇曳\n用端庄的手势\n在你眼里\n点一点\n疯狂\n夜已凉\n灯昏黄\n那么多的梦\n要给你\n也只敢在离你一尺的地方\n醒着\n偷偷张望\n");
	MySTRTree->insert(MyTreeNode);
	
/*	stTVIS.hParent		= hItem1;
	stTVIS.item.pszText = TEXT("第一节");
	hItemtmp=TreeView_InsertItem( hTree, &stTVIS);

	MyTreeNode.key=(keytype)hItemtmp;
	MyTreeNode.MyStr=TEXT("第一节");
	MySTRTree->insert(MyTreeNode);*/
    
    stTVIS.hParent		= hItem;
	stTVIS.item.pszText = TEXT("远行");
	hItemtmp=TreeView_InsertItem( hTree, &stTVIS);

	MyTreeNode.key=(keytype)hItemtmp;
	MyTreeNode.MyStr=TEXT("远行\n\n我们远行,是为了寻找归宿;\n我们找到归宿,是为了拥有一颗心;\n我们拥有一颗心,是为了心里那盏闪耀的灯——\n等待远行的那一天\n桃花红了 你的眼神醉了\n洒落的点点甜蜜 唤醒我思念之旅\n犹记得当初的约定 感觉着与你的每一个瞬间\n突然间我发现我原来如此眷恋\n抽去爱怜的丝 \n拧成重聚的线\n结成永远的承诺\n在宁愿被缠绕的每一个明天\n当风筝遇上风 即使快乐的痛 能能乘着狂风 \n天空中爱得英勇 有了他就算哭 仍然流露着笑容 \n当风筝没有风 一颗心也都很重 谁能来做微风 \n不必管我的轻重 冥冥中遇上他 擦过爱的天空\n");
	MySTRTree->insert(MyTreeNode);
}

HWND InitTreeView( HINSTANCE hInst, HWND hWndParent)
{	
	RECT		stClRect;
	UINT		cx,cy;
	HIMAGELIST	hFace;
	HWND		hTree;	


	GetClientRect( hWndParent, &stClRect);
	cx = stClRect.right - stClRect.left;
	cy = stClRect.bottom -stClRect.top;

	hTree = CreateWindowEx( WS_EX_CLIENTEDGE|WS_EX_ACCEPTFILES, TEXT("SysTreeView32"), NULL,    
				WS_CHILD | WS_VISIBLE | TVS_HASLINES  /*|TVS_LINESATROOT|TVS_HASBUTTONS|\
                TVS_LINESATROOT*/ ,0, 0, cx/3, cy, 
				hWndParent, (HMENU)IDD_TREE, hInst, NULL);

	TreeView_SetBkColor( hTree, RGB(0,0,0));
	TreeView_SetTextColor( hTree, RGB(255,255,255));

	hFace = ImageList_Create(GetSystemMetrics(SM_CXSMICON), 
					GetSystemMetrics(SM_CYSMICON),ILC_COLORDDB|ILC_MASK, 3, 0);
	ImageList_AddIcon( hFace, LoadIcon( hInst, MAKEINTRESOURCE(IDI_ROOT)));
	ImageList_AddIcon( hFace, LoadIcon( hInst, MAKEINTRESOURCE(IDI_OPENFOLD)));
	ImageList_AddIcon( hFace, LoadIcon( hInst, MAKEINTRESOURCE(IDI_CLOSEFOLD)));
	TreeView_SetImageList( hTree, hFace, TVSIL_NORMAL);
	
	MySTRTree=new BSTTREE;
//	MySTRTree->root = NULL;
//	AddNode(hTree);
	return (hTree);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -