ページ 1 / 1
はじめまして、マルチディスプレイ環境で利用できるでしょうか
Posted: 2007年1月18日(木) 20:29
by 初心者
突然失礼します。ずっと昔、MSのQuickBasicやVBを少し使ったことがあるのですが、
どんどん複雑になっているようだし、簡単なデータ表示をしたいだけなので
良い方法がないかと探していてこちらに行き当たりました。解説を少し読んでいて、
こちらのソフトの昔のバージョンも少し試したことがあるような気がしています。
詳しい方に私の希望しているようなことが可能か教えていただければと思います。
マルチディスプレイの環境での使用を考えています。入力用のディスプレイと
その結果を反映した出力用のディスプレイを利用したいのですが、マイクロソフトに
アクセスでの実現を尋ねたら、アクセスはマルチウィンドウを考慮していないそうで、
別のディスプレイに別の表示を用意できないと言われてしまいました。
処理したい内容は、データベースのデータの選択作業をAのディスプレイで行い、
その結果の履歴をBのディスプレイに表示していきたいと思っています。
データベースといっても、基本のランダム・ファイルと履歴のシーケンシャル・
ファイルを管理するだけで、複雑な処理をするわけではありません。
複数のウィンドウを扱うことは出来ると思うのですが、それを希望のディスプレイで
それぞれ全画面表示させるような指定はできるのでしょうか。
ActivBasicでうまく実現できたら、とても嬉しいのですが‥‥。
よろしくお願いいたします。
Posted: 2007年1月21日(日) 02:29
by 高信期
シングルモニターな環境なので動作確認をできたわけではありませんが、
ボタンを押すごとにウィンドウが次のモニターの中心へ移動するサンプルを作ってみました。
使用したAPIは EnumDisplayMonitors, GetMonitorInfo(A)関数です。
参考にしてください。
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
'-----------------------------------------------------------------------------
' イベント プロシージャ
'-----------------------------------------------------------------------------
' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。
' ウィンドウ ハンドル: hMainWnd
' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。
'モニター用API関数の宣言
TypeDef HMONITOR = HANDLE
TypeDef MONITORENUMPROC = *Function(hm As HMONITOR, DC As HDC, PRect As *RECT, Data As VoidPtr) As BOOL
Declare Function EnumDisplayMonitors Lib "user32.dll" _
(ByVal hdc As Long, lprcClip As *RECT, ByVal lpfnEnum As MONITORENUMPROC, ByVal dwData As VoidPtr) As Long
Type tagMONITORINFOA
cbSize As DWord
rcMonitor As RECT
rcWork As RECT
dwFlags As DWord
End Type
TypeDef MONITORINFOA = tagMONITORINFOA
Declare Function GetMonitorInfoA Lib "user32.dll" _
(ByVal hMonitor As HANDLE, ByRef lpmi As MONITORINFOA) As Long
'宣言ここまで
Const MaxMonitorCount = 10 '最大モニター取得数。ここでは10個まで
Dim MonitorHandles[ELM(MaxMonitorCount)] As HANDLE 'モニターハンドル格納
Dim MonitorCount = 0 As Long 'モニターの数
Dim CurrentMonitor = 0 As Long '現在ウィンドウが表示されているモニター
'モニターを数え上げ、同時にモニターハンドルを取得する
Function EnumMonitorsProc(hm As HMONITOR, DC As HDC, PRect As *RECT, Data As VoidPtr) As BOOL
MonitorHandles[MonitorCount] = hm
MonitorCount++
If MonitorCount < MaxMonitorCount Then
Return TRUE
Else
Return FALSE
End If
End Function
'-----------------------------------------------------------------------------
' ウィンドウメッセージを処理するためのコールバック関数
Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As LRESULT
' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。
' イベントプロシージャの呼び出しを行います。
MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function
'-----------------------------------------------------------------------------
' ここから下は、イベントプロシージャを記述するための領域になります。
Sub MainWnd_Destroy()
Moniter_DestroyObjects()
PostQuitMessage(0)
End Sub
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
'メインウィンドウ作成と同時にモニターを数え上げる
'第一引数、第二引数を共にNULLとするとすべてのモニターを列挙するらしい。
EnumDisplayMonitors(NULL, NULL, AddressOf(EnumMonitorsProc), NULL)
End Sub
Sub MainWnd_CommandButton1_Click()
Dim MonitorInfo As MONITORINFOA 'モニター情報
Dim MainWndRect As RECT 'メインウィンドウの四隅座標
Dim NextX As Long, NextY As Long '次へ移動する座標
'次に移動するモニター番号の設定
CurrentMonitor++
'もし最後のモニタであればプライマリモニターにする
If CurrentMonitor = MonitorCount Then CurrentMonitor = 0
'お約束
MonitorInfo.cbSize = SizeOf(MONITORINFOA)
'モニターの情報を取得
GetMonitorInfoA(MonitorHandles[CurrentMonitor], MonitorInfo)
'現在のメインウィンドウの四隅座標を取得
GetWindowRect(hMainWnd, MainWndRect)
'メインウィンドウの位置を移動するモニターの中心に持っていく
NextX = ((MonitorInfo.rcMonitor.right - MonitorInfo.rcMonitor.left) - _
(MainWndRect.right - MainWndRect.left)) \ 2
NextY = ((MonitorInfo.rcMonitor.bottom - MonitorInfo.rcMonitor.top) - _
(MainWndRect.bottom - MainWndRect.top)) \ 2
'実際に移動
SetWindowPos(hMainWnd, 0, NextX, NextY, 0, 0, SWP_NOSIZE Or SWP_NOZORDER)
End Sub