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

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"、"最大化"、"クローズ"ボタンを持つことが出来ます。

sample

これらのボタンは実際に動きます!さらに"OK"ボタンのクリックを捕える事が出来ます:frmFind_Clickイベントが動作します。しかし、"X"(クローズ)ボタンに問題があります:このボタンをクリックすると、我々のフォームはWindowsによって壊されますが、クリーンアップをするチャンスを与えてくれず、このイベントを捕まえることも不可能です。さらに、我々のアプリケーションはコントロールが壊された事を知ることはない為、同じ名前で再度作成することは出来ません。ですから、この機能はお勧め出来ません。

Alex Yakhnin, Software Developer, Morganville, NJ