程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Windows 編程[2] - 學習窗體生成的過程二

Windows 編程[2] - 學習窗體生成的過程二

編輯:Delphi

曾經做過一個最簡單的 Windows 程序: 新建一個 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 顯示窗口; 因為 ShowWindow 需要 CreateWindow 返回的句柄.

  在 CreateWindow 的參數中, 位置與大小與窗口標題無須多說;

  父窗口與菜單, 暫時都不需要, 先可置為 0;

  程序實例的句柄, Delphi 已經為我們准備好了: HInstance; (參見原來的說明)

  窗口樣式在前面的例子中我們使用了: WS_OVERLAPPEDWINDOW, 它代表幾種特點的組合, 表示了常規窗口.

  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; {只接受數字輸入}

 



  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved