#include <windows.h>
#include <windowsx.h>
#include <shlwapi.h>
#include <shlobj.h>
#define elemof(x) (sizeof(x)/sizeof(*(x)))
#define T(x) TEXT(x)
#define nobreak
HINSTANCE hInst;
/*****************************
* Verzeichnisauswahl-Dialog *
*****************************/
int CALLBACK BrowseCallbackProc(HWND Wnd,UINT Msg,LPARAM,LPARAM) {
switch (Msg) {
case BFFM_INITIALIZED: {
WCHAR CurDir[MAX_PATH];
GetCurrentDirectoryW(elemof(CurDir),CurDir);
SendMessage(Wnd,BFFM_SETSELECTION,TRUE,(LPARAM)CurDir);
}break;
}
return 0;
}
bool ChooseDirectory(HWND Parent, LPTSTR DirName) {
TCHAR s[256];
LoadString(hInst,14,s,elemof(s));
BROWSEINFO bi={Parent,NULL,NULL,s,
BIF_NEWDIALOGSTYLE|BIF_RETURNONLYFSDIRS,
BrowseCallbackProc,0,0};
LPITEMIDLIST pidl;
CoInitialize(NULL);
pidl=SHBrowseForFolder(&bi);
if (!pidl) return false;
SHGetPathFromIDList(pidl,DirName);
CoTaskMemFree(pidl);
return true;
}
/*******************************
* Editfenster mit Hoch/Runter *
*******************************/
WNDPROC DefEditProc;
INT_PTR CALLBACK EditSubclassProc(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam) {
int Delta=0;
switch (Msg) {
case WM_VSCROLL: switch (LOWORD(wParam)) {
case SB_LINEUP: Delta= 1; break;
case SB_LINEDOWN: Delta= -1; break;
case SB_PAGEUP: Delta= 10; break;
case SB_PAGEDOWN: Delta=-10; break;
}break;
case WM_KEYDOWN: switch (wParam) {
case VK_UP: Delta= 1; break;
case VK_DOWN: Delta= -1; break;
case VK_PRIOR: Delta= 10; break;
case VK_NEXT: Delta=-10; break;
}break;
}
if (Delta) {
TCHAR s[32];
int n,nn;
GetWindowText(Wnd,s,elemof(s));
n=StrToInt(s);
nn=n+Delta;
if (nn<1) nn=1;
if (nn>100000) nn=100000;
if (nn==n) MessageBeep(MB_ICONHAND);
else{
wnsprintf(s,elemof(s),T("%d"),nn);
SetWindowText(Wnd,s);
}
}
return CallWindowProc(DefEditProc,Wnd,Msg,wParam,lParam);
}
/*******************************************
* Größenangabe mit Einheitenpräfix parsen *
*******************************************/
DWORD ParseSize(LPCTSTR s) {
DWORD l=StrToInt(s);
DWORD d=0;
LPCTSTR k=StrChr(s,',');
if (!k) k=StrChr(s,'.');
if (k) d=k[1]-'0';
s=StrChr(s,' ');
if (!s) return l;
TCHAR c=s[1];
if (s[2]=='i') c&=~' '; else c|=' ';
switch (s[1]) {
case 'k': l*=1000; l+=d*100; break;
case 'K': l*=1024; l+=d*102; break;
case 'm': l*=1000*1000; l+=d*100000; break;
case 'M': l*=1024*1024; l+=d*104858; break;
case 'g': l*=1000*1000*1000; l+=d*100000000; break;
case 'G': l*=1024*1024*1024; l+=d*107374182; break;
}
return l;
}
void WriteRandomFiles(DWORD len, UINT cnt, LPCTSTR pref, LPCTSTR path) {
srand(GetTickCount());
for (UINT i=0; i<cnt; i++) {
TCHAR name[MAX_PATH];
GetTempFileName(path,pref,0,name);
HMMIO h=mmioOpen(name,NULL,MMIO_ALLOCBUF|MMIO_CREATE|MMIO_DENYNONE|MMIO_WRITE);
static char buf[4096];
for (DWORD j=0; j<len;) {
int ll=len-j;
if (ll>sizeof(buf)) ll=sizeof(buf);
for (int k=0; k<ll; k++) buf[k]=rand();
mmioWrite(h,buf,ll);
j+=ll;
}
mmioClose(h,0);
}
}
INT_PTR CALLBACK MainDlgProc(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam) {
switch (Msg) {
case WM_INITDIALOG: {
DefEditProc=SubclassWindow(GetDlgItem(Wnd,11),EditSubclassProc);
TCHAR s[MAX_PATH];
GetCurrentDirectory(elemof(s),s);
SetDlgItemText(Wnd,13,s);
}return TRUE;
case WM_COMMAND: switch (LOWORD(wParam)) {
case IDOK:{
TCHAR s[32];
HWND w=GetDlgItem(Wnd,10);
GetWindowText(w,s,elemof(s));
DWORD len=ParseSize(s);
if (!len) {
SetFocus(w);
Edit_SetSel(w,0,-1);
break;
}
UINT cnt=GetDlgItemInt(Wnd,11,NULL,FALSE);
if (!cnt) {
w=GetDlgItem(Wnd,11);
SetFocus(w);
Edit_SetSel(w,0,-1);
break;
}
TCHAR pref[4];
GetDlgItemText(Wnd,12,pref,elemof(pref));
TCHAR path[MAX_PATH];
GetDlgItemText(Wnd,13,path,elemof(path));
HCURSOR curs=SetCursor(LoadCursor(0,IDC_WAIT));
WriteRandomFiles(len,cnt,pref,path);
SetCursor(curs);
}nobreak;
case IDCANCEL: EndDialog(Wnd,wParam); break;
case 14: { // Verzeichnis-Auswahl „…“
TCHAR s[MAX_PATH];
GetDlgItemText(Wnd,13,s,elemof(s));
if (ChooseDirectory(Wnd,s)) {
SetDlgItemText(Wnd,13,s);
}
}break;
}
}
return FALSE;
}
void CALLBACK WinMainCRTStartup() {
hInst=GetModuleHandle(NULL);
ExitProcess((UINT)DialogBox(hInst,MAKEINTRESOURCE(100),0,MainDlgProc));
}
Vorgefundene Kodierung: ANSI (CP1252) | 4
|
|