ab.com コミュニティ https://www.activebasic.com/forum/ |
|
スクロールバー・コントロールについて。 https://www.activebasic.com/forum/viewtopic.php?t=2545 |
ページ 1 / 1 |
作成者: | 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)を再び実行すると その瞬間キチンと無効化されるんです。 全く同じ命令を初回表示時にもやっているんですが。。 簡略化したプログラムを下に書いておきます。 スクロールバーコントロールの初回無効化表示について、お気づきのことが ありましたら是非教えて下さい。 ここにプログラムが表示されます。 [ここをクリックすると内容が表示されます]
コード: '----------------------------------------------------------------------------- ' イベント プロシージャ '----------------------------------------------------------------------------- ' このファイルには、ウィンドウ [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 |
作成者: | 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ただしこれでもダメ。。 |
ページ 1 / 1 | 全ての表示時間は UTC+09:00 です |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |