|
|
テクニカルノート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