windows-nt/Source/XPSP1/NT/base/tools/instaler/fileman.c
2020-09-26 16:20:57 +08:00

227 lines
4.8 KiB
C

#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include "resource.h"
#include "hlist.h"
#define TYPE_FILE 1
#define TYPE_DIR 2
LRESULT WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE hControlLib;
HINSTANCE hInst;
HBITMAP hFileBmp;
HBITMAP hDirBmp;
HWND hwndList;
BOOL HListInitialize(HMODULE);
int _cdecl
main(
int argc,
char *argv[]
)
{
WNDCLASS wndclass;
HWND hwnd;
MSG msg;
hInst = GetModuleHandle( NULL );
HListInitialize( hInst );
hFileBmp = LoadBitmap( hInst, MAKEINTRESOURCE(FILEBMP) );
hDirBmp = LoadBitmap( hInst, MAKEINTRESOURCE(DIRBMP) );
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInst;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
wndclass.hbrBackground = GetStockObject (WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = "test";
RegisterClass (&wndclass);
hwnd = CreateWindow(
"test",
"Test Custon Control App",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
GetModuleHandle(NULL),
NULL );
ShowWindow( hwnd, SW_SHOW );
UpdateWindow( hwnd );
while (GetMessage( &msg, NULL, 0, 0 )) {
TranslateMessage( &msg );
DispatchMessage( &msg );
}
return 0;
}
DWORD CALLBACK
ExpansionCallback(
LPDWORD type,
LPSTR *str,
LPSTR ref,
DWORD level,
DWORD nchild
)
{
static WIN32_FIND_DATA fd = {0};
static HANDLE hFind = NULL;
static CHAR Dir[MAX_PATH*3];
CHAR NewDir[MAX_PATH*3];
LPSTR p;
if ((!hFind) && (*type == TYPE_FILE)) {
MessageBeep( 0 );
return HLB_END;
}
if (!hFind) {
if (nchild) {
//
// this node needs to be collapsed
//
return HLB_COLLAPSE;
}
if (!GetCurrentDirectory( sizeof(Dir), Dir )) {
return HLB_IGNORE;
}
p = ref;
NewDir[0] = 0;
while (p && *p) {
p += (strlen(p) + 1);
}
while (p != ref) {
p -= 2;
while (*p && p != ref) {
p--;
}
if (!*p) {
p++;
}
strcat( NewDir, p );
strcat( NewDir, "\\" );
}
if (!SetCurrentDirectory( NewDir )) {
return HLB_END;
}
hFind = FindFirstFile( "*.*", &fd );
if (hFind == INVALID_HANDLE_VALUE) {
hFind = NULL;
MessageBeep( 0 );
return HLB_END;
}
} else {
if (!FindNextFile( hFind, &fd )) {
FindClose( hFind );
SetCurrentDirectory( Dir );
hFind = NULL;
return HLB_END;
}
}
*str = fd.cFileName;
if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
*type = TYPE_DIR;
} else {
*type = TYPE_FILE;
}
if (level && fd.cFileName[0] == '.') {
return HLB_IGNORE;
}
return HLB_EXPAND;
}
VOID
FillListBox(
VOID
)
{
WIN32_FIND_DATA fd;
HANDLE hFind;
DWORD type;
hFind = FindFirstFile( "*.*", &fd );
if (hFind == INVALID_HANDLE_VALUE) {
return;
}
do {
if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
type = TYPE_DIR;
} else {
type = TYPE_FILE;
}
SendMessage( hwndList, HLB_ADDSTRING, type, (LPARAM) fd.cFileName );
} while(FindNextFile( hFind, &fd ));
FindClose( hFind );
}
LRESULT
WndProc(
HWND hwnd,
UINT message,
WPARAM wParam,
LPARAM lParam
)
{
RECT cRect;
switch (message) {
case WM_CREATE:
GetClientRect( hwnd, &cRect );
hwndList = CreateWindow(
"HList",
NULL,
WS_CHILD | WS_VISIBLE,
cRect.left,
cRect.top,
cRect.right - cRect.left,
cRect.bottom - cRect.top,
hwnd,
NULL,
GetModuleHandle(NULL),
NULL );
SendMessage( hwndList, HLB_REGISTER_CALLBACK, 0, (LPARAM)ExpansionCallback );
SendMessage( hwndList, HLB_REGISTER_TYPE, TYPE_FILE, (LPARAM)hFileBmp );
SendMessage( hwndList, HLB_REGISTER_TYPE, TYPE_DIR, (LPARAM)hDirBmp );
FillListBox();
break;
case WM_DESTROY:
PostQuitMessage( 0 );
return 0;
}
return DefWindowProc( hwnd, message, wParam, lParam );
}