C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: VB.NET WM_VSCROLLが上手く使えない


(過去ログ 73 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■42558 / inTopicNo.1)  VB.NET WM_VSCROLLが上手く使えない
  
□投稿者/ A.K (3回)-(2009/10/18(Sun) 01:34:46)

分類:[VB.NET/VB2005 以降] 


環境:XP / VB2005

お世話になっております。
現在、Panelの中にPictureBoxを置き、そこに画像を表示させるプログラムを作っています。
PictureBoxは画像のサイズに合わせて伸縮するので、画像がPanelよりも大きい場合、スクロールバーが出ることになります。
このとき、マウスでのドラッグで、PictureBoxをスクロールさせたいと思い、色々と調べてみたところ、
SendMessageでWM_VSCROLL(WM_HSCROLL)を送れば良いらしいと分かりました。

そこで、
Declare Auto Function SendMessage Lib "User32" _
(ByVal hWnd As IntPtr, ByVal uMsg As UInt32, _
ByVal wParam As Int32, ByVal lParam As Int32) As Int32

Const WM_VSCROLL As UInt32 = &H115
Const WM_HSCROLL As UInt32 = &H114

Const SB_LINEUP As UInt32 = 0 '上矢印を押した
Const SB_LINEDOWN As UInt32 = 1 '下矢印を押した
Const SB_PAGEUP As UInt32 = 2 'PageUpを押した
Const SB_PAGEDOWN As UInt32 = 3 'PageDownを押した
Const SB_THUMBPOSITION As UInt32 = 4 '絶対位置へスクロール
Const SB_THUMTRACK As UInt32 = 5 'スクロールボックスを指定位置へドラッグ
Const SB_TOP As UInt32 = 6 '[HOME]キー
Const SB_BOTTMOM As UInt32 = 7 '[END]キー
Const SB_ENDSCROLL As UInt32 = 8 'スクロールが終了

とし、
  SendMessage(Me.Panel1.Handle, WM_VSCROLL, ○○, 0)

としたところ、SB_LINEUPやSB_TOPに関してはうまくいったのですが、マウスでのスクロールをどのように実現して良いか分かりません。
SB_THUMBPOSITIONかSB_THUMTRACK を使うんだろうということは分かるのですが…
いざ使った場合に、移動先のパラメータをどのようにして渡して良いか分からず詰まっています。
また、SB_ENDSCROLL(スクロールが終了)の意味や使いどころもよく分かりません。
御存知の方、教えていただければ有り難いです。

よろしくお願いします。
引用返信 編集キー/
■42568 / inTopicNo.2)  Re[1]: VB.NET WM_VSCROLLが上手く使えない
□投稿者/ たくボン (263回)-(2009/10/18(Sun) 10:57:56)
No42558 (A.K さん) に返信
>
> 環境:XP / VB2005
>
> お世話になっております。
> 現在、Panelの中にPictureBoxを置き、そこに画像を表示させるプログラムを作っています。
> PictureBoxは画像のサイズに合わせて伸縮するので、画像がPanelよりも大きい場合、スクロールバーが出ることになります。

ん〜、SendMessageを使うより、PanelのScrollイベントで処理した方がよくない?
引用返信 編集キー/
■42575 / inTopicNo.3)  Re[2]: VB.NET WM_VSCROLLが上手く使えない
□投稿者/ A.K (4回)-(2009/10/18(Sun) 18:41:18)
たくポン様

> ん〜、SendMessageを使うより、PanelのScrollイベントで処理した方がよくない?

.NETをいじって日が浅いもので、見当外れのことを言っているかもしれませんが…
PanelのScrollイベントは、Panelでスクロールバーをいじったりした際に発生するイベントではないのでしょうか?
マウスのドラッグの際に、単純にScrollイベントを呼んでも何も起きないと思うのですが…
何か方法があるのでしょうか?
引用返信 編集キー/
■42585 / inTopicNo.4)  Re[3]: VB.NET WM_VSCROLLが上手く使えない
□投稿者/ れい (858回)-(2009/10/19(Mon) 06:21:32)
No42575 (A.K さん) に返信
> たくポン様
>
>>ん〜、SendMessageを使うより、PanelのScrollイベントで処理した方がよくない?
>
> .NETをいじって日が浅いもので、見当外れのことを言っているかもしれませんが…
> PanelのScrollイベントは、Panelでスクロールバーをいじったりした際に発生するイベントではないのでしょうか?

Yes.
たくポンさんの勘違いであろうかと。

ScrollableControl.SetDisplayRectLocationを使えば動かせます。
特に理由がないのであれば、出来るだけWindowメッセージは使わないほうがよいと思います。
引用返信 編集キー/
■42660 / inTopicNo.5)  Re[4]: VB.NET WM_VSCROLLが上手く使えない
□投稿者/ A.K (5回)-(2009/10/19(Mon) 23:42:21)
2009/10/19(Mon) 23:48:53 編集(投稿者)

No42585 (れい さん) に返信

れい様

> ScrollableControl.SetDisplayRectLocationを使えば動かせます。
> 特に理由がないのであれば、出来るだけWindowメッセージは使わないほうがよいと思います。

そのものズバリな関数があったんですね(汗
どうも検索の仕方がまずかったようです。
しかし、SetDisplayRectLocationはプロテクトメソッドなので、使うにはユーザーコントロールを作らねばならないようです。
さらにオンラインヘルプを読みあさっていたら、パブリックなプロパティでScrollableControl.AutoScrollPositionを発見できました。
どちらが高速かまでは調べていませんが、とりあえずこちらを使用していきたいと思います。

どうもありがとうございました。


以下、蛇足のソース


  Private _DragMode As Boolean 'ドラッグ移動受付
Private BeginDragFlg As Boolean 'ドラッグ開始フラグ
Private BeginDragPosition As System.Drawing.Point 'ドラッグ開始地点

''' <summary>
''' ドラッグの開始
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Private Sub PictureBox1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) _
Handles PictureBox1.MouseDown
If _DragMode Then
BeginDragFlg = True
BeginDragPosition = Cursor.Position
End If
End Sub

''' <summary>
''' ドラッグ移動処理
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Private Sub PictureBox1_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) _
Handles PictureBox1.MouseMove
If BeginDragFlg Then
Dim NP As Point
NP = Me.AutoScrollPosition

NP.X = -(NP.X) + BeginDragPosition.X - Cursor.Position.X
NP.Y = -(NP.Y) + BeginDragPosition.Y - Cursor.Position.Y
Me.AutoScrollPosition = NP

BeginDragPosition = Cursor.Position
End If
End Sub

''' <summary>
''' ドラッグ終了
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Private Sub PictureBox1_MouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) _
Handles PictureBox1.MouseUp
BeginDragFlg = False

End Sub

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -