Click here to Skip to main content
15,891,033 members
Articles / Programming Languages / C++

An Icon Explorer

Rate me:
Please Sign up or sign in to vote.
4.77/5 (7 votes)
22 Aug 2002 360K   2.3K   27  
An Icon Explorer which looks like Windows Resource Explorer
  • iconview.zip
    • IconView
      • bitmap1.bmp
      • bmp00001.bmp
      • bmp00002.bmp
      • bmp00003.bmp
      • bmp00004.bmp
      • bmp00005.bmp
      • bmp00006.bmp
      • bmp00007.bmp
      • bmp00008.bmp
      • bmp00010.bmp
      • Debug
      • icon3.ico
      • IconView.001
      • IconView.002
      • IconView.aps
      • IconView.cpp
      • IconView.dsp
      • IconView.dsw
      • IconView.h
      • IconView.ico
      • IconView.ncb
      • IconView.opt
      • IconView.plg
      • IconView.rc
      • IconViewCode.txt
      • IconViewR.H
      • Release
        • IconView.exe
//*******************************
//* IconView.H - YangTze - 1999 *
//*******************************

// WinMain
int WINAPI WinMain( HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow );
// ע�ᴰ����
BOOL InitApplication( HINSTANCE hInstance );
// ��������
BOOL InitInstance( HINSTANCE hInstance,int nCmdShow );
// �����ڻص�����
LRESULT CALLBACK MainWndProc( HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam );
// IconView�Ӵ��ڻص�����
LRESULT CALLBACK IconViewWndProc( HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam );
// ���ڶԻ���ص�����
BOOL CALLBACK AboutDlgProc( HWND hDlg,UINT message,UINT wParam,LONG lParam );
// ��ȡԴ����Ի���ص�����
BOOL CALLBACK PWDlgProc( HWND hDlg,UINT message,UINT wParam,LONG lParam );
// ͼ����Ϣ�Ի���ص�����
BOOL CALLBACK IconInfoDlgProc( HWND hDlg,UINT message,UINT wParam,LONG lParam );
// ����Դ����
BOOL MakeCode();
// ��ʼ��ͼ���б�
void InitImageList( void );
// ��ʼ��Ŀ¼��
void InitTree( void );
// ��ȡȫ��·��
void GetFullPath( HTREEITEM hTI,LPSTR str );
// ��ȡ�ڵ��ı�
void GetItemText( HTREEITEM hTI,LPSTR str );
// ��ȡ�ڵ�ͼ������
int GetItemImage( HTREEITEM hTI );
// ����ڵ�
HTREEITEM InsertItem( HTREEITEM hTI,LPSTR str,int imgOpen,int imgClose );
// ɾ�������ӽڵ�
void DeleteAllChild( HTREEITEM hTI );
// ��Ŀ¼
BOOL MakeSubItem( HTREEITEM hTI );
// ���ù�������Χ
void xSetScrollRange( HWND hWnd,int ScrollMax );
// �����ⴰ���л���ͼ��
void xDrawIcon();

//********************************
//* IconViewR.H - YangTze - 1999 *
//********************************

//{{NO_DEPENDENCIES}}
// Microsoft Developer Studio generated include file.
// Used by IconView.rc
//
#define IDI_ICON1                       101
#define IDI_ICON2                       102
#define IDC_COPY                        1000
#define IDC_HINT                        1005
#define IDC_FOOTBALL                    1006
#define IDC_COPYRIGHTS                  1007
#define IDC_FOOTBALLMSG                 1008
#define IDC_ICONVIEW                    1009
#define IDC_EDIT1                       1010
#define IDC_EDIT2                       1011
#define IDM_FILE_ABOUT                  40003
#define IDM_FILE_EXIT                   40004
#define IDM_FILE_LARGEICON              40005
#define IDM_FILE_SMALLICON              40006
#define IDM_FILE_GETCODE                40009

// Next default values for new objects
// 
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        142
#define _APS_NEXT_COMMAND_VALUE         40010
#define _APS_NEXT_CONTROL_VALUE         1012
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif

//********************************
//* IconView.RC - YangTze - 1999 *
//********************************

//Microsoft Developer Studio generated resource script.
//
#include "IconViewR.H"

#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"

/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS

/////////////////////////////////////////////////////////////////////////////
// Chinese (P.R.C.) resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
#ifdef _WIN32
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
#pragma code_page(936)
#endif //_WIN32

#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//

1 TEXTINCLUDE DISCARDABLE 
BEGIN
    "IconViewR.H\0"
END

2 TEXTINCLUDE DISCARDABLE 
BEGIN
    "#include ""afxres.h""\r\n"
    "\0"
END

3 TEXTINCLUDE DISCARDABLE 
BEGIN
    "\r\n"
    "\0"
END

#endif    // APSTUDIO_INVOKED


/////////////////////////////////////////////////////////////////////////////
//
// Icon
//

// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
ICONVIEW                ICON    DISCARDABLE     "IconView.ico"
SFOOTBALL               ICON    DISCARDABLE     "icon3.ico"

/////////////////////////////////////////////////////////////////////////////
//
// Menu
//

ICONVIEWMENU MENU DISCARDABLE 
BEGIN
    POPUP "(&F) �ļ�"
    BEGIN
        MENUITEM "(&L) ��ͼ��( 32x32 )",        IDM_FILE_LARGEICON, CHECKED
        MENUITEM "(&S) Сͼ��( 16x16 )",        IDM_FILE_SMALLICON
        MENUITEM SEPARATOR
        MENUITEM "(&G) ���� IconView Դ���뵽������...", IDM_FILE_GETCODE
        MENUITEM SEPARATOR
        MENUITEM "(&A) ���� IconView...",       IDM_FILE_ABOUT
        MENUITEM SEPARATOR
        MENUITEM "(&E) �˳�",                   IDM_FILE_EXIT
    END
END


/////////////////////////////////////////////////////////////////////////////
//
// Bitmap
//

CDROM                   BITMAP  DISCARDABLE     "bitmap1.bmp"
FILE                    BITMAP  DISCARDABLE     "bmp00001.bmp"
FLOPYDRIVE              BITMAP  DISCARDABLE     "bmp00002.bmp"
FOLD                    BITMAP  DISCARDABLE     "bmp00003.bmp"
HARDDRIVE               BITMAP  DISCARDABLE     "bmp00004.bmp"
NETDRIVE                BITMAP  DISCARDABLE     "bmp00005.bmp"
PC                      BITMAP  DISCARDABLE     "bmp00006.bmp"
OPENFOLD                BITMAP  DISCARDABLE     "bmp00007.bmp"
NOFOLD                  BITMAP  DISCARDABLE     "bmp00008.bmp"
MASK                    BITMAP  DISCARDABLE     "bmp00010.bmp"

/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//

ABOUTDLG DIALOGEX 0, 0, 183, 146
STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION
EXSTYLE WS_EX_CLIENTEDGE
CAPTION "* ���� IconView"
FONT 9, "����"
BEGIN
    DEFPUSHBUTTON   "ȷ��(&O)",IDOK,73,121,54,18
    ICON            "ICONVIEW",IDC_ICONVIEW,7,7,20,20
    CTEXT           "IconView( MaxIcon = 4096 ) 1.0\n(C)1999 YangTze presents",
                    IDC_COPYRIGHTS,34,7,142,24,SS_SUNKEN,WS_EX_DLGMODALFRAME | 
                    WS_EX_CLIENTEDGE
    CTEXT           "�����ѡ���ͼ�����ʾһ���Ի���",IDC_HINT,35,103,141,
                    10,SS_SUNKEN
    RTEXT           "����...Ϊ����ע������ \n������...Ϊ����ע�������� \n��������...Ϊ����ע���˼��� \n�������...Ϊ����ע���˹¶� \n���ö�...Ϊ����ע������� \n����...Ϊ����ע�������� \n�й�����...Ϊ����ע���˱��� ",
                    IDC_FOOTBALLMSG,35,38,141,60,0,WS_EX_STATICEDGE
    ICON            "SFOOTBALL",IDC_FOOTBALL,7,58,20,20,SS_REALSIZEIMAGE
END

ICONINFODLG DIALOGEX 0, 0, 145, 53
STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION
EXSTYLE WS_EX_CLIENTEDGE
CAPTION "* ͼ�괦��"
FONT 9, "����"
BEGIN
    DEFPUSHBUTTON   "����(&R)",IDOK,64,28,74,18
    PUSHBUTTON      "���Ƶ�������(&C)",IDC_COPY,64,7,74,18
END

PASSWORD DIALOGEX 0, 0, 187, 78
STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION
EXSTYLE WS_EX_CLIENTEDGE
CAPTION "* ��������ʫ�������ܻ�� IconView Դ����"
FONT 9, "����"
BEGIN
    DEFPUSHBUTTON   "ȷ��(&O)",IDOK,67,55,50,16
    LTEXT           "��",IDC_STATIC,30,18,10,9
    LTEXT           "��",IDC_STATIC,30,37,10,9,NOT WS_GROUP
    EDITTEXT        IDC_EDIT1,44,15,116,12,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT2,43,35,116,12,ES_AUTOHSCROLL
END


/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//

#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO DISCARDABLE 
BEGIN
    "ABOUTDLG", DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 176
        TOPMARGIN, 7
        BOTTOMMARGIN, 139
    END

    "ICONINFODLG", DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 138
        TOPMARGIN, 7
        BOTTOMMARGIN, 46
    END

    "PASSWORD", DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 180
        TOPMARGIN, 7
        BOTTOMMARGIN, 71
    END
END
#endif    // APSTUDIO_INVOKED


/////////////////////////////////////////////////////////////////////////////
//
// CODE
//

MYCODE                  CODE    DISCARDABLE     "IconViewCode.txt"
#endif    // Chinese (P.R.C.) resources
/////////////////////////////////////////////////////////////////////////////



#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//


/////////////////////////////////////////////////////////////////////////////
#endif    // not APSTUDIO_INVOKED

//*********************************
//* IconView.CPP - YangTze - 1999 *
//*********************************

#include <windows.h>
#include <commctrl.h>
#include <direct.h>

#include "IconView.h"
#include "IconViewR.h"

// �Զ�����Ϣ
#define MYMSG WM_USER + 100
// ���ͼ����Ŀ
#define MaxICON 4096
// ͼ���ڷ�������ʾƫ����
#define OffSet 4
// ������/Ŀ¼����Ϣ��ʾ
char Msg[] = "����Ϣ - YangTze'99";

// ʵ�����
HINSTANCE hInst;

HWND hMainWnd;
RECT WinDim;
RECT rc;
BOOL IsSize;
BOOL IsCapture;
HCURSOR hSize;
HCURSOR hArrow;
HCURSOR hWait;

HRSRC hTemp;
DWORD CodeSize;
HGLOBAL hCode;
char *pMyCodeRes;
HGLOBAL hMyCode;
char *pMyCode;

// ��������
HWND hListBoxWnd;

HWND hTreeWnd;
HTREEITEM hCurTree;
HTREEITEM hTempTree;
HIMAGELIST ImageList;
char FullPath[ 255 ];
int imgPC,imgNetDrive,imgHardDrive,imgFlopyDrive;
int imgCDROM,imgFold,imgOpenFold,imgFile,imgNoFold;

HWND hIVWnd;
int xNum,yNum;
int IconNum;
int StartDisp;
int ScrollMax;
int IconSize = 32 + 8;
char CurFile[ 255 ];
BOOL LSIcon = TRUE;
HICON hLIcon[ MaxICON ];
HICON hSIcon[ MaxICON ];
POINT oldpt;
HBITMAP hMask = NULL;
HBITMAP hVBmp = NULL;
HDC hVDC = NULL;
int SelIconID;

HBITMAP hClipBmp;
HDC hVDlgDC;
HBITMAP hVDlgBmp;

int ScreenX;
int ScreenY;

//| WinMain
//|___________________________________________________________________________________________
int WINAPI WinMain( HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow )
{
	MSG msg;

	if( !InitApplication( hInstance ) ) return FALSE;
	if( !InitInstance( hInstance,nCmdShow ) ) return FALSE;

	while( GetMessage( &msg,NULL,0,0 ) ) {
		TranslateMessage( &msg );
		DispatchMessage( &msg );
	}
	return msg.wParam;
}

//| ע�ᴰ����
//|________________________________________
BOOL InitApplication( HINSTANCE hInstance )
{
	WNDCLASS wc;

	hInst = hInstance;

	// ע����������
	wc.style = 0;
	wc.lpfnWndProc = ( WNDPROC )MainWndProc;
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hInstance = hInstance;
	wc.hIcon = LoadIcon( hInstance,"IconView" );
	wc.hCursor = LoadCursor( NULL,IDC_ARROW );
	wc.hbrBackground = GetStockObject( LTGRAY_BRUSH );
	wc.lpszMenuName = "IconViewMenu";
	wc.lpszClassName = "IconViewClass";
	if( !RegisterClass( &wc ) ) return FALSE;
	
	// ע���Ӵ�����
	wc.style = 0;
	wc.lpfnWndProc = ( WNDPROC )IconViewWndProc;
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hInstance = hInstance;
	wc.hIcon = NULL;
	wc.hCursor = LoadCursor( NULL,IDC_ARROW );
	wc.hbrBackground = GetStockObject( WHITE_BRUSH );
	wc.lpszMenuName = NULL;
	wc.lpszClassName = "IVClass";
	if( !RegisterClass( &wc ) ) return FALSE;
	else return TRUE;
}

//| ��������
//|__________________________________________________
BOOL InitInstance( HINSTANCE hInstance,int nCmdShow )
{
	// ����������
	hMainWnd = CreateWindowEx(
		WS_EX_CLIENTEDGE,
		"IconViewClass",
		"IconView",
		WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		NULL,
		NULL,
		hInstance,
		NULL
	);
	if( !hMainWnd ) return FALSE;

	hListBoxWnd = CreateWindow(
			"LISTBOX",
			NULL,
			WS_BORDER | WS_CHILD | LBS_HASSTRINGS | LBS_SORT,
			0,0,0,0,
			hMainWnd,
			NULL,
			hInstance,
			NULL
	);
	if( !hListBoxWnd ) return FALSE;

	// ����Ŀ¼���Ӵ���
	InitCommonControls();
	hTreeWnd = CreateWindowEx(
			WS_EX_CLIENTEDGE | WS_EX_DLGMODALFRAME,
			WC_TREEVIEW,
			"",
			WS_BORDER | WS_VISIBLE | WS_TABSTOP | WS_CHILD | TVS_HASLINES | TVS_HASBUTTONS | TVS_LINESATROOT,// | WS_EX_CLIENTEDGE, // ���: TreeCtrl �»���
			0,
			0,
			0,
			0,
			hMainWnd,
			NULL,
			hInst,
			NULL
	);
	if( !hTreeWnd ) {
		return FALSE;
	}
	else {
		InitImageList();
		InitTree();
	}

	// ����ͼ����ʾ�Ӵ���
	hIVWnd = CreateWindowEx(
			WS_EX_CLIENTEDGE | WS_EX_DLGMODALFRAME,
			"IVClass",
			"",
			WS_VSCROLL | WS_BORDER | WS_VISIBLE | WS_CHILD,
			0,
			0,
			0,
			0,
			hMainWnd,
			NULL,
			hInst,
			NULL
	);
	if( !hIVWnd ) return FALSE;

	ShowWindow( hMainWnd,nCmdShow );
	UpdateWindow( hMainWnd );

	return TRUE;
}

//| �����ڻص�����
//|____________________________________________________________________________
LRESULT CALLBACK MainWndProc( HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam )
{
	int img;
	POINT pt;
	HMENU hMainMenu;
	HMENU hSubMenu;
	NM_TREEVIEW *nmptr;
	int ret;

	switch( uMsg ) {
		case WM_CREATE:
			hWait = LoadCursor( NULL,IDC_WAIT );
			hSize = LoadCursor( NULL,IDC_SIZEWE );
			hArrow = LoadCursor( NULL,IDC_ARROW );
			hTemp = FindResourceEx( ( HMODULE )hInst,"CODE","MYCODE",MAKELANGID( LANG_NEUTRAL,SUBLANG_NEUTRAL ) );
			if( hTemp ) {
				hCode = LoadResource( ( HMODULE )hInst,hTemp );
				if( hCode ) {
					CodeSize = SizeofResource( ( HMODULE )hInst,hTemp );
					pMyCodeRes = ( char * )LockResource( hCode );
				}
			}
			break;
		case WM_SIZE:
			GetClientRect( hWnd,&WinDim );
			rc.left = WinDim.right / 3;
			rc.right = WinDim.right / 3 + 1;
			rc.top = WinDim.top;
			rc.bottom = WinDim.bottom;
			MoveWindow( hTreeWnd,0,0,WinDim.right / 3,WinDim.bottom,TRUE );
			ShowWindow( hTreeWnd,SW_SHOW );
			MoveWindow( hIVWnd,WinDim.right / 3 + 1,0,WinDim.right - WinDim.right / 3 - 1,WinDim.bottom,TRUE );
			ShowWindow( hIVWnd,SW_SHOW );
			break;
		case WM_NOTIFY:
			nmptr = ( NM_TREEVIEW * )( LPARAM )lParam;
			// ѡ��
			if( nmptr -> hdr.code == TVN_SELCHANGED ) {
				hCurTree = nmptr -> itemNew.hItem;
				img = GetItemImage( hCurTree );
				GetFullPath( hCurTree,FullPath );
				if( img == imgFile ) SendMessage( hIVWnd,MYMSG,0,0 );
			}
			// ����չ/�պ�
			if( nmptr -> hdr.code == TVN_ITEMEXPANDED ) {
				hCurTree = nmptr -> itemNew.hItem;
				img = GetItemImage( hCurTree );
				GetFullPath( hCurTree,FullPath );
				if( nmptr -> action == TVE_COLLAPSE ) {
					// �ڵ�պϴ���
					if( img != imgPC ) {
						DeleteAllChild( hCurTree );
						InsertItem( hCurTree,Msg,imgNoFold,imgNoFold );
					}
				}
				else if( nmptr -> action == TVE_EXPAND ) {
					// �ڵ�򿪴���
					if( img != imgPC ) {
						DeleteAllChild( hCurTree );
						if( !MakeSubItem( hCurTree ) ) {
							InsertItem( hCurTree,Msg,imgNoFold,imgNoFold );
						}
					}
				}
			}
			break;
		case WM_COMMAND:
			switch( LOWORD( wParam ) ) {
				case IDM_FILE_LARGEICON:
					LSIcon = TRUE;
					IconSize = 32 + 8;
					hMainMenu = GetMenu( hWnd );
					hSubMenu = GetSubMenu( hMainMenu,0 );
					CheckMenuItem( hSubMenu,IDM_FILE_LARGEICON,MF_BYCOMMAND | MF_CHECKED );
					CheckMenuItem( hSubMenu,IDM_FILE_SMALLICON,MF_BYCOMMAND | MF_UNCHECKED );
					SendMessage( hIVWnd,WM_SIZE,0,0 );
					break;
				case IDM_FILE_SMALLICON:
					LSIcon = FALSE;
					IconSize = 16 + 8;
					hMainMenu = GetMenu( hWnd );
					hSubMenu = GetSubMenu( hMainMenu,0 );
					CheckMenuItem( hSubMenu,IDM_FILE_LARGEICON,MF_BYCOMMAND | MF_UNCHECKED );
					CheckMenuItem( hSubMenu,IDM_FILE_SMALLICON,MF_BYCOMMAND | MF_CHECKED );
					SendMessage( hIVWnd,WM_SIZE,0,0 );
					break;
				case IDM_FILE_GETCODE:
					ret = DialogBox( hInst,"PASSWORD",hWnd,( DLGPROC )PWDlgProc );
					if( ret == 0 ) {
						MessageBox( hWnd,"�Բ���,������!","��ʾ",MB_ICONINFORMATION | MB_OK );
						break;
					}
					if( !MakeCode() ) {
						MessageBox( hWnd,"����Դ����ʱ��������!","��ʾ",MB_ICONINFORMATION | MB_OK );
						break;
					}
					if( OpenClipboard( hWnd ) ) {
						EmptyClipboard();
						SetClipboardData( CF_TEXT,( HANDLE )hMyCode );
						CloseClipboard();
					}
					else {
						MessageBox( hWnd,"���ܴ򿪼�����!","����",MB_ICONINFORMATION | MB_OK );
					}
					break;
				case IDM_FILE_ABOUT:
					DialogBox( hInst,"ABOUTDLG",hWnd,( DLGPROC )AboutDlgProc );
					break;
				case IDM_FILE_EXIT:
					PostQuitMessage( 0 );
					break;
			}
			break;
		case WM_MOUSEMOVE:
			pt.x = LOWORD( lParam );
			pt.y = HIWORD( lParam );
			if( IsCapture ) {
				MoveWindow( hTreeWnd,0,0,pt.x,WinDim.bottom,TRUE );
				ShowWindow( hTreeWnd,SW_SHOW );
				MoveWindow( hIVWnd,pt.x + 1,0,WinDim.right - pt.x - 1,WinDim.bottom,TRUE );
				ShowWindow( hIVWnd,SW_SHOW );
				rc.left = pt.x;
				rc.right = pt.x + 1;
				rc.top = WinDim.top;
				rc.bottom = WinDim.bottom;
			}
			if( PtInRect( &rc,pt ) ) {
				SetCursor( hSize );
				IsSize = TRUE;
			}
			else {
				SetCursor( hArrow );
				IsSize = FALSE;
			}
			break;
		case WM_LBUTTONDOWN:
			if( IsSize ) {
				IsCapture = TRUE;
				SetCapture( hWnd );
			}
			break;
		case WM_LBUTTONUP:
			if( IsSize ) {
				IsCapture = FALSE;
				ReleaseCapture();
				SetCursor( hArrow );
				InvalidateRect( hIVWnd,NULL,TRUE );
			}
			break;
		case WM_DESTROY:
			if( hVDC ) DeleteDC( hVDC );
			if( hVBmp ) DeleteObject( hVBmp );
			PostQuitMessage( 0 );
			break;
		default:
			return DefWindowProc( hWnd,uMsg,wParam,lParam );
	}
	return 0;
}

//| ����Դ����
//|____________
BOOL MakeCode()
{
	DWORD i;

	if( !pMyCodeRes ) return FALSE;
	hMyCode = GlobalAlloc( GMEM_DDESHARE | GMEM_MOVEABLE,CodeSize + 1 );
	if( !hMyCode ) return FALSE;
	pMyCode = ( char * )GlobalLock( hMyCode );
	if( !pMyCode ) {
		GlobalFree( hMyCode );
		return FALSE;
	}
	for( i = 0;i < CodeSize;i ++ ) *( pMyCode + i ) = *( pMyCodeRes + i );
	GlobalUnlock( hMyCode );
	return TRUE;
}

//| ��ʼ��ͼ���б�
//|_______________________
void InitImageList( void )
{
	HBITMAP bmp;

	ImageList = ImageList_Create( 16,16,ILC_COLOR,9,0 );

	bmp = LoadBitmap( hInst,"NoFold" );
	imgNoFold = ImageList_Add( ImageList,bmp,NULL );

	bmp = LoadBitmap( hInst,"PC" );
	imgPC = ImageList_Add( ImageList,bmp,NULL );

	bmp = LoadBitmap( hInst,"FLOPYDRIVE" );
	imgFlopyDrive = ImageList_Add( ImageList,bmp,NULL );

	bmp = LoadBitmap( hInst,"HARDDRIVE" );
	imgHardDrive = ImageList_Add( ImageList,bmp,NULL );

	bmp = LoadBitmap( hInst,"CDROM" );
	imgCDROM = ImageList_Add( ImageList,bmp,NULL );

	bmp = LoadBitmap( hInst,"NETDRIVE" );
	imgNetDrive = ImageList_Add( ImageList,bmp,NULL );

	bmp = LoadBitmap( hInst,"FOLD" );
	imgFold = ImageList_Add( ImageList,bmp,NULL );

	bmp = LoadBitmap( hInst,"OPENFOLD" );
	imgOpenFold = ImageList_Add( ImageList,bmp,NULL );

	bmp = LoadBitmap( hInst,"FILE" );
	imgFile = ImageList_Add( ImageList,bmp,NULL );

	DeleteObject( bmp );
	TreeView_SetImageList( hTreeWnd,ImageList,TVSIL_NORMAL );
}

//| ��ʼ��Ŀ¼���б�
//|__________________
void InitTree( void )
{
	int drive;
	UINT dt;
	char dritem[ 4 ] = { 0,':','\\',0 };
	int img;

	hCurTree = InsertItem( TVI_ROOT,"PC:",imgPC,imgPC );
	for( drive = 1; drive <= 26; drive ++ ) {
		dritem[ 0 ] = drive + 'A' - 1;
		dt = GetDriveType( dritem );
		switch( dt ) {
			case DRIVE_REMOVABLE:
				img = imgFlopyDrive;
				break;
			case DRIVE_FIXED:
				img = imgHardDrive;
				break;
			case DRIVE_REMOTE:
				img = imgNetDrive;
				break;
			case DRIVE_CDROM:
				img = imgCDROM;
				break;
		}
		if( dt == DRIVE_UNKNOWN || dt == DRIVE_NO_ROOT_DIR ) continue;
		dritem[ 2 ] = '\0';
		hTempTree = InsertItem( hCurTree,dritem,img,img );
		dritem[ 2 ] = '\\';
		// Fold
		hTempTree = InsertItem( hTempTree,Msg,imgNoFold,imgNoFold );
	}
}

//| ��ȡ�ڵ��ı�
//|________________________________________
void GetItemText( HTREEITEM hTI,LPSTR str )
{
	TV_ITEM tvi;

	tvi.hItem = hTI;
	tvi.mask = TVIF_TEXT | TVIF_HANDLE | TVIF_IMAGE;
	tvi.pszText = str;
	tvi.cchTextMax = 255;
	TreeView_GetItem( hTreeWnd,&tvi );
}

//| ��ȡ�ڵ�ͼ������
//|______________________________
int GetItemImage( HTREEITEM hTI )
{
	TV_ITEM tvi;

	tvi.hItem = hTI;
	tvi.mask = TVIF_HANDLE | TVIF_IMAGE;
	TreeView_GetItem( hTreeWnd,&tvi );
	return tvi.iImage;
}

//| ɾ�������ӽڵ�
//|_________________________________
void DeleteAllChild( HTREEITEM hTI )
{
	HTREEITEM hTemp;

	for( ;; ) {
		hTemp = TreeView_GetChild( hTreeWnd,hTI );
		if( hTemp == NULL ) break;
		TreeView_DeleteItem( hTreeWnd,hTemp );
	}
}

//| ������Ŀ
//|_____________________________________________________________________
HTREEITEM InsertItem( HTREEITEM hTI,LPSTR str,int imgOpen,int imgClose )
{
	TV_INSERTSTRUCT tvs;
	TV_ITEM tvi;

	tvs.hInsertAfter = TVI_LAST;
	tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
	tvi.pszText = str;
	tvi.iImage = imgClose;
	tvi.iSelectedImage = imgOpen;
	tvs.hParent = hTI;
	tvs.item = tvi;
	return TreeView_InsertItem( hTreeWnd,&tvs );
}

//| ��ȡȫ��·��
//|________________________________________
void GetFullPath( HTREEITEM hTI,LPSTR str )
{
	HTREEITEM pht;
	char itemtext[ 255 ];
	char buf[ 4096 ];

	GetItemText( hTI,itemtext );
	lstrcpy( str,itemtext );
	pht = hTI;
	while( pht = TreeView_GetParent( hTreeWnd,pht ) ) {
		GetItemText( pht,itemtext );
		lstrcpy( buf,itemtext );
		lstrcat( buf,"\\" );
		lstrcat( buf,str );
		lstrcpy( str,buf );
	}
	lstrcat( str,"\\" );
}

//| ��Ŀ¼
//|______________________________
BOOL MakeSubItem( HTREEITEM hTI )
{
	char filename[ 255 ];
	char str[ 255 ];
	WIN32_FIND_DATA wfd;
	HANDLE hSearch;
	HTREEITEM hTemp;
	int Num;
	int i,j;

	Num = 0;
	// �л�����ѡ���Ŀ¼
	if( !SetCurrentDirectory( &FullPath[ 4 ] ) ) return FALSE;
	// ��������Ŀ¼���ļ�
	if( ( hSearch = FindFirstFile( "*.*",&wfd ) ) == INVALID_HANDLE_VALUE ) return FALSE;
	while( TRUE ) {
		lstrcpy( filename,wfd.cFileName );
		if( lstrcmp( filename,"." ) && lstrcmp( filename,".." ) ) {
			if( wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) {
				wsprintf( str,"D:%s",filename );
				SendMessage( hListBoxWnd,LB_ADDSTRING,0,( LPARAM )( LPCTSTR )str );
				Num ++;
			}
			else {
				wsprintf( str,"F:%s",filename );
				SendMessage( hListBoxWnd,LB_ADDSTRING,0,( LPARAM )( LPCTSTR )str );
				Num ++;
			}
		}
		if( !FindNextFile( hSearch,&wfd ) ) break;
	}
	FindClose( hSearch );

	j = SendMessage( hListBoxWnd,LB_GETCOUNT,0,0 );
	for( i = 0;i < j;i ++ ) {
		SendMessage( hListBoxWnd,LB_GETTEXT,i,( LPARAM )( LPCTSTR )str );
		if( str[ 0 ] == 'D' ) {
			hTemp = InsertItem( hTI,&str[ 2 ],imgOpenFold,imgFold );
			InsertItem( hTemp,Msg,imgNoFold,imgNoFold );
		}
		else if( str[ 0 ] == 'F' ) {
			hTemp = InsertItem( hTI,&str[ 2 ],imgFile,imgFile );
		}
	}
	for( i = 0;i < j; i ++ ) {
		SendMessage( hListBoxWnd,LB_DELETESTRING,0,0 );
	}

	if( Num ) return TRUE;
	else return FALSE;
}

//| ���ڶԻ���ص�����
//|_________________________________________________________________________
BOOL CALLBACK AboutDlgProc( HWND hDlg,UINT message,UINT wParam,LONG lParam )
{
	switch( message ) {
		case WM_INITDIALOG:
			return TRUE;
		case WM_COMMAND:
			switch( LOWORD( wParam ) ) {
				case IDOK:
					EndDialog( hDlg,TRUE );
					break;
				default:
					return FALSE;
			}
	}
	return FALSE;
}

//| ��ȡԴ����Ի���ص�����
//|______________________________________________________________________
BOOL CALLBACK PWDlgProc( HWND hDlg,UINT message,UINT wParam,LONG lParam )
{
	char str1[ 20 ];
	char str2[ 20 ];
	int i;

	switch( message ) {
		case WM_INITDIALOG:
			return TRUE;
		case WM_COMMAND:
			switch( LOWORD( wParam ) ) {
				case IDOK:
					for( i = 0; i < 20; i ++ ) {
						str1[ i ] = '\0';
						str2[ i ] = '\0';
					}
					GetDlgItemText( hDlg,IDC_EDIT1,str1,10 );
					GetDlgItemText( hDlg,IDC_EDIT2,str2,10 );
					if( lstrcmp( str1,"��������" ) == 0 && lstrcmp( str2,"������ѩ" ) == 0 )
						EndDialog( hDlg,1 );
					else
						EndDialog( hDlg,0 );
					break;
				default:
					return FALSE;
			}
	}
	return FALSE;
}

//| IconView ���ڻص�����
//|________________________________________________________________________________
LRESULT CALLBACK IconViewWndProc( HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam )
{
	PAINTSTRUCT ps;
	HDC hDC;
	HDC hMemDC;
	RECT rcIV;
	POINT pt;
	char Msg[ 255 ];
	HICON hTest;

	switch( uMsg ) {
		case WM_CREATE:
			hMask = LoadBitmap( hInst,"Mask" );
			ScreenX = GetSystemMetrics( SM_CXSCREEN );
			ScreenY = GetSystemMetrics( SM_CYSCREEN );
			hDC = GetDC( hWnd );
			hVDC = CreateCompatibleDC( hDC );
			hVBmp = CreateCompatibleBitmap( hDC,ScreenX,ScreenY );
			SelectObject( hVDC,hVBmp );
			ReleaseDC( hWnd,hDC );
			oldpt.x = 1234567890;
			oldpt.y = 1234567890;
			break;
		case WM_SIZE:
			GetClientRect( hWnd,&rcIV );
			xNum = rcIV.right / IconSize;
			yNum = rcIV.bottom / IconSize;
			if( xNum > 0 && yNum > 0 ) {
				StartDisp = 0;
				ScrollMax = 0;
				if( IconNum > xNum * yNum ) {
					ScrollMax = ( IconNum - xNum * yNum ) / xNum + 1;
				}
			}
			xSetScrollRange( hWnd,ScrollMax );
			xDrawIcon();
			InvalidateRect( hWnd,NULL,TRUE );
			break;
		case WM_VSCROLL:
			switch( LOWORD(wParam) ) {
				case SB_LINEDOWN:
				case SB_PAGEDOWN:
					if( StartDisp < ScrollMax ) {
						StartDisp ++;
						SetScrollPos( hWnd,SB_VERT,StartDisp,TRUE );
						xDrawIcon();
						InvalidateRect( hWnd,NULL,TRUE );
					}
					break;
				case SB_LINEUP:
				case SB_PAGEUP:
					if( StartDisp > 0 ) {
						StartDisp --;
						SetScrollPos( hWnd,SB_VERT,StartDisp,TRUE );
						xDrawIcon();
						InvalidateRect( hWnd,NULL,TRUE );
					}
					break;
				case SB_THUMBPOSITION:
					StartDisp = HIWORD( wParam );;
					SetScrollPos( hWnd,SB_VERT,StartDisp,TRUE );
					xDrawIcon();
					InvalidateRect( hWnd,NULL,TRUE );
					break;
			}
			break;
		case MYMSG:
			SetCursor( hWait );
			lstrcpy( CurFile,&FullPath[ 4 ] );
			CurFile[ lstrlen( CurFile ) - 1 ] = '\0';
			hTest = ( HICON )ExtractIconEx( CurFile,0,&hLIcon[ 0 ],&hSIcon[ 0 ],1 );
			if( hTest == NULL || hTest == ( HICON )1 ) {
				IconNum = 0;
			}
			else {
				IconNum = ( int )ExtractIconEx( CurFile,-1,NULL,NULL,0 );
				if( IconNum > MaxICON ) IconNum = MaxICON;
				if( IconNum > 0 ) {
					for( int i = 0;i < IconNum;i ++ )
						ExtractIconEx( CurFile,i,&hLIcon[ i ],&hSIcon[ i ],1 );
				}
			}
			wsprintf( Msg,"IconView - �ļ� %s �� %d ��ͼ��",CurFile,IconNum );
			SetWindowText( hMainWnd,Msg );
			StartDisp = 0;
			ScrollMax = 0;
			if( IconNum > xNum * yNum ) {
				ScrollMax = ( IconNum - xNum * yNum ) / xNum + 1;
			}
			xSetScrollRange( hWnd,ScrollMax );
			xDrawIcon();
			InvalidateRect( hWnd,NULL,TRUE );
			SetCursor( hArrow );
			break;
		case WM_PAINT:
			if( IsCapture ) break;
			hDC = BeginPaint( hWnd,&ps );
			BitBlt(
				hDC,ps.rcPaint.left,ps.rcPaint.top,ps.rcPaint.right,ps.rcPaint.bottom,
				hVDC,ps.rcPaint.left,ps.rcPaint.top,
				SRCCOPY
			);
			EndPaint( hWnd,&ps );
			break;
		case WM_MOUSEMOVE:
			if( IconNum == 0 ) break;
			pt.x = LOWORD( lParam ) / IconSize;
			pt.y = HIWORD( lParam ) / IconSize;
			if( pt.x >= xNum || pt.y >= yNum ) break;
			SelIconID = pt.y * xNum + pt.x + StartDisp * xNum;
			if( SelIconID >= IconNum ) break;
			if( pt.x != oldpt.x || pt.y != oldpt.y ) {
				hDC = GetDC( hWnd );
				hMemDC = CreateCompatibleDC( hDC );
				SelectObject( hMemDC,hMask );
				// ���ⴰ��
				BitBlt( hVDC,oldpt.x * IconSize + 1,oldpt.y * IconSize + 1,IconSize - 1,IconSize - 1,hMemDC,0,0,SRCINVERT );
				BitBlt( hVDC,pt.x * IconSize + 1,pt.y * IconSize + 1,IconSize - 1,IconSize - 1,hMemDC,0,0,SRCINVERT );
				// ��ʾ����
				BitBlt( hDC,oldpt.x * IconSize + 1,oldpt.y * IconSize + 1,IconSize - 1,IconSize - 1,hMemDC,0,0,SRCINVERT );
				BitBlt( hDC,pt.x * IconSize + 1,pt.y * IconSize + 1,IconSize - 1,IconSize - 1,hMemDC,0,0,SRCINVERT );
				DeleteDC( hMemDC );
				ReleaseDC( hWnd,hDC );
				oldpt.x = pt.x;
				oldpt.y = pt.y;
			}
			break;
		case WM_LBUTTONDOWN:
			if( SelIconID < IconNum ) {
				DialogBox( hInst,"ICONINFODLG",hWnd,( DLGPROC )IconInfoDlgProc );
			}
			break;
		default:
			return DefWindowProc( hWnd,uMsg,wParam,lParam );
	}
	return 0;
}

//| ���ù�������Χ
//|____________________________________________
void xSetScrollRange( HWND hWnd,int ScrollMax )
{
	SCROLLINFO si;

	si.cbSize = sizeof( SCROLLINFO );
	si.fMask = SIF_RANGE | SIF_POS | SIF_PAGE;
	si.nMin = 0;
	si.nMax = ScrollMax;
	si.nPage = 1;
	si.nPos = 0;
	si.nTrackPos = 0;
	SetScrollInfo( hWnd,SB_VERT,&si,TRUE );
	SetScrollPos( hWnd,SB_VERT,0,TRUE );
}

//| �����ⴰ���л���ͼ��
//|_____________________
void xDrawIcon()
{
	int i,j,k;
	HICON hIcon;

	oldpt.x = 1234567890;
	oldpt.y = 1234567890;
	SelectObject( hVDC,GetStockObject( GRAY_BRUSH ) );
	PatBlt( hVDC,0,0,ScreenX,ScreenY,PATCOPY );
	SelectObject( hVDC,GetStockObject( WHITE_BRUSH ) );
	PatBlt( hVDC,0,0,xNum * IconSize,yNum * IconSize,PATCOPY );
	for( i = 0;i <= xNum;i ++ ) {
		MoveToEx( hVDC,i * IconSize,0,NULL );
		LineTo( hVDC,i * IconSize,IconSize * yNum );
	}
	for( i = 0;i <= yNum;i ++ ) {
		MoveToEx( hVDC,0,i * IconSize,NULL );
		LineTo( hVDC,IconSize * xNum,i * IconSize );
	}
	if( IconNum > 0 ) {
		k = StartDisp * xNum;
		for( i = 0;i < yNum;i ++ ) {
			for( j = 0;j < xNum;j ++ ) {
				if( LSIcon ) hIcon = hLIcon[ k ++ ];
				else hIcon = hSIcon[ k ++ ];
				DrawIconEx( hVDC,j * IconSize + OffSet,i * IconSize + OffSet,hIcon,0,0,0,NULL,DI_NORMAL );
				if( k == IconNum ) break;
			}
			if( k == IconNum ) break;
		}
	}
}

//| ͼ����Ϣ�Ի���ص�����
//|____________________________________________________________________________
BOOL CALLBACK IconInfoDlgProc( HWND hDlg,UINT message,UINT wParam,LONG lParam )
{
	HDC hDC;
	PAINTSTRUCT ps;
	HICON hIcon;
	RECT rc;
	int y;
	char str[ 50 ];

	switch( message ) {
		case WM_INITDIALOG:
			hDC = GetDC( hDlg );
			hVDlgDC = CreateCompatibleDC( hDC );
			hVDlgBmp = CreateCompatibleBitmap( hDC,IconSize - 8,IconSize - 8 );
			SelectObject( hVDlgDC,hVDlgBmp );
			SelectObject( hVDlgDC,GetStockObject( WHITE_BRUSH ) );
			PatBlt( hVDlgDC,0,0,IconSize - 8,IconSize - 8,PATCOPY );
			ReleaseDC( hDlg,hDC );
			return TRUE;
		case WM_PAINT:
			wsprintf( str,"* �� %d ��ͼ��",SelIconID + 1 );
			SetWindowText( hDlg,str );
			GetClientRect( hDlg,&rc );
			hDC = BeginPaint( hDlg,&ps );
			y = ( rc.bottom - IconSize - 8 ) / 2;
			if( LSIcon ) hIcon = hLIcon[ SelIconID ];
			else hIcon = hSIcon[ SelIconID ];
			DrawIconEx( hDC,20,y,hIcon,0,0,0,NULL,DI_NORMAL );
			DrawIconEx( hVDlgDC,0,0,hIcon,0,0,0,NULL,DI_NORMAL );
			EndPaint( hDlg,&ps );
			break;
		case WM_COMMAND:
			switch( LOWORD( wParam ) ) {
				case IDC_COPY:
					if( OpenClipboard( hDlg ) ) {
						EmptyClipboard();
						hClipBmp = CopyImage( ( HANDLE )hVDlgBmp,IMAGE_BITMAP,IconSize - 8,IconSize - 8,LR_COPYDELETEORG );
						SetClipboardData( CF_BITMAP,( HANDLE )hClipBmp );
						CloseClipboard();
						hClipBmp = NULL;
					}
					else {
						MessageBox( hDlg,"���ܴ򿪼�����!","����",MB_ICONINFORMATION | MB_OK );
					}
				case IDOK:
					DeleteDC( hVDlgDC );
					DeleteObject( hVDlgBmp );
					EndDialog( hDlg,TRUE );
					break;
				default:
					return FALSE;
			}
	}
	return FALSE;
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Web Developer
China China
Hi,I'm YangTze!

Comments and Discussions