menu.pp 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  1. Copyright (c) 1999 by Michael van Canneyt
  2. Win32 menu creation example.
  3. }
  4. { Changes by G”ran Andersson: major
  5. const FileMenus[] removed
  6. const filename removed
  7. type TFileName added
  8. SelectFile() added *
  9. LoadText() added *
  10. SaveText():
  11. SelectFile used *
  12. uses GetWindowTextLength & GetWindowText
  13. also saves empty files
  14. uses untyped file
  15. FreeMem frees Len+1, not Len
  16. AskSave() added *
  17. NewText() added *
  18. WindowProc():
  19. WM_Close added
  20. WM_Size don't assumes StatH=16
  21. WM_Command 101 calls NewText
  22. WM_Command 102 calls LoadText
  23. WM_Command 104 issues a WM_Close instead of doing a Halt
  24. WinRegister():
  25. with structure used
  26. EditCreate():
  27. takes Status object as parameter
  28. const EditText changed to empty string
  29. unused variable DC removed
  30. WS_HScroll & WS_VScroll added to const CS_Start
  31. ES_AutoHScroll & ES_AutoVScroll removed from CS_Start
  32. don't assumes StatH=16
  33. AddText() commented out
  34. WinCreate():
  35. menu creation moved inside if structure
  36. Options menu item uses the newly created SubMenu
  37. main:
  38. slight structure change (avoid unneccesary Exit)
  39. call to StatusCreate before EditCreate
  40. 2do:
  41. make edit panel always active
  42. add 3d inner bevel to edit panel
  43. window background color : white
  44. only ask to save if edited
  45. cut
  46. copy
  47. paste
  48. settings
  49. help
  50. }
  51. Program menudemo;
  52. {$APPTYPE GUI}
  53. {$MODE DELPHI}
  54. Uses Strings,Windows;
  55. Const AppName = 'MenuDemo';
  56. Var AMessage: Msg;
  57. hWindow,hStatus,Hedit: HWnd;
  58. WindowClass: WndClass;
  59. Menu: hMenu;
  60. Const
  61. EditMenus: Array[201..203] Of pchar = ('Cut','copy','paste');
  62. Type
  63. TFileName = Array[0..Max_Path] Of Char;
  64. Function SelectFile(Var FName:TFileName; Open:Boolean): Boolean;
  65. Const
  66. Filter: PChar = 'Text files (*.txt)'#0'*.txt'#0'All files (*.*)'#0'*.*'#0;
  67. Ext: PChar = 'txt';
  68. Var
  69. NameRec: OpenFileName;
  70. Begin
  71. FillChar(NameRec,SizeOf(NameRec),0);
  72. FName[0] := #0;
  73. With NameRec Do
  74. Begin
  75. LStructSize := SizeOf(NameRec);
  76. HWndOwner := HWindow;
  77. LpStrFilter := Filter;
  78. LpStrFile := @FName;
  79. NMaxFile := Max_Path;
  80. Flags := OFN_Explorer Or OFN_HideReadOnly;
  81. If Open Then
  82. Begin
  83. Flags := Flags Or OFN_FileMustExist;
  84. End;
  85. LpStrDefExt := Ext;
  86. End;
  87. If Open Then
  88. SelectFile := GetOpenFileName(@NameRec)
  89. Else
  90. SelectFile := GetSaveFileName(@NameRec);
  91. End;
  92. Procedure SaveText;
  93. Var Len: Longint;
  94. P: PChar;
  95. F: File;
  96. FName: TFileName;
  97. Begin
  98. If SelectFile(FName,False) Then
  99. Begin
  100. Assign(F,@FName);
  101. Rewrite(F,1);
  102. Len := GetWindowTextLength(HEdit);
  103. GetMem(P,Len+1);
  104. P[Len] := #0;
  105. If Len>0 Then
  106. Begin
  107. GetWindowText(HEdit,P,Len+1);
  108. BlockWrite(F,P^,Len);
  109. End;
  110. Close(F);
  111. FreeMem(P,Len+1);
  112. End;
  113. End;
  114. Procedure AskSave;
  115. Begin
  116. If MessageBox(HWindow,'Save text?','Edited',MB_IconQuestion Or MB_YesNo)=IdYes Then
  117. Begin
  118. SaveText;
  119. End;
  120. End;
  121. Procedure LoadText;
  122. Var
  123. FName: TFileName;
  124. F: File;
  125. Len: LongInt;
  126. P: PChar;
  127. Begin
  128. AskSave;
  129. If SelectFile(FName,True) Then
  130. Begin
  131. Assign(F,@FName);
  132. Reset(F,1);
  133. Len := FileSize(F);
  134. GetMem(P,Len+1);
  135. P[Len] := #0;
  136. If Len>0 Then BlockRead(F,P^,Len);
  137. Close(F);
  138. SetWindowText(HEdit,P);
  139. FreeMem(P,Len+1);
  140. End;
  141. End;
  142. Procedure NewText;
  143. Const
  144. Empty: PChar = '';
  145. Begin
  146. AskSave;
  147. SendMessage(HEdit,WM_SetText,1,LongInt(Empty));
  148. End;
  149. Function WindowProc (Window:HWnd;AMessage : UINT; WParam : WParam; LParam:LParam): LResult;
  150. stdcall;
  151. export;
  152. Var ps: paintstruct;
  153. r: rect;
  154. StatH: Word;
  155. nrmenu : longint;
  156. Begin
  157. WindowProc := 0;
  158. Case AMessage Of
  159. wm_Paint:
  160. Begin
  161. BeginPaint(Window,@ps);
  162. GetClientRect(Window,@r);
  163. EndPaint(Window,ps);
  164. Exit;
  165. End;
  166. wm_Close:
  167. Begin
  168. AskSave;
  169. End;
  170. wm_Destroy:
  171. Begin
  172. PostQuitMessage (0);
  173. Exit;
  174. End;
  175. wm_Size:
  176. Begin
  177. if HStatus<>0 then
  178. begin
  179. GetClientRect(HStatus,@R);
  180. StatH := R.Bottom-R.Top;
  181. GetClientRect(Window,@R);
  182. MoveWindow (hStatus,r.left,r.bottom-StatH,r.right,r.bottom,true);
  183. if HEdit<>0 then
  184. MoveWindow (HEdit,0,0,r.right-r.left,r.bottom-r.top-StatH,true);
  185. end;
  186. End;
  187. wm_Command:
  188. Begin
  189. NrMenu := WParam And $FFFF;
  190. Case NrMenu Of
  191. 101 : NewText;
  192. 102 : LoadText;
  193. 103 : SaveText;
  194. 104 : PostMessage(Window,WM_Close,0,0);
  195. 201..203: MessageBox(Window,EditMenus[NrMenu],
  196. 'Edit operation not implemented',MB_OK Or
  197. MB_IconInformation);
  198. End;
  199. End;
  200. End;
  201. WindowProc := DefWindowProc(Window,AMessage,WParam,LParam);
  202. End;
  203. Function WinRegister: Boolean;
  204. Begin
  205. With WindowClass Do
  206. Begin
  207. Style := cs_hRedraw Or cs_vRedraw;
  208. lpfnWndProc := WndProc(@WindowProc);
  209. cbClsExtra := 0;
  210. cbWndExtra := 0;
  211. hInstance := system.MainInstance;
  212. hIcon := LoadIcon (0,idi_Application);
  213. hCursor := LoadCursor (0,idc_Arrow);
  214. hbrBackground := GetStockObject(GRAY_BRUSH);
  215. lpszMenuName := 'Files';
  216. lpszClassName := AppName;
  217. End;
  218. Result := RegisterClass (WindowClass)<>0;
  219. End;
  220. Function EditCreate(ParentWindow,Status:HWnd): HWnd;
  221. Const
  222. CS_Start = WS_Child or WS_HScroll or WS_VScroll or ES_MultiLine or ES_Left;
  223. EdiTText: PChar = '';
  224. Var
  225. HEdit: HWND;
  226. R: TRect;
  227. StatH: Word;
  228. { rev 1.5 : comment out
  229. Procedure AddText (S:String);
  230. begin
  231. S:=S+#0;
  232. SendMessage(HEdit,em_replacesel,0,longint(pchar(@S[1])));
  233. end;
  234. }
  235. Begin
  236. GetClientRect(Status,@R);
  237. StatH := R.Bottom-R.Top;
  238. GetClientRect(ParentWindow,@R);
  239. HEdit := CreateWindow ('EDIT',EditText,CS_Start,0,0,
  240. R.Right-R.Left,R.Bottom-R.top-StatH,ParentWindow,0,
  241. System.MainInstance,Nil);
  242. If HEdit<>0 Then
  243. Begin
  244. ShowWindow(Hedit,cmdShow);
  245. UpdateWindow(HEdit);
  246. End;
  247. Result := HEdit;
  248. End;
  249. Function WinCreate: HWnd;
  250. Var hWindow: HWnd;
  251. SubMenu: hMenu;
  252. Begin
  253. hWindow := CreateWindow (AppName,'MenuDemo',ws_OverlappedWindow,
  254. cw_UseDefault,cw_UseDefault,cw_UseDefault,
  255. cw_UseDefault,0,0,system.MainInstance,Nil);
  256. If hWindow<>0 Then
  257. Begin
  258. Menu := CreateMenu;
  259. SubMenu := CreateMenu;
  260. AppendMenu(Submenu,MF_STRING,101,'&New...');
  261. AppendMenu(Submenu,MF_STRING,102,'&Open...');
  262. AppendMenu(Submenu,MF_STRING,103,'&Save...');
  263. AppendMenu(Submenu,MF_SEPARATOR,0,Nil);
  264. AppendMenu(SubMenu,MF_String,104,'E&xit');
  265. AppendMenu(Menu,MF_POPUP,SubMenu,'&Files');
  266. SubMenu := CreateMenu;
  267. AppendMenu(SubMenu,MF_String,201,'&Cut');
  268. AppendMenu(SubMenu,MF_String,202,'&Copy');
  269. AppendMenu(SubMenu,MF_STRING,203,'&Paste');
  270. AppendMenu(Menu,MF_POPUP,SubMenu,'&Edit');
  271. SubMenu := CreateMenu;
  272. AppendMenu(SubMenu,MF_String,301,'&Settings');
  273. AppendMenu(Menu,MF_POPUP,SubMenu,'&Options');
  274. AppendMenu(Menu,MF_STRING,0,'&Help');
  275. SetMenu(hWindow,menu);
  276. ShowWindow(hWindow,CmdShow);
  277. ShowWindow(hWindow,SW_SHOW);
  278. UpdateWindow(hWindow);
  279. End;
  280. Result := hWindow;
  281. End;
  282. Function StatusCreate (parent:hwnd): HWnd;
  283. Begin
  284. StatusCreate := CreateStatusWindow (WS_CHILD Or WS_VISIBLE,'Ready...',parent,$7712);
  285. End;
  286. Begin
  287. If Not WinRegister Then
  288. Begin
  289. MessageBox (0,'Register failed',Nil, mb_Ok);
  290. End
  291. Else
  292. Begin
  293. hWindow := WinCreate;
  294. If longint(hWindow)=0 Then
  295. Begin
  296. MessageBox (0,'WinCreate failed',Nil,MB_OK);
  297. End
  298. Else
  299. Begin
  300. HStatus := statuscreate(hwindow);
  301. HEdit := EditCreate(HWindow,HStatus);
  302. While GetMessage(@AMessage,0,0,0) Do
  303. Begin
  304. TranslateMessage(AMessage);
  305. DispatchMessage(AMessage);
  306. End;
  307. Halt(AMessage.wParam);
  308. End;
  309. End;
  310. End.