ab.com コミュニティ
https://www.activebasic.com/forum/

スクロールバー・コントロールについて。
https://www.activebasic.com/forum/viewtopic.php?t=2545
ページ 11

作成者:  jacoby [ 2009年1月22日(木) 22:50 ]
記事の件名:  スクロールバー・コントロールについて。

スクロールバー・コントロールについて教えて下さい。

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)を再び実行すると
その瞬間キチンと無効化されるんです。
全く同じ命令を初回表示時にもやっているんですが。。

 簡略化したプログラムを下に書いておきます。

スクロールバーコントロールの初回無効化表示について、お気づきのことが
ありましたら是非教えて下さい。

作成者:  jacoby [ 2009年1月26日(月) 00:53 ]
記事の件名:  何故?

とりあえずRADの「無効」のチェックで無効化されるのなら
それと同じことをクリエイト部の中でも出来ないかと、
コード:
'
'●クリエイト・イベント
'
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)


'スクロールバーのスタイルにWS_DISABLEDを強引にセットしてみる。
 SetWindowLong(hVScrollBar1,GWL_STYLE,GetWindowLong(hVScrollBar1,GWL_STYLE) Or WS_DISABLED)
 SetWindowPos(hVScrollBar1,NULL,0,0,0,0,SWP_NOMOVE Or SWP_NOSIZE Or SWP_NOZORDER Or SWP_FRAMECHANGED)

End Sub
とやってみたんですが、これでも変わらず。。

作成者:  jacoby [ 2009年1月26日(月) 02:18 ]
記事の件名: 

"コマンドボタンからのクリックで SetScrollInfo(hVScrollBar1, SB_CTL, vertSi, TRUE)を再び実行するとその瞬間キチンと無効化される"のなら、と
今度はクリエイト部の中でSetScrollInfoを二度書いてみたのですが、
コード:
' 
'●クリエイト・イベント 
' 
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) 

 SetScrollInfo(hVScrollBar1, SB_CTL, vertSi, TRUE) '<---繰り返して書いてみる。

End Sub 
ただしこれでもダメ。。

ページ 11 全ての表示時間は UTC+09:00 です
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/