' ---------------------------------------------------------------------------- ' イベント プロシージャ ' ---------------------------------------------------------------------------- ' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。 ' ウィンドウ ハンドル: hMainWnd ' メモ - 以下の領域を、変数、構造体、定数、関数を宣言するための、 ' グローバル領域として利用することができます。 ' ----------------------------------ここから---------------------------------- '/* UNLHA32.H, Micco, Dec.2,2003 '** '** LH 2.02a '** Copyright (c) 1988-95 by Haruyasu Yoshizaki All rights reserved. '** '** Win/WinNT-SFX '** Copyright (c) 1995-96 by mH All rights reserved. '** '** UNLHA32.DLL '** Copyright (c) 1995-2003 by Micco All rights reserved. '*/ Declare Function Unlha Lib "UnLHA32.DLL" _ (ByVal hwnd As Long, _ ByVal szCmdLine As String, _ ByVal szOutput As String, _ ByVal dwSize As Long) AS Long 'ファイルパスからファイル名を取り除く関数定義' Declare Function PathRemoveFileSpec Lib "shlwapi.dll" Alias "PathRemoveFileSpecA" _ (ByVal pszPath As String) As Long 'Windowsの特殊フォルダを取得する関数定義' Declare Function SHGetSpecialFolderPath Lib "shell32" Alias "SHGetSpecialFolderPathA" _ (ByVal hwndOwner As Long, _ ByVal lpszPath As String, _ ByVal nFolder As Long, _ ByVal fCreate As Long) As Long Const CSIDL_DESKTOPDIRECTORY = 0x0010 '定数定義' Const LV_COLUMN_FNAME_WIDTH = 128 Const LV_COLUMN_FSIZE_WIDTH = 64 Const LV_COLUMN_FDATE_WIDTH = 128 Const LV_WIDTH = LV_COLUMN_FNAME_WIDTH + LV_COLUMN_FSIZE_WIDTH + LV_COLUMN_FDATE_WIDTH Const LV_HEIGHT = 128 Const BUTTON_AREA_HEIGHT = 32 'グローバル変数定義' Dim g_hList As Long ' ----------------------------------ここまで---------------------------------- Sub MainWnd_Destroy() 'リストビューウィンドウを破棄する' DestroyWindow(g_hList) MiniLha_DestroyObjects() PostQuitMessage(0) End Sub ' ---------------------------------------------------------------------------- '初期化処理' ' ---------------------------------------------------------------------------- Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT) Dim tIccEx As INITCOMMONCONTROLSEX 'コモンコントロール(リストビュー)を初期化する' tIccEx.dwSize = Len(tIccEx) tIccEx.dwICC = ICC_LISTVIEW_CLASSES InitCommonControlsEx(tIccEx) 'ウィンドウ状態を初期化する' InitializeWindow() 'リストビューウィンドウを初期化する' InitializeListView() End Sub ' ---------------------------------------------------------------------------- 'ウィンドウ状態を初期化する' ' ---------------------------------------------------------------------------- Sub InitializeWindow() Dim iCaption As Integer Dim iBorderX As Integer Dim iBorderY As Integer Dim iEdgeX As Integer Dim iEdgeY As Integer Dim iWndSizeX As Integer Dim iWndSizeY As Integer Dim iDesktopSizeX As Integer Dim iDesktopSizeY As Integer iCaption = GetSystemMetrics(SM_CYCAPTION) iBorderX = GetSystemMetrics(SM_CXSIZEFRAME) iBorderY = GetSystemMetrics(SM_CYSIZEFRAME) iEdgeX = GetSystemMetrics(SM_CXEDGE) iEdgeY = GetSystemMetrics(SM_CYEDGE) iDesktopSizeX = GetSystemMetrics(SM_CXFULLSCREEN) iDesktopSizeY = GetSystemMetrics(SM_CYFULLSCREEN) iWndSizeX = LV_WIDTH + iBorderX * 2 + iEdgeX iWndSizeY = LV_HEIGHT + iCaption + iBorderY * 2 + iEdgeY + BUTTON_AREA_HEIGHT 'ウィンドウ位置、サイズを変更する' MoveWindow(hMainWnd, (iDesktopSizeX - iWndSizeX) / 2, _ (iDesktopSizeY - iWndSizeY) / 2, iWndSizeX, iWndSizeY, 1) End Sub ' ---------------------------------------------------------------------------- 'リストビューを初期化する' ' ---------------------------------------------------------------------------- Sub InitializeListView() Dim hInst As Long Dim dwStyle As DWord Dim hList As Long Dim tLvColumn As LVCOLUMN 'リストビューウィンドウを作成する' hInst = GetWindowLong(hMainWnd, GWL_HINSTANCE) g_hList = CreateWindowEx(0, "SysListView32", "", WS_CHILD or WS_VISIBLE or _ LVS_REPORT or WS_BORDER or LVS_SINGLESEL, _ 2, 2, LV_WIDTH, LV_HEIGHT, hMainWnd, 0, hInst, 0) 'リストビューウィンドウの拡張スタイルを設定する' dwStyle = SendMessage(g_hList, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0) dwStyle = dwStyle xor (LVS_EX_FULLROWSELECT or LVS_EX_GRIDLINES) SendMessage(g_hList, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, dwStyle) ZeroMemory(VarPtr(tLvColumn), Len(tLvColumn)) 'リストビュー列を設定する' '1列目はファイル名表示用' tLvColumn.mask = LVCF_FMT or LVCF_WIDTH or LVCF_TEXT or LVCF_SUBITEM tLvColumn.fmt = LVCFMT_LEFT tLvColumn.cx = LV_COLUMN_FNAME_WIDTH tLvColumn.pszText = "ファイル名" tLvColumn.iSubItem = 0 SendMessage(g_hList, LVM_INSERTCOLUMN, 0, VarPtr(tLvColumn)) '2列目はファイルサイズ表示用' tLvColumn.fmt = LVCFMT_RIGHT tLvColumn.cx = LV_COLUMN_FSIZE_WIDTH tLvColumn.pszText = "サイズ" tLvColumn.iSubItem = 1 SendMessage(g_hList, LVM_INSERTCOLUMN, 1, VarPtr(tLvColumn)) '3列目はファイル更新日時表示用' tLvColumn.fmt = LVCFMT_LEFT tLvColumn.cx = LV_COLUMN_FDATE_WIDTH tLvColumn.pszText = "更新日時" tLvColumn.iSubItem = 2 SendMessage(g_hList, LVM_INSERTCOLUMN, 2, VarPtr(tLvColumn)) End Sub ' ---------------------------------------------------------------------------- 'ファイルがドロップされたときの処理' ' ---------------------------------------------------------------------------- Sub MainWnd_DropFiles(hDrop As Long) Dim dwFileNo As DWord Dim i As Integer Dim sFilePath[MAX_PATH] As Byte Dim strFolderPath As String Dim strExt As String 'リストビューアイテムをすべて消去する' SendMessage(g_hList, LVM_DELETEALLITEMS, 0, 0) 'ドロップされたファイル数を取得する' dwFileNo = DragQueryFile(hDrop, -1, NULL, 0); 'ドロップされたファイル数分繰り返す' For i = 0 To dwFileNo - 1 'ドロップされたファイル名(フルパス)を取得する' DragQueryFile(hDrop, i, sFilePath, MAX_PATH); 'もし1個目のファイルならば、そのフォルダパスを取得し、' 'カレントディレクトリとして登録する' If i = 0 Then strFolderPath= sFilePath PathRemoveFileSpec(strFolderPath) SetCurrentDirectory(strFolderPath) End If 'ファイルの拡張子を取得する' strExt = GetFileExt(sFilePath) '拡張子Lzhのファイルのみリストビューへアイテムを登録する' If strExt = "lzh" or strExt = "LZH" Then InsertListViewItem(sFilePath, i) End If Next 'ドロップハンドルを破棄する' DragFinish(hDrop); End Sub ' ---------------------------------------------------------------------------- 'ファイルパスから拡張子だけを抜き出す' ' ---------------------------------------------------------------------------- Function GetFileExt(ByVal strFilePath As String) As String Dim iCount As Integer 'strFilePathを右から順に調べる。 For iCount = Len(strFilePath) To 1 Step -1 Select Case Mid$(strFilePath, iCount, 1) '"."ならば以降の文字列を返し関数を抜ける。 Case "." GetFileExt = Mid$(strFilePath, iCount + 1) Exit Function 'パスの区切りが出てきたらリターン Case "\", "/" Exit For End Select Next End Function ' ---------------------------------------------------------------------------- 'リストビューへアイテムを追加する処理' ' ---------------------------------------------------------------------------- Sub InsertListViewItem(ByVal psFilePath As BytePtr, ByVal iItem As Integer) Dim tItem As LVITEM Dim sFileName[MAX_PATH] As Byte Dim sFileSize[64] As Byte Dim sFileDate[64] As Byte Dim hFile As Long Dim tWfd As WIN32_FIND_DATA Dim tFileTime As FILETIME Dim tSystemTime As SYSTEMTIME ZeroMemory(VarPtr(tItem), Len(tItem)) ZeroMemory(VarPtr(tWfd), Len(tWfd)) 'ファイルハンドルを取得する' hFile = FindFirstFile(psFilePath, tWfd) If hFile = INVALID_HANDLE_VALUE Then Exit Sub End If 'ファイル名を取得する' lstrcpy(sFileName, tWfd.cFileName) 'ファイルサイズをKB単位の文字列に変換する' lstrcpy(sFileSize, Str$(Int(tWfd.nFileSizeLow / 1024 + 1))) lstrcat(sFileSize, "KB") 'ファイル更新日時を取得し、「YY/MM/DD TT:MM」形式に変換する' FileTimeToLocalFileTime(tWfd.ftLastWriteTime, tFileTime) FileTimeToSystemTime(tFileTime, tSystemTime) wsprintf(sFileDate, "%02d/%02d/%02d %02d:%02d", _ tSystemTime.wYear, tSystemTime.wMonth, tSystemTime.wDay, _ tSystemTime.wHour, tSystemTime.wMinute) FindClose(hFile) 'ファイル名をリストビューに追加する' tItem.mask = LVIF_TEXT tItem.iItem = iItem tItem.pszText = sFileName tItem.iSubItem = 0 SendMessage(g_hList, LVM_INSERTITEM, 0, VarPtr(tItem)) 'ファイルサイズをリストビューにセットする' tItem.pszText = sFileSize tItem.iSubItem = 1 SendMessage(g_hList, LVM_SETITEM, 0, VarPtr(tItem)) 'ファイル更新日時をリストビューにセットする' tItem.pszText = sFileDate tItem.iSubItem = 2 SendMessage(g_hList, LVM_SETITEM, 0, VarPtr(tItem)) End Sub ' ---------------------------------------------------------------------------- 'コモンコントロールのメッセージ処理' ' ---------------------------------------------------------------------------- Sub MainWnd_Notify(ByRef nmHdr As NMHDR) Dim iIndex As Integer 'リストビューのアイテム状態が変更された時の処理' If nmHdr.hwndFrom = g_hList Then If nmHdr.code = LVN_ITEMCHANGED Then 'リストビューアイテムが選択されているかどうかチェックする' iIndex = SendMessage(g_hList, LVM_GETNEXTITEM, -1, LVNI_ALL or LVNI_SELECTED) 'リストビューアイテムが選択されていたら、「解凍」ボタンを有効にする' '選択されていなかったら、「解凍」ボタンを無効にする' If iIndex = -1 Then EnableWindow(GetDlgItem(hMainWnd, CommandButtonMelt), FALSE) Else EnableWindow(GetDlgItem(hMainWnd, CommandButtonMelt), TRUE) End If End If End If End Sub ' ---------------------------------------------------------------------------- '「解凍」ボタンが押されたときの処理' ' ---------------------------------------------------------------------------- Sub MainWnd_CommandButtonMelt_Click() Dim tItem As LVITEM Dim iIndex As Integer Dim sFileName[MAX_PATH] As Byte Dim sLhaFilePathTemp[MAX_PATH] As Byte Dim sLhaFilePath[MAX_PATH] As Byte Dim sOutputFolderTemp[MAX_PATH] As Byte Dim sOutputFolder[MAX_PATH] As Byte Dim i As Integer ZeroMemory(VarPtr(tItem), Len(tItem)) '選択されたリストビューアイテムのインデクス番号を取得する' iIndex = SendMessage(g_hList, LVM_GETNEXTITEM, -1, LVNI_ALL or LVNI_SELECTED) If iIndex = -1 Then Exit Sub End If '選択されたリストビューアイテムの「ファイル名」を取得する' tItem.mask = LVIF_TEXT tItem.iItem = iIndex tItem.iSubItem = 0 tItem.pszText = sFileName tItem.cchTextMax = MAX_PATH SendMessage(g_hList, LVM_GETITEMTEXT, iIndex, VarPtr(tItem)) 'Unlha関数のコマンドライン引数ではスペースを区切り文字と認識するので' 'スペースを含んだファイルパスを指定するときは"C:\My Documents"のように' 'ダブルクォーテーション(Chr$(34))で括る必要がある。' 'LHAファイルのパスを取得する' GetCurrentDirectory(MAX_PATH, sLhaFilePathTemp) lstrcpy(sLhaFilePath, Chr$(34)) lstrcat(sLhaFilePath, sLhaFilePathTemp) lstrcat(sLhaFilePath, "\") lstrcat(sLhaFilePath, sFileName) lstrcat(sLhaFilePath, Chr$(34)) 'LHAファイルの解凍先(デスクトップフォルダ)を取得する' SHGetSpecialFolderPath(NULL, sOutputFolderTemp, CSIDL_DESKTOPDIRECTORY, FALSE); lstrcpy(sOutputFolder, Chr$(34)) lstrcat(sOutputFolder, sOutputFolderTemp) lstrcat(sOutputFolder, "\") lstrcat(sOutputFolder, Chr$(34)) '解凍処理を実行する' If Melt(sLhaFilePath, sOutputFolder) = 0 Then '選択されたリストビューアイテムを消去する' SendMessage(g_hList, LVM_DELETEITEM, iIndex, 0) Else MessageBox(hMainWnd, "解凍に失敗しました。", "Error", MB_OK) End If End Sub ' ---------------------------------------------------------------------------- '解凍処理' ' ---------------------------------------------------------------------------- Function Melt(ByVal sLhaFilePath As BytePtr, ByVal sOutputFolder As BytePtr) As Integer Dim sCommandLine[1024] As BytePtr Dim sBuffer[1024] As BytePtr lstrcpy(sCommandLine, "e -a1 -x1 -l1 -jp1 -m1 -c0 ") lstrcat(sCommandLine, sLhaFilePath) lstrcat(sCommandLine, " ") lstrcat(sCommandLine, sOutputFolder) lstrcat(sCommandLine, " *.*") Melt = Unlha(hMainWnd, sCommandLine, sBuffer, 1024) End Function ' ---------------------------------------------------------------------------- '「終了」ボタンが押されたときの処理' ' ---------------------------------------------------------------------------- Sub MainWnd_CommandButtonEnd_Click() DestroyWindow(hMainWnd) End Sub