Windowsプログラミング[2]-フォーム生成を学習するプロセス2

6279 ワード

かつて1つの最も簡単なWindowsプログラムをしたことがあります:1つのDelphiコンソールプログラムを新設して、以下のコードを貼って、実行することができます.


program Project1;

uses Windows;

begin

  MessageBox(0,PChar('Ok!'),PChar('Title'),0);

end.


 
   
コード分析:システム関数MessageBoxはメッセージウィンドウを生成することができる.この関数はWindowsユニットから来ているので、uses Windowsが必要です.
同様に、ShellAPIユニットの下にあるShellAboutを使用してウィンドウを呼び出すこともできます.


program Project1;

uses ShellAPI;

begin

  ShellAbout(0, '    Delphi   ', 'Copyright:   ', 0);

end.


 
   
しかし、これはすべてWindowsの固定モードと固定機能のウィンドウで、もし普通のウィンドウを作成したら?
Forms.TFOrmクラスを使うという考えを一旦捨てて、すべてを最初から、つまりWindows APIから始めましょう.
考えられるコードは次のとおりです.


program Project1;

begin

  //     CreateWindow

  //     ShowWindow

end.


 
   
ShowWindow関数を認識する:


ShowWindow(

  hWnd: HWND;       {         }

  nCmdShow: Integer {  ,     }

): BOOL;



//uCmdShow      :

SW_HIDE            = 0;  {  ,              }

SW_SHOWNORMAL      = 1;  {           ,   }

SW_NORMAL          = 1;  {  SW_SHOWNORMAL}

SW_SHOWMINIMIZED   = 2;  {   ,   }

SW_SHOWMAXIMIZED   = 3;  {   ,   }

SW_MAXIMIZE        = 3;  {  SW_SHOWMAXIMIZED}

SW_SHOWNOACTIVATE  = 4;  {           ,    }

SW_SHOW            = 5;  {  SW_SHOWNORMAL}

SW_MINIMIZE        = 6;  {   ,    }

SW_SHOWMINNOACTIVE = 7;  {  SW_MINIMIZE}

SW_SHOWNA          = 8;  {  SW_SHOWNOACTIVATE}

SW_RESTORE         = 9;  {  SW_SHOWNORMAL}

SW_SHOWDEFAULT     = 10; {  SW_SHOWNORMAL}

SW_MAX             = 10; {  SW_SHOWNORMAL}


 
   
CreateWindow関数を認識する:


CreateWindow(

  lpClassName: PChar;     {      }

  lpWindowName: PChar;    {    }

  dwStyle: DWORD;         {    ,     }

  X,Y: Integer;           {  ;    X,Y     : Integer(CW_USEDEFAULT)}

  nWidth,nHeight: Integer;{  ;      、       : Integer(CW_USEDEFAULT)}}

  hWndParent: HWND;       {     }

  hMenu: HMENU;           {     }

  hInstance: HINST;       {      ,       exe    }

  lpParam: Pointer        {    ,            ,      nil}

): HWND;                  {           }



//dwStyle          :

WS_OVERLAPPED       = 0;                {     ,         }

WS_POPUP            = DWORD($80000000); {     ,     WS_CHILD     }

WS_CHILD            = $40000000;        {   ,     WS_POPUP     }

WS_MINIMIZE         = $20000000;        {     }

WS_VISIBLE          = $10000000;        {     }

WS_DISABLED         = $8000000;         {    }

WS_CLIPSIBLINGS     = $4000000;         {     ,                    ,    WS_CHILD     }

WS_CLIPCHILDREN     = $2000000;         {               ,         }

WS_MAXIMIZE         = $1000000;         {     }

WS_CAPTION          = $C00000;          {    }

WS_BORDER           = $800000;          {     }

WS_DLGFRAME         = $400000;          {     }

WS_VSCROLL          = $200000;          {      }

WS_HSCROLL          = $100000;          {      }

WS_SYSMENU          = $80000;           {      ,       WS_CAPTION}

WS_THICKFRAME       = $40000;           {    ,            }

WS_GROUP            = $20000;           {         }

WS_TABSTOP          = $10000;           {   TAB     }

WS_MINIMIZEBOX      = $20000;           {      }

WS_MAXIMIZEBOX      = $10000;           {      }

WS_TILED            = WS_OVERLAPPED;

WS_ICONIC           = WS_MINIMIZE;

WS_SIZEBOX          = WS_THICKFRAME;

WS_OVERLAPPEDWINDOW = (WS_OVERLAPPED or WS_CAPTION or WS_SYSMENU or WS_THICKFRAME or WS_MINIMIZEBOX or WS_MAXIMIZEBOX);

WS_TILEDWINDOW      = WS_OVERLAPPEDWINDOW;

WS_POPUPWINDOW      = (WS_POPUP or WS_BORDER or WS_SYSMENU);

WS_CHILDWINDOW      = (WS_CHILD);



//          :

WS_EX_DLGMODALFRAME    = 1;      {       ;      WS_CAPTION      }

WS_EX_NOPARENTNOTIFY   = 4;      {                 WM_PARENTNOTIFY   }

WS_EX_TOPMOST          = 8;      {            }

WS_EX_ACCEPTFILES      = $10;    {       }

WS_EX_TRANSPARENT      = $20;    {    ,                 }

WS_EX_MDICHILD         = $40;    {     MDI    }

WS_EX_TOOLWINDOW       = $80;    {    }

WS_EX_WINDOWEDGE       = $100;   {      }

WS_EX_CLIENTEDGE       = $200;   {      }

WS_EX_CONTEXTHELP      = $400;   {          ,     WS_MAXIMIZEBOX   WS_MINIMIZEBOX     }

WS_EX_RIGHT            = $1000;  {         }

WS_EX_LEFT             = 0;      {         , WS_EX_LEFT      }

WS_EX_RTLREADING       = $2000;  {        }

WS_EX_LTRREADING       = 0;      {        , WS_EX_LTRREADING      }

WS_EX_LEFTSCROLLBAR    = $4000;  {         ,          }

WS_EX_RIGHTSCROLLBAR   = 0;      {         , WS_EX_RIGHTSCROLLBAR      }

WS_EX_CONTROLPARENT    = $10000; {       Tab            }

WS_EX_STATICEDGE       = $20000; {              }

WS_EX_APPWINDOW        = $40000; {      ,               }

WS_EX_OVERLAPPEDWINDOW = (WS_EX_WINDOWEDGE or WS_EX_CLIENTEDGE); {        }

WS_EX_PALETTEWINDOW    = (WS_EX_WINDOWEDGE or WS_EX_TOOLWINDOW or WS_EX_TOPMOST); {    、       、   }

WS_EX_LAYERED          = $00080000; {       ,           }

WS_EX_NOINHERITLAYOUT  = $00100000; {            }

WS_EX_LAYOUTRTL        = $00400000; {       }

WS_EX_COMPOSITED       = $02000000; {                 }

WS_EX_NOACTIVATE       = $08000000; {        }


 
   
分析:
ウィンドウを表示するには、まずCreateWindowでウィンドウを作成します.ShowWindowにはCreateWindowが返すハンドルが必要だからです.
CreateWindowのパラメータでは、位置とサイズとウィンドウのタイトルは言うまでもありません.
親ウィンドウとメニューは、しばらくは必要ありません.まず0に設定できます.
プログラムの例のハンドル、Delphiはすでに私たちのために準備しました:HInstance;(
元の説明を参照 )
ウィンドウスタイルは前の例で使用しました:WS_OVERLPPEDWINDOWは、いくつかの特徴の組み合わせを代表し、通常のウィンドウを表している.
CreateWindowにはもう一つの重要なパラメータ(最初のパラメータlpClassName):ウィンドウクラスの名前があります.
Windowsでは、CreateWindowでウィンドウを作成するには、ウィンドウクラスを登録して登録する必要があります.
コントロールスタイルの参照を添付します.


ES_LEFT        = 0;     {   }

ES_CENTER      = 1;     {  }

ES_RIGHT       = 2;     {   }

ES_MULTILINE   = 4;     {  }

ES_UPPERCASE   = 8;     {   }

ES_LOWERCASE   = $10;   {   }

ES_PASSWORD    = $20;   {    }

ES_AUTOVSCROLL = $40;   {      }

ES_AUTOHSCROLL = $80;   {      }

ES_NOHIDESEL   = $100;  {        }

ES_OEMCONVERT  = $400;  {   ANSI   OEM     }

ES_READONLY    = $800;  {  }

ES_WANTRETURN  = $1000; {       }

ES_NUMBER      = $2000; {       }