掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
拡大鏡のようなソフトを作るには? (ID:81355)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
簡単に考えて2つの方法が考えられます。 1.枠をドラッグする方法 ルーペフォームをドラッグ中にもプレビュー表示を行うというのでしたら、 ループ処理が必要ですが、ドラッグ中はプレビュー表示を行わない、つまりドラッグ後にプレビュー 表示を行うのでしたら、別にループ処理は必要ありません。 あと、この方法ですと、枠の幅が小さい場合はドラッグ操作がやりにくいという欠点があります。 枠の幅を大きくする(RectB構造体に値を設定している計算式中にある「5」を大きな数字に変更) すれば、ドラッグ操作は幾分やりやすくなります。 修正方法 計算しやすくするため、Form1のScaleModeを3(ピクセル)にしてください。 そしたら、Form1に下記のソースをコピペします。 Option Explicit Private mX As Long Private mY As Long Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = vbLeftButton Then mX = X mY = Y End If End Sub Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) If mX <> 0 And Button = vbLeftButton Then Me.Move Me.Left + (X - mX) * Screen.TwipsPerPixelX, Me.Top + (Y - mY) * Screen.TwipsPerPixelY End If End Sub Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = vbLeftButton Then mX = 0 mY = 0 End If DoEvents Call KakudaiKyou End Sub 標準モジュールのほうはドラッグ中にプレビューを表示させる場合とさせない場合とで修正 方法が変わってきます。 A.ドラッグ中にもプレビューを表示させる場合 KakudaiKyou関数を下記のように修正します。 'Form1からも呼んでいますので、Public関数に変更します。 Public Sub KakudaiKyou() Do DoEvents With RectB rc = StretchBlt(frmPreview.hDC, 0, 0, frmPreview.ScaleWidth, frmPreview.ScaleHeight, hDeskTopDC, (frmLoupe.Left \ Screen.TwipsPerPixelX) + 5, (frmLoupe.Top \ Screen.TwipsPerPixelY) + 5, (.Right - .Left), (.Bottom - .Top), vbSrcCopy) End With Loop End Sub B.ドラッグ中はプレビュー表示を行わない場合 main()関数の一番最後でKakudaiKyou関数を呼んでいましたが、必要ないので消します。 KakudaiKyou関数を下記のように修正します。 'Form1(ルーペフォーム)からも呼んでいますので、Public関数に変更します。 Public Sub KakudaiKyou() DoEvents With RectB rc = StretchBlt(frmPreview.hDC, 0, 0, frmPreview.ScaleWidth, frmPreview.ScaleHeight, hDeskTopDC, (frmLoupe.Left \ Screen.TwipsPerPixelX) + 5, (frmLoupe.Top \ Screen.TwipsPerPixelY) + 5, (.Right - .Left), (.Bottom - .Top), vbSrcCopy) End With End Sub 2.ルーペフォームのタイトルバーを表示させ、タイトルバーでドラッグを行う方法 タイトルバーを表示させれば、ドラッグできます。しかし、タイトルバーでのマウスイベントは 拾えません。また、タイトルバーをドラッグしているときは、同一プロセス内において「ドラッグする」という 処理されませんのでドラッグ中でのプレビュー表示ができません。しかし、マウスアップなどの イベントが拾えないですので、ループ処理(DoEvents付き)で半リアルタイム的にプレビュー表示 を行うことにより対処しています。 まず、Form1(ルーペフォーム)のControlBoxプロパティをTrueにし、BorderStyleを1(固定)にします。 それと、今回は計算しやすくするためにForm1のScaleModeプロパティを1(Twip)のままにします。 1.の方法においてForm1にソースを追加しましたが今回は必要ありません。 また、1.の方法において、main関数で呼んでいたKakudaikyou関数を消しましたが今回は必要ですので残しておきます。 しかし、このままですとルーペフォームのくりぬき部分がタイトルバーにも及んでしまいますので、 タイトルバー部分をくりぬかないように内サイズ(RectB構造体)を変更します。 main関数の '枠の内サイズを設定 With RectB .Left = 5 .Top = 5 .Right = RectA.Right - 5 .Bottom = RectA.Bottom - 5 End With という部分を '枠の内サイズを設定 With RectB .Left = 5 .Top = (Form1.Height-Frm1.ScaleHeight) \ Screen.TwipsPerPixelY .Right = RectA.Right - 5 .Bottom = RectA.Bottom - 5 End With 内サイズの変更に伴いKakudaiKyou関数を下記のように修正します。 Public Sub KakudaiKyou() Do DoEvents With RectB rc = StretchBlt(frmPreview.hDC, 0, 0, frmPreview.ScaleWidth, frmPreview.ScaleHeight, hDeskTopDC, (frmLoupe.Left \ Screen.TwipsPerPixelX) + 5, (frmLoupe.Top \ Screen.TwipsPerPixelY) + (frmLoupe.Height - frmLoupe.ScaleHeight) \ Screen.TwipsPerPixelY, (.Right - .Left), (.Bottom - .Top), vbSrcCopy) End With Loop End Sub 以上が各方法による修正方法です。枠サイズとプレビューサイズの厳密な調整は行っていませんので、 誤差があるかと思いますが、その辺のところはご自分で調整してください。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.