ホームに戻る
 ディレクトリ探索

#
# makefile.mak sample
#

RESULT_TXT = result.txt

EXE = main.exe

OBJS = main.obj
OBJS = $(OBJS) edit.obj
OBJS = $(OBJS) str.obj

$(EXE): $(OBJS) $(RES)
 -bcc32 -W -e$(EXE) $(OBJS)>>res.txt
 @copy res.txt $(RESULT_TXT)>>null
 @del res.txt>>null
 @del null
 @echo *** RESULT **************************************************
 @type $(RESULT_TXT)
 @echo *************************************************************

.cpp.obj:
 -bcc32 -c $<>>res.txt

main.obj: main.cpp
edit.obj: edit.cpp
str.obj: str.cpp str.h

clean:
 del *.obj
 del *.tds
 del *.$$$$$$
 del *.tmp

/*
*   dirlist.cpp
*
*   ディレクトリをドラッグアンドドロップすると以下のファイルをすべて表示
*/

#include <windows.h>
#include <windowsx.h>
#include "str.h"

// ウィンドウプロシージャの宣言(ウィンドウの動作を規定)
LRESULT CALLBACK WndProc(
  HWND hwnd,    //ウィンドウハンドル(void型ポインタ)
  UINT message,    //メッセージ識別番号(unsigned int)
  WPARAM wParam,    //(32ビットlong)
  LPARAM lParam);    //(32ビットlong)

// ファイルドロップへの対応
int FileDrop(HDROP);

//インスタンスのハンドル
HINSTANCE hInst;

//エディット用バッファ
char szStr[1024 * 64];

extern HWND getEditHandle();
extern int initEdit(HWND);
extern int addLine(char *);

//メイン関数
int APIENTRY WinMain(
  HINSTANCE hInstance,  //インスタンスのハンドル
  HINSTANCE hPreInstance, //以前のインスタンスハンドル
  LPSTR,  //コマンド行の文字列
  int cmdShow)    //ウィンドウの表示状態
{
  //ウィンドウクラスの宣言
  WNDCLASS wd;

  //ウィンドウクラス名
  char *wdName = "dirlist";

  //ウィンドウ登録のためのループ
  if (!hPreInstance) {
    //ウィンドウスタイル
    wd.style = CS_HREDRAW | CS_VREDRAW;  //幅、高さの変化に対し再描画する
    //ウィンドウプロシージャ
    wd.lpfnWndProc = (WNDPROC)WndProc;
    //クラスの予備のメモリ領域
    wd.cbClsExtra = 0;
    //ウィンドウの予備のメモリ領域
    wd.cbWndExtra = 0;
    //プログラムのインスタンスハンドル
    wd.hInstance = hInstance;
    //アイコンのハンドル
    wd.hIcon = NULL;
    //カーソルのハンドル
    wd.hCursor = LoadCursor(NULL, IDC_ARROW);
    //バックグラウンドのブラシのハンドル
    wd.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    //メニュー名
    wd.lpszMenuName =  NULL;
    //クラス名
    wd.lpszClassName = wdName;

    //ウィンドウの登録(成功 非0、失敗 0)
    if (!RegisterClass(&wd))
      return FALSE;
  }

  //ウィンドウの生成(ハンドルを form00 とする)
  HWND form00 = CreateWindowEx(
    NULL,      //拡張スタイル(なし)
    wdName,      //ウィンドウクラス名
    "DirList",    //ウィンドウの名前
    WS_OVERLAPPEDWINDOW,  //ウィンドウスタイル(オーバーラップ型)
    CW_USEDEFAULT,    //ウィンドウのX座標(ディフォルト)
    CW_USEDEFAULT,    //ウィンドウのY座標(ディフォルト)
    200,      //ウィンドウの幅(200に設定)
    100,      //ウィンドウの高さ(100に設定)
    NULL,      //親ウィンドウ(この場合自身が親)
    NULL,      //メニュー(なし)
    hInstance,    //プログラムのハンドル
    NULL);      //予備パラメータ

  //ウィンドウの表示
  ShowWindow(form00, cmdShow);

  //ウィンドウの更新
  UpdateWindow(form00);

  //イベントのループ
  MSG msg;
  while (GetMessage(&msg, NULL, NULL, NULL))
  {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  }
  return msg.wParam;
}

// ウィンドウプロシージャ(ウィンドウの動作を規定)
LRESULT CALLBACK WndProc(
  HWND hWnd,
  UINT message,
  WPARAM wParam,
  LPARAM lParam)
{
  switch (message) {
  //ウィンドウ生成に対する処理
    case WM_CREATE:
      {
        DragAcceptFiles(hWnd, TRUE);

        initEdit(hWnd);
      }
      break;
  //ウィンドウサイズ変更に対する処理
    case WM_SIZE:
      {
        RECT r;
        GetClientRect(hWnd, &r);
        MoveWindow(getEditHandle(), r.left, r.top, r.right, r.bottom, TRUE);
      }
      break;

  //ファイルがドロップされたときの処理
    case WM_DROPFILES:
      {
        HDROP hDrop = (HDROP)wParam;

        FileDrop(hDrop);

        //ドロップを閉じる
        DragFinish(hDrop);
      }
      break;
  //ウィンドウを破壊する時の処理
    case WM_DESTROY:
      {
        PostQuitMessage(0);
      }
      break;
  //デフォルトの処理に対してデフォルトの処理を返す
    default:
      return DefWindowProc(hWnd, message, wParam, lParam);
  }
  return NULL;
}

/* ディレクトリを展開する再帰関数 */
int spreadDir(char *dirname){
  HANDLE hFind;
  WIN32_FIND_DATA tFD;
  int i;
  char finddir[MAX_PATH + 2];
  char pathname[MAX_PATH + 2];

  //addLine(dirname);
  //addLine("\r\n");

  str_copy(dirname, finddir, MAX_PATH + 2);
  str_add(finddir, MAX_PATH + 2, "\\*");

  hFind = FindFirstFile(finddir, &tFD);

  if(hFind == INVALID_HANDLE_VALUE){
    return 0;
  }

  do{
    if(str_cmp(tFD.cFileName, ".") != 1 && str_cmp(tFD.cFileName, "..") != 1){
      str_copy(dirname, pathname, MAX_PATH + 2);
      str_add(pathname, MAX_PATH + 2, "\\");
      str_add(pathname, MAX_PATH + 2, tFD.cFileName);

      if(tFD.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){
        spreadDir(pathname);
      }
      else{
        addLine(pathname);
        addLine("\r\n");
      }
    }
  }while(FindNextFile(hFind, &tFD));

  return 1;
}

/* ファイルドラッグアンドドロップ */
int FileDrop(HDROP hDrop){
  int i; // ループ用
  int filenum; // ドロップされたファイル数
  //int filenamesize; // ドロップされたファイル名のサイズ
  char filename[MAX_PATH + 2]; // ファイル名 +2 は保険
  DWORD result;

  filenum = DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0);

  for(i = 0; i < filenum; i++){
    //filenamesize = DragQueryFile(hDrop, i, NULL, 0);
    DragQueryFile(hDrop, i, filename, MAX_PATH + 1);

    result = GetFileAttributes(filename);

    if(result & FILE_ATTRIBUTE_DIRECTORY){
      spreadDir(filename);
    }
    else{
      addLine(filename);
      addLine("\r\n");
    }
  }

  return 1;
}

/*
*   edit.cpp
*/

#include <windows.h>
#include <windowsx.h>

#define ID_EDIT 100

// 外部参照

extern HINSTANCE hInst;


//エディットのハンドル
static HWND hEdit;

HWND getEditHandle();
int initEdit(HWND);
int addLine(char *);

HWND getEditHandle(){
  return hEdit;
}

int initEdit(HWND hWnd)
{
  RECT r;

  GetClientRect(hWnd, &r);

  hEdit = CreateWindow("EDIT", NULL, 
    WS_CHILD | WS_VISIBLE | ES_WANTRETURN | ES_MULTILINE | 
    ES_AUTOVSCROLL | WS_VSCROLL | ES_AUTOHSCROLL | WS_HSCROLL,
    0, 0,
    r.right, r.bottom,
    hWnd,
    (HMENU)ID_EDIT,
    hInst,
    NULL);

    return 1;
}

static void Edit_AddString(HWND, char *);

int addLine(char *s){
  Edit_AddString(hEdit, s);

  return 1;
}

void Edit_AddString(HWND hWnd, char *string)
{
  int length = Edit_GetTextLength(hWnd);
  Edit_SetSel(hWnd, length, length);
  Edit_ReplaceSel(hWnd, string);
}

/*
*   str.h
*/

#ifndef STR_HEADER

#define STR_HEADER

#ifdef STR_ITSELF

#define EXT

#else

#define EXT extern

#endif /* STR_ITSELF */

/* ヌル文字を除いたバイト文字数を返す */
EXT int get_length(char *);
/* 第1引数の文字列と第2引数の文字列とを比較 同じなら 1 違うなら 0 を返す */
EXT int str_cmp(char *, char *);
/* 第1引数の文字列を参照し、第2引数のバッファにコピー書き込み、第3引数はバッファのサイズ */
EXT int str_copy(char *, char *, int);
/* 第1引数の文字列に第3引数の文字列を書き込み追加 第2引数は第1引数の持つ最大バッファサイズ */
EXT int str_add(char *, int, char *);

#endif /* STR_HEADER */

/*
*   str.cpp
*/

#define STR_ITSELF

#include "str.h"

int get_length(char *s){
  int i, count;

  for(i = 0, count = 0;; i++){
    if(s[i] == '\0'){
      return count;
    }

    count++;
  }
}

int str_cmp(char *s1, char *s2){
  int i;
  int s1_length;

  s1_length = get_length(s1);

  for(i = 0; i <= s1_length; i++){
    if(s1[i] - s2[i] != 0){
      return 0;
    }
  }

  return 1;
}

int str_copy(char *s1, char *s2, int s2_buf_size){
  int i;
  int s1_length;

  s1_length = get_length(s1);

  if(s2_buf_size - s1_length <= 0){
    // s1_buf_size が足りない。
    return 0;
  }

  for(i = 0; i <= s1_length; i++){
    s2[i] = s1[i];
  }

  s2[s1_length + 1] = '\0';

  return 1;
}

int str_add(char *s1, int s1_buf_size, char *s2){
  int i, j;
  int s1_length, s2_length, s12_length;

  s1_length = get_length(s1);
  s2_length = get_length(s2);

  s12_length = s1_length + s2_length;

  if(s1_buf_size - s12_length <= 0){
    // s1_buf_size が足りない。
    return 0;
  }

  for(i = s1_length, j = 0; i <= s12_length; i++, j++){
    s1[i] = s2[j];
  }

  s1[s12_length + 1] = '\0';

  return 1;
}

inserted by FC2 system