ファイルの列挙


リスト最大の奥義!

プログラマの好みもあるかもしれないが、一般的な考え方としては
リストボックスが最大の効力を発揮するのは、ファイルの列挙を行うときです

ファイル管理、編集などのユーティリティプログラムでは
リストに指定フォルダのファイルを列挙して、選択するということが良くあります
この一見面倒そうなプログラム、実はリストボックスがデフォルトでサポートしています

ファイルの列挙には LB_DIR メッセージをリストに送ります
WPARAM には表示するファイルの属性を以下の定数で指定します

定数解説
DDL_ARCHIVE アーカイブファイル
アーカイブビットがセットされたファイル
DDL_DIRECTORY サブディレクトリ
サブディレクトリ名は [ ] に囲まれます
DDL_DRIVES ドライブ
ドライブ名は [-x-] というように囲まれます(x はドライブ名)
DDL_EXCLUSIVE 排他的検索
指定属性のファイルのみ
DDL_HIDDEN 隠しファイル
DDL_READONLY 読みこみ専用ファイル
DDL_READWRITE 通常のファイル
DDL_SYSTEM システムファイル

LPARAM には、表示するファイルの名前を表す文字列へのポインタを指定します
これは、ワイルドカードに対応いるので、例えば *.* と指定すれば
フォルダ内の全てのファイルを列挙させることができます
*.jpg とすれば、フォルダ内の jpg 拡張子のファイルを列挙します
ただし、この文字はドライブやサブディレクトリに対しては無効です

戻り値は、最後に加えられたファイルのインデックスです
失敗した時は LB_ERR、メモリが足りなければ LB_ERRSPACE が返ります
#include <windows.h>

LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
	static HWND list;

	switch (msg) {
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	case WM_CREATE:
		list = CreateWindow(
			TEXT("LISTBOX") , NULL , 
			WS_CHILD | WS_VISIBLE | LBS_STANDARD , 
			0 , 0 , 300 , 300 , hwnd , (HMENU)1 ,
			((LPCREATESTRUCT)(lp))->hInstance , NULL
		);
		SendMessage(list , LB_DIR , 
			DDL_READWRITE | DDL_DIRECTORY | DDL_DRIVES ,
			(LPARAM)TEXT("*.*")
		);
		return 0;
	}
	return DefWindowProc(hwnd , msg , wp , lp);
}

int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
			PSTR lpCmdLine , int nCmdShow ) {
	HWND hwnd;
	MSG msg;
	WNDCLASS winc;

	winc.style		= CS_HREDRAW | CS_VREDRAW;
	winc.lpfnWndProc	= WndProc;
	winc.cbClsExtra	= winc.cbWndExtra	= 0;
	winc.hInstance		= hInstance;
	winc.hIcon		= LoadIcon(NULL , IDI_APPLICATION);
	winc.hCursor		= LoadCursor(NULL , IDC_ARROW);
	winc.hbrBackground	= (HBRUSH)GetStockObject(WHITE_BRUSH);
	winc.lpszMenuName	= NULL;
	winc.lpszClassName	= TEXT("KITTY");

	if (!RegisterClass(&winc)) return -1;

	hwnd = CreateWindow(
			TEXT("KITTY") , TEXT("Kitty on your lap") ,
			WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
			CW_USEDEFAULT , CW_USEDEFAULT ,
			CW_USEDEFAULT , CW_USEDEFAULT ,
			NULL , NULL , hInstance , NULL
	);

	if (hwnd == NULL) return -1;

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


このプログラムは実行ファイルと同じフォルダ内のファイルを列挙します
フォルダの移動や、ファイルの読みこみについてはここでは触れません

C言語標準関数でファイルの入出力を行うこともできますが
この場合、Unicode に対応されていないことに注意する必要があります
ファイルのテキストをウィンドウに表示する場合、ASCII か Unicode かを識別する必要があります



前のページへ戻る次のページへ