Winmain, wndproc, createwindow, wndclass, boucle de message dans votre fichier projet delphi (.dpr)

Soyez le premier à donner votre avis sur cette source.

Vue 7 027 fois - Téléchargée 463 fois

Description

Ce source montre comment écrire dans votre fichier projet DELPHI .dpr la procedure de fenêtre WndProc et le programme principal WinMain, tout comme dans un programme API écrit, par exemple, sous Borland C++ .

Au lieu de créer un "form" avec un fichier .pas, c'est le programme écrit dans WinMain qui crée votre fenêtre principale en utilisant la fonction API CreateWindow ,la structre WNDCLASS, et en utilisant le boucle de message qui envoie les événements à la procédure de fenêtre WndProc.

Il montre aussi comment utiliser un menu défini dans un fichier ressource (ressource.res).

Source / Exemple :


program WinMain;

uses
  Forms,
  Dialogs,
  Windows, SysUtils,
  Messages;

{$R *.RES}
{$R ressource.RES}   // Ressource Menu

const
    IDNEW  = 101;
    IDOPEN = 102;

function WndProc(hWnd : HWND; Msg : UINT; WParam : WPARAM; LParam: LPARAM): UINT; stdcall;
var
   hdc : Integer;
   ps : TPaintStruct;
   Rect : TRect;
begin
     case Msg of
          WM_PAINT :
          begin
              hdc := BeginPaint(hWnd, ps);
              SetBkMode(hdc, TRANSPARENT);
              GetClientRect(hWnd, Rect);
              DrawText(hdc, 'My program in Delphi with API style.', -1, Rect,
         	            DT_SINGLELINE or DT_CENTER or DT_VCENTER);
              EndPaint(hwnd, ps);
          end;
          WM_COMMAND:
          begin
               case wParam of
                    IDNEW :
                       ShowMessage('Vous avez cliqué sur "Nouveau"');
                    IDOPEN :
                       ShowMessage('Vous avez cliqué sur "Ouvrir"');
               end;
          end;
          WM_DESTROY:
             PostQuitMessage(0);
     end;
     Result := DefWindowProc(hwnd, Msg, wParam, lParam);
end;

var
   Msg : TMsg;
   hwnd, hAccel : Integer;
   szAppName : LPSTR = 'lpFetraDelphi';
   nCmdShow : Integer = SW_SHOWNORMAL;
   TempClass, UtilWindowClass : TWndClass;
   ClassRegistered : Boolean;
begin

     with UtilWindowClass do
     begin
          style           := CS_HREDRAW or CS_VREDRAW;
          lpfnWndProc     := @DefWindowProc;
          cbClsExtra      := 0;
          cbWndExtra      := 0;
          hInstance       := 0;
          hIcon           := LoadIcon(0, IDI_APPLICATION);
          hCursor         := LoadCursor(0, IDC_ARROW);
          hbrBackground   := GetStockObject(WHITE_BRUSH);
          lpszMenuName    := 'FETRA';    // Menu dans le ressource.res
          lpszClassName   := szAppName;
     end;

     UtilWindowClass.hInstance := hInstance;
     ClassRegistered := GetClassInfo(hInstance, UtilWindowClass.lpszClassName, TempClass);
     if not ClassRegistered or (TempClass.lpfnWndProc <> @DefWindowProc) then
     begin
          if ClassRegistered then
             Windows.UnregisterClass(UtilWindowClass.lpszClassName, hInstance);
     end;

     Windows.RegisterClass(UtilWindowClass);

     // Créer la fenêtre principale
     hWnd := CreateWindow(UtilWindowClass.lpszClassName,
             '',
             WS_OVERLAPPEDWINDOW,
             CW_USEDEFAULT,
             CW_USEDEFAULT,
             CW_USEDEFAULT,
             CW_USEDEFAULT,
             0,
             0,
             hInstance,
             nil);

     // Procédure de fenêtre
     SetWindowLong(hwnd, GWL_WNDPROC, LongInt(@WndProc));

     // Titre de la fenêtre
     SetWindowText(hwnd, 'Création dynamique de Form en Delphi');

     ShowWindow(hwnd, nCmdShow);
     UpdateWindow(hwnd);

     // Boucle de message
     while (GetMessage(Msg, 0, 0, 0)) do
     begin
          TranslateMessage(Msg);
          DispatchMessage (Msg);
     end;

end.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Commenter la réponse de cs_koko

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.