📄 treeview.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 + -