VB6.0用掲示板の過去のログ(No.2)−VBレスキュー(花ちゃん)
[記事リスト] [新規投稿] [新着記事] [ワード検索] [管理用]

投稿日: 2006/09/29(Fri) 09:55
投稿者シーモア
Eメール
URL
タイトル解決とお礼

ソースコードをいただきましてありがとうございます
実行しましたところスムーズに動作しています!
この動作で十分目的を達成できます
Starfish さん ありがとうございました

> > 『サイズの小さい画面をタイトルをドラッグして、移動したときに、
> > 画面の右端が消える位置まで来たら移動できないようにしたい』
> > つまり、
> > 『常にプライマリ画面の中に納まる位置を保持し、
> > 画面全体が見えるようにしたい』
> > のですが、後述のようにタイマーで、位置を戻す処理では
> > いったりきたりで、ちらちらする状態になってしまいます
> > APIなりなんなり、ちらつかずスマートに「はみだし禁止」
> > にすることはできないでしょうか?
>
>  サブクラス化でよければ、こんなんで「はみ禁」を実現可能です。
> もっといいやり方が、あるような気がするが...
>
> '--------------------------------------------------------------------
> ' Form1
> '--------------------------------------------------------------------
> Option Explicit
>
> Private Sub Form_Load()
>     glnglpOrg = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf MyWindowProc)
> End Sub
>
> Private Sub Form_Unload(Cancel As Integer)
> Dim lngReturnValue As Long
>     lngReturnValue = SetWindowLong(Me.hwnd, GWL_WNDPROC, glnglpOrg)
> End Sub
>
> '--------------------------------------------------------------------
> ' Module1
> '--------------------------------------------------------------------
> Option Explicit
>
> Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
>         (ByVal hwnd As Long, ByVal nIndex As Long, _
>         ByVal dwNewLong As Long) As Long
> Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" _
>         (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, _
>         ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
>
> Public Const GWL_WNDPROC = (-4)
>
> Public Const WM_WINDOWPOSCHANGING = &H46
> Type WINDOWPOS
>         hwnd As Long
>         hWndInsertAfter As Long
>         x As Long
>         y As Long
>         cx As Long
>         cy As Long
>         flags As Long
> End Type
>
> Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
>
> Public glnglpOrg As Long
>
> Public Function MyWindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
>     Dim udtWindowPos As WINDOWPOS
>    
>     If uMsg = WM_WINDOWPOSCHANGING Then
>         Call MoveMemory(udtWindowPos, ByVal lParam, Len(udtWindowPos))
>         With udtWindowPos
>             If .x < 0 Then .x = 0
>             If .y < 0 Then .y = 0
>             If .x > Form1.ScaleX((Screen.Width - Form1.Width), vbTwips, vbPixels) Then
>                 .x = Form1.ScaleX((Screen.Width - Form1.Width), vbTwips, vbPixels)
>             End If
>             If .y > Form1.ScaleY((Screen.Height - Form1.Height), vbTwips, vbPixels) Then
>                 .y = Form1.ScaleY((Screen.Height - Form1.Height), vbTwips, vbPixels)
>             End If
>         End With
>         Call MoveMemory(ByVal lParam, udtWindowPos, Len(udtWindowPos))
>     Else
>         MyWindowProc = CallWindowProc(glnglpOrg, hwnd, uMsg, wParam, lParam)
>     End If
> End Function


- 関連一覧ツリー (★ をクリックするとツリー全体を一括表示します)

- 返信フォーム (この記事に返信する場合は下記フォームから投稿して下さい)

- VBレスキュー(花ちゃん) - - Web Forum -