worldXV
□□□□□□□□
□□□□□□□□
□□□□□□□□
□□□□□□□□
□□□□□□□□ worldYV
□□□□□□□□
□□□□□□□□
□□□□□□□□
screenXV
■■■■
■■■■
■■■■ screenYV
■■■■
上図のようにworldXV,YVで用意されたビットマップの一部を
下のscreenXV,YVで示された領域にクリップ表示したいとします。
このときscreenXV,YVの各辺にそれぞれヨコ、タテのスクロールバー・
コントロールがあり、それを操作することでビットマップを隅々まで
見られるようにしたいと思います。(とりあえずここでは簡単化のため
X方向成分は考えずY方向についてだけ考えます。)
screenYVにあるタテ・スクロールバーにセットする情報
SCROLLINFO構造体の「vertSi」を以下のようにセットすると上手く出来ました。
vertSi.cbSize = SizeOf(SCROLLINFO)
vertSi.fMask = SIF_POS Or SIF_RANGE Or SIF_PAGE Or SIF_DISABLENOSCROLL
vertSi.nMin = 0
vertSi.nMax = worldYV
vertSi.nPos = 0
vertSi.nPage = screenYV+1
そして
SetScrollInfo(hVScrollBar1, SB_CTL, vertSi, TRUE)
でスクロールバーを更新表示。
ここまでは良かったのですが、
つまづいたのは、もしworldYVとscreenYVが同じか、もしくはworldYVの
方が小さいケースの時です。
この時スクロールの必要はないのでスクロールバーは無効状態に
なって欲しいのですが(※SIF_DISABLENOSCROLLをセットしてあるので消えずに)
同様に実行すると
"可動範囲がゼロ"のギチギチ状態のスクロールバーが代わりに表示されてしまいます。
普通このようなスクロールバーを見ることはないので明らかにおかしいというのは
分かるのですが、ただしどうすれば良いか分からず。
あれこれ考えつつRADツールのこのスクロールバーのスタイル設定で予め
「無効」にチェックを入れてみたりもしたんですがこれも良い方法ではないと
分かり。。(それをチェックすると今度は常時無効化されて表示されてしまう)
どうすればいいか悩んでいます。
暫くあれこれ試していて、不思議なことに、遊びでくっつけていたコマンドボタンからの
クリックで SetScrollInfo(hVScrollBar1, SB_CTL, vertSi, TRUE)を再び実行すると
その瞬間キチンと無効化されるんです。
全く同じ命令を初回表示時にもやっているんですが。。
簡略化したプログラムを下に書いておきます。
スクロールバーコントロールの初回無効化表示について、お気づきのことが
ありましたら是非教えて下さい。
ここにプログラムが表示されます。 [ここをクリックすると内容が表示されます]
コード: 全て選択
'-----------------------------------------------------------------------------
' イベント プロシージャ
'-----------------------------------------------------------------------------
' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。
' ウィンドウ ハンドル: hMainWnd
' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。
'
Dim worldYV=200 As Long
Dim screenYV=200 As Long
' スクロール用変数定義
Dim hVScrollBar1 As HWND
Dim vertSi As SCROLLINFO
'-----------------------------------------------------------------------------
' ウィンドウメッセージを処理するためのコールバック関数
Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。
' イベントプロシージャの呼び出しを行います。
MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function
'-----------------------------------------------------------------------------
' ここから下は、イベントプロシージャを記述するための領域になります。
Sub MainWnd_Destroy()
ScrollBar_AppearenceTest_DestroyObjects()
PostQuitMessage(0)
End Sub
'
'●クリエイト・イベント
'
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
'スクロールバーの位置と大きさを補正
hVScrollBar1=GetDlgItem(hMainWnd,VScrollBar1)
MoveWindow(hVScrollBar1,64,32, 32,screenYV,FALSE)
vertSi.cbSize = SizeOf(SCROLLINFO)
vertSi.fMask = SIF_POS Or SIF_RANGE Or SIF_PAGE Or SIF_DISABLENOSCROLL
vertSi.nMin = 0
vertSi.nMax = worldYV
vertSi.nPos = 0
vertSi.nPage = screenYV+1
SetScrollInfo(hVScrollBar1, SB_CTL, vertSi, TRUE)
End Sub
'
'●ボタン1クリック・イベント
'
Sub MainWnd_CommandButton1_Click()
SetScrollInfo(hVScrollBar1, SB_CTL, vertSi, TRUE)
End Sub