ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年3月28日(木) 21:08

全ての表示時間は UTC+09:00 です




新しいトピックを投稿する  トピックへ返信する  [ 3 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2009年1月22日(木) 22:50 
オフライン

登録日時: 2006年6月02日(金) 18:20
記事: 106
スクロールバー・コントロールについて教えて下さい。

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

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

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


通報する
ページトップ
 記事の件名: 何故?
投稿記事Posted: 2009年1月26日(月) 00:53 
オフライン

登録日時: 2006年6月02日(金) 18:20
記事: 106
とりあえず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
とやってみたんですが、これでも変わらず。。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2009年1月26日(月) 02:18 
オフライン

登録日時: 2006年6月02日(金) 18:20
記事: 106
"コマンドボタンからのクリックで 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 
ただしこれでもダメ。。


通報する
ページトップ
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 3 件の記事 ] 

全ての表示時間は UTC+09:00 です


オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[17人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
cron
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean