menu.pp 8.8 KB

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