menu.pp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. {
  2. $Id$
  3. Copyright (c) 1999 by Michael van Canneyt
  4. Win32 menu creation example.
  5. }
  6. program menu;
  7. {$APPTYPE GUI}
  8. {$MODE DELPHI}
  9. uses Strings,Windows;
  10. const AppName='MenuDemo';
  11. var AMessage:Msg;
  12. hWindow,hStatus,Hedit : HWnd;
  13. WindowClass:WndClass;
  14. menu:hMenu;
  15. Const FileMenus : Array[101..104] of pchar = ('New','Open','Save','Exit');
  16. EditMenus : Array[201..203] of pchar = ('Cut','copy','paste');
  17. function WindowProc (Window:HWnd;AMessage,WParam,LParam:Longint):Longint;
  18. stdcall; export;
  19. var dc:hdc;
  20. ps:paintstruct;
  21. r:rect;
  22. nrmenu : longint;
  23. begin
  24. WindowProc:=0;
  25. case AMessage of
  26. wm_paint:
  27. begin
  28. dc:=BeginPaint (Window,@ps);
  29. GetClientRect (Window,@r);
  30. EndPaint (Window,ps);
  31. Exit;
  32. end;
  33. wm_Destroy:
  34. begin
  35. PostQuitMessage (0);
  36. Exit;
  37. end;
  38. wm_Size:
  39. begin
  40. GetClientRect (Window,@r);
  41. MoveWindow (hStatus,r.left,r.bottom-16,r.right,r.bottom,true);
  42. MoveWindow (HEdit,0,0,r.right-r.left,r.bottom-r.top-16,true);
  43. end;
  44. wm_command:
  45. begin
  46. NrMenu:=WParam and $FFFF;
  47. Case NrMenu of
  48. 104 : Halt(0);
  49. 101..103: MessageBox(Window,FileMenus[NrMenu],'File Menu click received',MB_OK or MB_ICONINFORMATION);
  50. 201..203: MessageBox(Window,EditMenus[NrMenu],'Edit operation not implemented',MB_OK or MB_ICONINFORMATION);
  51. end;
  52. end;
  53. end;
  54. WindowProc:=DefWindowProc (Window,AMessage,WParam,LParam);
  55. end;
  56. function WinRegister:Boolean;
  57. begin
  58. WindowClass.Style:=cs_hRedraw or cs_vRedraw;
  59. WindowClass.lpfnWndProc:=WndProc(@WindowProc);
  60. WindowClass.cbClsExtra:=0;
  61. WindowClass.cbWndExtra:=0;
  62. WindowClass.hInstance:=system.MainInstance;
  63. WindowClass.hIcon:=LoadIcon (0,idi_Application);
  64. WindowClass.hCursor:=LoadCursor (0,idc_Arrow);
  65. WindowClass.hbrBackground:=GetStockObject(GRAY_BRUSH);
  66. WindowClass.lpszMenuName:='Files';
  67. WindowClass.lpszClassName:=AppName;
  68. Result:=RegisterClass (WindowClass)<>0;
  69. end;
  70. Const
  71. CS_Start = ES_AUTOHSCROLL OR ES_AUTOVSCROLL OR ES_MULTILINE;
  72. CS_OFF = CS_OWNDC or CS_CLASSDC or CS_GLOBALCLASS;
  73. CS_ON = CS_VREDRAW or CS_HREDRAW or CS_PARENTDC or WS_CHILD;
  74. EdiTText : Pchar = 'This is an edit text...';
  75. Function EditCreate (ParentWindow : HWnd) : HWnd;
  76. Var
  77. hedit : HWND;
  78. R : TRect;
  79. DC : HDC;
  80. begin
  81. GetClientRect(ParentWindow,@r);
  82. HEdit:=CreateWindow ('EDIT',EditText, CS_START AND NOT CS_OFF OR CS_ON,
  83. 0,0,R.RIght-R.Left,R.Bottom-R.top-16,ParentWindow,0,system.MainInstance,nil);
  84. If Hedit<>0 then begin
  85. showwindow(Hedit,cmdShow);
  86. updateWindow(HEdit);
  87. end;
  88. Result:=HEdit;
  89. dc:=getwindowdc(Hedit);
  90. settextalign (dc,DT_Left);
  91. end;
  92. function WinCreate:HWnd;
  93. var hWindow:HWnd;
  94. submenu : hmenu;
  95. begin
  96. hWindow:=CreateWindow (AppName,'MenuDemo',
  97. ws_OverlappedWindow,cw_UseDefault,cw_UseDefault,
  98. cw_UseDefault,cw_UseDefault,0,0,system.MainInstance,nil);
  99. menu:=CreateMenu;
  100. submenu:=createmenu;
  101. AppendMenu (submenu,MF_STRING,101,'&New...');
  102. AppendMenu (submenu,MF_STRING,102,'&Open...');
  103. AppendMenu (Submenu,MF_STRING,103,'&Save...');
  104. AppendMenu (Submenu,MF_SEPARATOR,0,Nil);
  105. AppendMenu (SubMenu,MF_String,104,'E&xit');
  106. AppendMenu (Menu,MF_POPUP,SubMenu,'&Files');
  107. submenu:=createmenu;
  108. AppendMenu (SubMenu,MF_String,201,'&Cut');
  109. AppendMenu (SubMenu,MF_String,202,'&Copy');
  110. AppendMenu (SubMenu,MF_STRING,203,'&Paste');
  111. AppendMenu (Menu,MF_POPUP,SubMenu,'&Edit');
  112. SubMenu:=CreateMenu;
  113. AppendMenu (SubMenu,MF_STring,301,'&Settings');
  114. AppendMenu (menu,MF_STRING,0,'&Options');
  115. AppendMenu (menu,MF_STRING,0,'&Help');
  116. SetMenu (hWindow,menu);
  117. if hWindow<>0 then
  118. begin
  119. ShowWindow (hWindow,CmdShow);
  120. UpdateWindow(hWindow);
  121. end;
  122. Result:=hWindow;
  123. end;
  124. function StatusCreate (parent:hwnd):HWnd;
  125. begin
  126. StatusCreate:=CreateStatusWindow (WS_CHILD or
  127. WS_VISIBLE,'Ready...',parent,$7712);
  128. end;
  129. begin
  130. if not WinRegister then
  131. begin MessageBox (0,'Register failed',nil, mb_Ok); Exit; end;
  132. hWindow:=WinCreate;
  133. if longint(hWindow)=0 then
  134. begin
  135. MessageBox (0,'WinCreate failed',nil,mb_Ok);
  136. Exit;
  137. end
  138. Else
  139. Hedit:=EditCreate(HWindow);
  140. hstatus:=statuscreate (hwindow);
  141. while GetMessage (@AMessage,0,0,0) do
  142. begin
  143. TranslateMessage (AMessage);
  144. DispatchMessage (AMessage);
  145. end;
  146. Halt (AMessage.wParam);
  147. end.
  148. {
  149. $Log$
  150. Revision 1.2 1999-05-03 18:04:39 peter
  151. * updates
  152. }