|
テクニカルノート27: APIを使ってPopupフォームとDialogを作成Jan 27, 2000© NSB Corporation. All rights reserved. |
Go to English page.
Alex Yakhnin 氏(Software Developer, Morganville, NJ) による寄稿。概要
NS Basic Visual Designerは、配列にコントロールを割当て、実行時にそれらのコントロールを見せたり隠したりすることで、異なったユ論理的なユフォームを作成するのを可能にします。しかしこれらの論理的なフォームは、スクリーン全体を占有しないPopupフォームやDialogを可能にしてくれません。この記事のの目的は、APIオブジェクト(MGCEWin32.API)を使用して、この機能をどう実行するかを見せることです。
詳細
Windowsオペレーティングシステムに於けるほぼ全てのオブジェクトは、ウインドウです。すなわち、 forms, buttons, labels, textboxes etc...であり、特定の属性やスタイルを兼ねて作成されます。しかし、実行時にそれらのウインドウスタイルを変更して、アプリケーションにあわせた見た目や動作を得ることは可能です。MGCEWin32.APIオブジェクトは、SetWindowLong および GetWindowLong のAPI呼出しを包括した .WindowLongメソッドを実行します。Popupフォームを作成する行程は、既にあるコントロールを変更してフォームの様に動くようにし、そしてそのフォーム上に見せたい他の全てのコントロールをそれに割当てます。これらのコントロールのユparentユを変えながら、APIオブジェクトのWindowParentメソッドを使用することで、この行程の後半を達成することが出来ます。Labelコントロールがユparentユフォームの最も適したものだと思います。さて十分準備出来たので、文字列を検索する簡単なpopupフォームを作成してみましょう。
Sample 1
Option Explicit 'Window styles Const WS_BORDER = &H800000 Const WS_CAPTION = &HC00000 Const WS_SYSMENU = &H80000 Const WS_POPUP = &H80000000 Const WS_THICKFRAME = &H40000 Const WS_MINIMIZEBOX = &H20000 Const WS_MAXIMIZEBOX = &H10000 'Extended window styles Const WS_EX_WINDOWEDGE = &H100& Const WS_EX_HELP = &H400& Const WS_EX_OKBUT = &H80000000 ' Style Flags Const GWL_STYLE = (-16) Const GWL_EXSTYLE = (-20) 'Add objects AddObject "MGCEWin32.API", "API",0,0,0,0 AddObject "Label","frmFind", 10,10,160,140 frmFind.BackColor = 12632256 'Grey Dim Controls Controls_Load Call CreateForm("Find Text") Sub Controls_Load IF Not IsEmpty(Controls) Then Exit Sub ReDim Controls(4) ADDOBJECT "Label", "lblFind", 20, 10, 115, 18 SET Controls(1) = lblFind Controls(1).BackColor = 12632256 Controls(1).Caption = "Enter Text:" '-------- ADDOBJECT "TextBox", "txtFind", 20, 40, 115, 18 SET Controls(2) = txtFind Controls(2).BorderStyle = 1 '-------- ADDOBJECT "CommandButton", "cmdOK", 10, 70, 55, 18 SET Controls(3) = cmdOK Controls(3).BackColor = 12632256 Controls(3).Caption = "&OK" '-------- ADDOBJECT "CommandButton", "cmdCancel", 90, 70, 55, 18 SET Controls(4) = cmdCancel Controls(4).BackColor = 12632256 Controls(4).Caption = "&Cancel" End Sub Sub CreateForm(sCaption) Dim i 'Change the style of the Label API.WindowLong(frmFind.hWnd, GWL_STYLE) = WS_CAPTION ' Make 3D borders API.WindowLong(frmFind.hWnd, GWL_EXSTYLE) = WS_EX_WINDOWEDGE 'Make it TopMost in the Z-Order API.TopMost(frmFind.hWnd) = True 'Assign frmFind as a parent to controls For i = 1 to UBound(Controls) API.WindowParent(Controls(i).hWnd) = frmFind.hWnd Next 'Make original label caption unvisible frmFind.ForeColor = frmFind.BackColor 'Set Caption Text frmFind.Caption = sCaption End Sub Sub cmdOK_Click frmFind.Hide MsgBox txtFind.Text End Sub Sub cmdCancel_Click frmFind.Hide End Sub Sub frmFind_Click print "frmFind_Click" End Sub '---------------------------------------------------------------------
それでは、面白い部分に入ってみましょう。
もしWS_SYSMENU, WS_MINIMIZEBOX および WS_MAXIMIZEBOX をフォームのstyleに追加し、WS_EX_OKBUTをextended styleに追加すると、
API.WindowLong(frmFind.hWnd, GWL_STYLE) = WS_CAPTION Or WS_SYSMENU or WS_MINIMIZEBOX or WS_MAXIMIZEBOX API.WindowLong(frmFind.hWnd, GWL_EXSTYLE) = WS_EX_WINDOWEDGE Or WS_EX_OKBUT
結果は、"OK"、"最大化"、"クローズ"ボタンを持つことが出来ます。
これらのボタンは実際に動きます!さらに"OK"ボタンのクリックを捕える事が出来ます:frmFind_Clickイベントが動作します。しかし、"X"(クローズ)ボタンに問題があります:このボタンをクリックすると、我々のフォームはWindowsによって壊されますが、クリーンアップをするチャンスを与えてくれず、このイベントを捕まえることも不可能です。さらに、我々のアプリケーションはコントロールが壊された事を知ることはない為、同じ名前で再度作成することは出来ません。ですから、この機能はお勧め出来ません。
Alex Yakhnin, Software Developer, Morganville, NJ