123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339 |
- Copyright (c) 1999 by Michael van Canneyt
- Win32 menu creation example.
- }
- { Changes by G”ran Andersson: major
- const FileMenus[] removed
- const filename removed
- type TFileName added
- SelectFile() added *
- LoadText() added *
- SaveText():
- SelectFile used *
- uses GetWindowTextLength & GetWindowText
- also saves empty files
- uses untyped file
- FreeMem frees Len+1, not Len
- AskSave() added *
- NewText() added *
- WindowProc():
- WM_Close added
- WM_Size don't assumes StatH=16
- WM_Command 101 calls NewText
- WM_Command 102 calls LoadText
- WM_Command 104 issues a WM_Close instead of doing a Halt
- WinRegister():
- with structure used
- EditCreate():
- takes Status object as parameter
- const EditText changed to empty string
- unused variable DC removed
- WS_HScroll & WS_VScroll added to const CS_Start
- ES_AutoHScroll & ES_AutoVScroll removed from CS_Start
- don't assumes StatH=16
- AddText() commented out
- WinCreate():
- menu creation moved inside if structure
- Options menu item uses the newly created SubMenu
- main:
- slight structure change (avoid unneccesary Exit)
- call to StatusCreate before EditCreate
- 2do:
- make edit panel always active
- add 3d inner bevel to edit panel
- window background color : white
- only ask to save if edited
- cut
- copy
- paste
- settings
- help
- }
- Program menudemo;
- {$APPTYPE GUI}
- {$MODE DELPHI}
- Uses Strings,Windows;
- Const AppName = 'MenuDemo';
- Var AMessage: Msg;
- hWindow,hStatus,Hedit: HWnd;
- WindowClass: WndClass;
- Menu: hMenu;
- Const
- EditMenus: Array[201..203] Of pchar = ('Cut','copy','paste');
- Type
- TFileName = Array[0..Max_Path] Of Char;
- Function SelectFile(Var FName:TFileName; Open:Boolean): Boolean;
- Const
- Filter: PChar = 'Text files (*.txt)'#0'*.txt'#0'All files (*.*)'#0'*.*'#0;
- Ext: PChar = 'txt';
- Var
- NameRec: OpenFileName;
- Begin
- FillChar(NameRec,SizeOf(NameRec),0);
- FName[0] := #0;
- With NameRec Do
- Begin
- LStructSize := SizeOf(NameRec);
- HWndOwner := HWindow;
- LpStrFilter := Filter;
- LpStrFile := @FName;
- NMaxFile := Max_Path;
- Flags := OFN_Explorer Or OFN_HideReadOnly;
- If Open Then
- Begin
- Flags := Flags Or OFN_FileMustExist;
- End;
- LpStrDefExt := Ext;
- End;
- If Open Then
- SelectFile := GetOpenFileName(@NameRec)
- Else
- SelectFile := GetSaveFileName(@NameRec);
- End;
- Procedure SaveText;
- Var Len: Longint;
- P: PChar;
- F: File;
- FName: TFileName;
- Begin
- If SelectFile(FName,False) Then
- Begin
- Assign(F,@FName);
- Rewrite(F,1);
- Len := GetWindowTextLength(HEdit);
- GetMem(P,Len+1);
- P[Len] := #0;
- If Len>0 Then
- Begin
- GetWindowText(HEdit,P,Len+1);
- BlockWrite(F,P^,Len);
- End;
- Close(F);
- FreeMem(P,Len+1);
- End;
- End;
- Procedure AskSave;
- Begin
- If MessageBox(HWindow,'Save text?','Edited',MB_IconQuestion Or MB_YesNo)=IdYes Then
- Begin
- SaveText;
- End;
- End;
- Procedure LoadText;
- Var
- FName: TFileName;
- F: File;
- Len: LongInt;
- P: PChar;
- Begin
- AskSave;
- If SelectFile(FName,True) Then
- Begin
- Assign(F,@FName);
- Reset(F,1);
- Len := FileSize(F);
- GetMem(P,Len+1);
- P[Len] := #0;
- If Len>0 Then BlockRead(F,P^,Len);
- Close(F);
- SetWindowText(HEdit,P);
- FreeMem(P,Len+1);
- End;
- End;
- Procedure NewText;
- Const
- Empty: PChar = '';
- Begin
- AskSave;
- SendMessage(HEdit,WM_SetText,1,LongInt(Empty));
- End;
- Function WindowProc (Window:HWnd;AMessage : UINT; WParam : WParam; LParam:LParam): LResult;
- stdcall;
- export;
- Var ps: paintstruct;
- r: rect;
- StatH: Word;
- nrmenu : longint;
- Begin
- WindowProc := 0;
- Case AMessage Of
- wm_Paint:
- Begin
- BeginPaint(Window,@ps);
- GetClientRect(Window,@r);
- EndPaint(Window,ps);
- Exit;
- End;
- wm_Close:
- Begin
- AskSave;
- End;
- wm_Destroy:
- Begin
- PostQuitMessage (0);
- Exit;
- End;
- wm_Size:
- Begin
- if HStatus<>0 then
- begin
- GetClientRect(HStatus,@R);
- StatH := R.Bottom-R.Top;
- GetClientRect(Window,@R);
- MoveWindow (hStatus,r.left,r.bottom-StatH,r.right,r.bottom,true);
- if HEdit<>0 then
- MoveWindow (HEdit,0,0,r.right-r.left,r.bottom-r.top-StatH,true);
- end;
- End;
- wm_Command:
- Begin
- NrMenu := WParam And $FFFF;
- Case NrMenu Of
- 101 : NewText;
- 102 : LoadText;
- 103 : SaveText;
- 104 : PostMessage(Window,WM_Close,0,0);
- 201..203: MessageBox(Window,EditMenus[NrMenu],
- 'Edit operation not implemented',MB_OK Or
- MB_IconInformation);
- End;
- End;
- End;
- WindowProc := DefWindowProc(Window,AMessage,WParam,LParam);
- End;
- Function WinRegister: Boolean;
- Begin
- With WindowClass Do
- Begin
- Style := cs_hRedraw Or cs_vRedraw;
- lpfnWndProc := WndProc(@WindowProc);
- cbClsExtra := 0;
- cbWndExtra := 0;
- hInstance := system.MainInstance;
- hIcon := LoadIcon (0,idi_Application);
- hCursor := LoadCursor (0,idc_Arrow);
- hbrBackground := GetStockObject(GRAY_BRUSH);
- lpszMenuName := 'Files';
- lpszClassName := AppName;
- End;
- Result := RegisterClass (WindowClass)<>0;
- End;
- Function EditCreate(ParentWindow,Status:HWnd): HWnd;
- Const
- CS_Start = WS_Child or WS_HScroll or WS_VScroll or ES_MultiLine or ES_Left;
- EdiTText: PChar = '';
- Var
- HEdit: HWND;
- R: TRect;
- StatH: Word;
- { rev 1.5 : comment out
- Procedure AddText (S:String);
- begin
- S:=S+#0;
- SendMessage(HEdit,em_replacesel,0,longint(pchar(@S[1])));
- end;
- }
- Begin
- GetClientRect(Status,@R);
- StatH := R.Bottom-R.Top;
- GetClientRect(ParentWindow,@R);
- HEdit := CreateWindow ('EDIT',EditText,CS_Start,0,0,
- R.Right-R.Left,R.Bottom-R.top-StatH,ParentWindow,0,
- System.MainInstance,Nil);
- If HEdit<>0 Then
- Begin
- ShowWindow(Hedit,cmdShow);
- UpdateWindow(HEdit);
- End;
- Result := HEdit;
- End;
- Function WinCreate: HWnd;
- Var hWindow: HWnd;
- SubMenu: hMenu;
- Begin
- hWindow := CreateWindow (AppName,'MenuDemo',ws_OverlappedWindow,
- cw_UseDefault,cw_UseDefault,cw_UseDefault,
- cw_UseDefault,0,0,system.MainInstance,Nil);
- If hWindow<>0 Then
- Begin
- Menu := CreateMenu;
- SubMenu := CreateMenu;
- AppendMenu(Submenu,MF_STRING,101,'&New...');
- AppendMenu(Submenu,MF_STRING,102,'&Open...');
- AppendMenu(Submenu,MF_STRING,103,'&Save...');
- AppendMenu(Submenu,MF_SEPARATOR,0,Nil);
- AppendMenu(SubMenu,MF_String,104,'E&xit');
- AppendMenu(Menu,MF_POPUP,SubMenu,'&Files');
- SubMenu := CreateMenu;
- AppendMenu(SubMenu,MF_String,201,'&Cut');
- AppendMenu(SubMenu,MF_String,202,'&Copy');
- AppendMenu(SubMenu,MF_STRING,203,'&Paste');
- AppendMenu(Menu,MF_POPUP,SubMenu,'&Edit');
- SubMenu := CreateMenu;
- AppendMenu(SubMenu,MF_String,301,'&Settings');
- AppendMenu(Menu,MF_POPUP,SubMenu,'&Options');
- AppendMenu(Menu,MF_STRING,0,'&Help');
- SetMenu(hWindow,menu);
- ShowWindow(hWindow,CmdShow);
- ShowWindow(hWindow,SW_SHOW);
- UpdateWindow(hWindow);
- End;
- Result := hWindow;
- End;
- Function StatusCreate (parent:hwnd): HWnd;
- Begin
- StatusCreate := CreateStatusWindow (WS_CHILD Or WS_VISIBLE,'Ready...',parent,$7712);
- End;
- Begin
- If Not WinRegister Then
- Begin
- MessageBox (0,'Register failed',Nil, mb_Ok);
- End
- Else
- Begin
- hWindow := WinCreate;
- If longint(hWindow)=0 Then
- Begin
- MessageBox (0,'WinCreate failed',Nil,MB_OK);
- End
- Else
- Begin
- HStatus := statuscreate(hwindow);
- HEdit := EditCreate(HWindow,HStatus);
- While GetMessage(@AMessage,0,0,0) Do
- Begin
- TranslateMessage(AMessage);
- DispatchMessage(AMessage);
- End;
- Halt(AMessage.wParam);
- End;
- End;
- End.
|