用Delphi打开它编译一次即可产生一个大小为19KB的EXE.是不是很小!实际上,你甚至只用一行代码就把它Show出来,不过程序无法关闭而已.
Uses Windows; {$R Demo.Res} function MainDialogProc: integer; begin Result := 0; end; begin DialogBox(hInstance, 'MAINFORM', 0, @MainDialogProc); end 上面的程序只不过是一个空窗口而已,现在我们来写代码响应按下相应按钮响应的事件.完整代码如下:
program MyDemo; uses Windows, Messages, shlobj; const ID_Edit = 10001; ID_Selet = 10002; ID_Setup = 10003; ID_Quit = 10004; ID_Exit = 10005; {$R Demo.Res} var MainWin: HWND;
function My_Gettext: string; var Textlength: Integer; Text: PChar; s: string; begin TextLength := GetWindowTextLength(GetDlgItem(MainWin, ID_Edit)); GetMem(Text, TextLength + 1); GetWindowText(GetDlgItem(MainWin, ID_Edit), Text, TextLength + 1); s := text; FreeMem(Text, TextLength + 1); Result := s; end;
function Getmyname: string; var i, j: integer; begin J := 3; for i := 1 to length(ParamStr(0)) do if ParamStr(0)[i] = '\' then J := I; Result := copy(ParamStr(0), J + 1, length(ParamStr(0)) - J); end;
function SelectDirectory(handle: hwnd; const Caption: string; const Root:WideString;outDirectory:string): Boolean; var lpbi: _browseinfo; buf: array[0..MAX_PATH] of char; id: ishellfolder; eaten, att: cardinal; rt: pitemidlist; initdir: pwidechar; begin result := false; lpbi.hwndOwner := handle; lpbi.lpfn := nil; lpbi.lpszTitle := pchar(caption); lpbi.ulFlags := BIF_RETURNONLYFSDIRS + BIF_EDITBOX; SHGetDesktopFolder(id); initdir := pwchar(root); id.ParseDisplayName(0, nil, initdir, eaten, rt, att); lpbi.pidlRoot := rt; getmem(lpbi.pszDisplayName, MAX_PATH); try result := shgetpathfromidlist(shbrowseforfolder(lpbi), buf); except freemem(lpbi.pszDisplayName); end; if result then begin directory := buf; if length(directory) <> 3 then directory := directory + '\'; end; end;
function MainDialogProc( DlgWin: hWnd; DlgMessage: UINT; DlgWParam: WPARAM; DlgLParam: LPARAM ) : integer; stdcall; var MyIcon: HICON; Sdir: string; begin Result := 0; case DlgMessage of WM_INITDIALOG: begin MyIcon := LoadIcon(hInstance, 'MainIcon'); SetClassLONG(DlgWin, GCL_HICON, MyIcon); MainWin := DlgWin; end; WM_Close: begin PostQuitMessage(0); Exit; end; WM_COMMAND: case LOWORD(DlgWParam) of
ID_Selet: begin if SelectDirectory(DlgWin, '请选择安装目录', '', Sdir) then SendMessage(GetDlgItem(DlgWin, ID_Edit), WM_SETTEXT, 0, lParam(pChar(Sdir))); end; ID_Setup: begin if My_Gettext = '' then begin MessageBox(DlgWin, '请先选择安装文件夹!', '信息', MB_ICONINFORMATION + MB_OK); Exit; end; CopyFile(pchar(ParamStr(0)), pchar(My_Gettext + Getmyname), false); MessageBox(DlgWin, '安装完毕!', '信息', MB_ICONINFORMATION + MB_OK); PostQuitMessage(0); Exit; end; ID_Quit: begin PostQuitMessage(0); EXIT; end; ID_Exit: begin if MessageBox(DlgWin, '你点击了菜单“退出”,你确定退出程序吗?', '信息', MB_ICONQUESTION + MB_OKCANCEL) = IDOK then PostQuitMessage(0); Exit; end; end; end; end; begin DialogBox(hInstance, 'MAINFORM', 0, @MainDialogProc); end 其中SelectDirectory函数的作用是返回一个选择的文件路径.然后把自己拷贝到选择的目录下,当然很多处理没有写,读者可以自行添加.文件编译后大小为22KB,如果直接用Delphi的VCL来写的话,将为338KB!完整代码可以在我的主页上下载:http://go4.163.com/lovejingtao/setup2.zip.代码中的消息处理相信大家看的懂.如果不用资源文件而直接用API来写将对它更加理解深刻,.限于篇幅这里不做详细介绍。
|