拡大鏡(U)              <TOP>


通常フォームの拡大鏡を作成します。

SendMessage ウィンドウにメッセージを送信
SetWindowPos ウィンドウのサイズ、位置、および Z オーダーを設定
ReleaseCapture マウスのキャプチャを解放
GetDesktopWindow Windowsのデスクトップウィンドウを識別
StretchBlt 拡縮をともなうグラフィックデバイス間のイメージを転送
GetDC デバイスコンテキストのハンドルを取得
ReleaseDC デバイスコンテキストを解放
GetCursorPos マウスカーソル(マウスポインタ)の現在の位置に相当するスクリーン座標を取得

 

四角い拡大鏡です。少し広い視野を確保します。老眼鏡でも、『,』『.』『;』『:』の判別が困難なのです。^^;)

ついでに、倍率を可変させてみました(1〜3倍)。必要の有無は別としてテストですので・・・

フォームにPictureBox、VScroll、Timerを貼り付けます。アイコン化あり、最大表示なし。

フォームサイズ、PictureBoxサイズはプログラム上で指定しています。あまり大きくすると動作が遅くなります。
SetWindowPosで最前面固定に設定しています。

フォームのプロパティでフレームの種類は境界線にしておきましょう。うっかりフォームサイズを大きくしてしまうとタイヘンです。

 

実行時の大きさ(たったこれだけでWindowsXPのアクセサリ→拡大鏡より使いやすいかも・・)

カーソル位置(赤で表示)から拡大します。

 

 

 

 


デジタル拡大していますので整数倍以外の場合汚くなります。

LOUPE2.LZHをダウンロードするとF-Basicをお持ちでない方でも試用できます。

<LOUPE2.lzh>

 

'================================================================
'= 拡大鏡
'=  StretchBlt
'=    (Loupe2.bas)
'================================================================
#include "Windows.bi"

Type POINTAPI
    X As Long
    Y As Long
End Type

' ウィンドウにメッセージを送信。この関数は、指定したウィンドウのウィンドウプロシージャが処理を終了するまで制御を返さない
Declare Function Api_SendMessage& Lib "user32" Alias "SendMessageA" (ByVal hWnd&, ByVal wMsg&, ByVal wParam&, lParam As Any)

' ウィンドウのサイズ、位置、および Z オーダーを設定
Declare Function Api_SetWindowPos& Lib "user32" Alias "SetWindowPos" (ByVal hWnd&, ByVal hWndInsertAfter&, ByVal X&, ByVal Y&, ByVal CX&, ByVal CY&, ByVal uFlags&)

' マウスのキャプチャを解放
Declare Function Api_ReleaseCapture& Lib "user32" Alias "ReleaseCapture" ()

' Windowsのデスクトップウィンドウを識別。返されるポインタは、一時的なポインタ。後で使用するために保存しておくことはできない
Declare Function Api_GetDesktopWindow& Lib "user32" Alias "GetDesktopWindow" ()

' 拡縮をともなうグラフィックデバイス間のイメージを転送
Declare Function Api_StretchBlt& Lib "gdi32" Alias "StretchBlt" (ByVal hDC&, ByVal X&, ByVal Y&, ByVal nWidth&, ByVal nHeight&, ByVal hSrcDC&, ByVal xSrc&, ByVal ySrc&, ByVal nSrcWidth&, ByVal nSrcHeight&, ByVal dwRop&)

' 指定されたウィンドウのクライアント領域または画面全体を表すディスプレイデバイスコンテキストのハンドルを取得
Declare Function Api_GetDC& Lib "user32" Alias "GetDC" (ByVal hWnd&)

' デバイスコンテキストを解放
Declare Function Api_ReleaseDC& Lib "user32" Alias "ReleaseDC" (ByVal hWnd&, ByVal hDC&)

' マウスカーソル(マウスポインタ)の現在の位置に相当するスクリーン座標を取得
Declare Function Api_GetCursorPos& Lib "user32" Alias "GetCursorPos" (lpPoint As POINTAPI)

#define WM_NCLBUTTONDOWN &HA1           '非クライアント領域で左マウスボタンを押す
#define HWND_TOPMOST (-1)               'ウィンドウを常に最前面に配置
#define SWP_SHOWWINDOW &H40             'ウィンドウを表示する
#define SWP_NOSIZE &H1                  'ウィンドウの現在のサイズを保持する
#define SWP_NOMOVE &H2                  'ウィンドウの現在位置を保持する
#define HTCAPTION 2                     'タイトルバーをクリックしたことを示す
#define RCCOPY &HCC0020                 '転送元長方形を転送先長方形にそのままコピー
#define COLORONCOLOR 3                  '取り除く点の情報を保存することなく削除

Var Shared hWnd As Long
Var Shared dtphDC As Long
Var Shared FormWidth As Long
Var Shared FormHeight As Long
Var Shared N As single                  '倍率

Var Shared Picture1 As Object
Var Shared Timer1 As Object
Var Shared VScroll1 As Object

Picture1.Attach GetDlgItem("Picture1")
Timer1.Attach GetDlgItem("Timer1")
VScroll1.Attach GetDlgItem("VScroll1")

'================================================================
'=
'================================================================
declare sub MainForm_Start edecl ()
sub MainForm_Start()
    Var dtphWnd As Long

    FormWidth = 600
    FormHeight = 140
    SetWindowSize FormWidth, FormHeight

    Picture1.SetWindowSize FormWidth - 30, FormHeight
    Picture1.MoveWindow 0, 0

    VScroll1.SetWindowSize 14, FormHeight - 40
    VScroll1.MoveWindow FormWidth - 24, 4
    VScroll1.SetScrollRange 10, 30
    VScroll1.SetScrollStep 5, 1
    VScroll1.SetScrollPos 20
    N = 2
    SetWindowtext "拡大鏡 倍率:" & Trim$(Str$(N)) & "倍"

    MoveWindow 0, 0
    ShowWindow -1

    dtphWnd = Api_GetDesktopWindow()        'デスクトップハンドル取得
    dtphDC = Api_GetDC(dtphWnd)             'デバイスコンテキスト取得

    Timer1.SetInterval 1
    Timer1.Enable -1
End sub

'================================================================
'= カーソル位置のデスクトップ画像を拡大(2倍)して転送
'================================================================
Declare Sub Timer1_Timer edecl ()
Sub Timer1_Timer()
    Var pa As POINTAPI
    Var pichDC As Long
    Var Ret As Long

    pichDC = Api_GetDC(Picture1.GethWnd)    'Picture1のDC取得
    Ret = Api_GetCursorPos(pa)
    Ret = Api_SetWindowPos(GethWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_SHOWWINDOW Or SWP_NOMOVE Or SWP_NOSIZE)
    Ret = Api_StretchBlt(pichDC, 0, 0, FormWidth * N, FormHeight * N, dtphDC, pa.X, pa.Y - 10, FormWidth, FormHeight, RCCOPY)
End Sub

'================================================================
'=    
'================================================================
Declare Sub VScroll1_Change edecl ()
Sub VScroll1_Change()
    N = VScroll1.GetScrollPos / 10
    SetWindowtext "拡大鏡 倍率:" & Trim$(Str$(N)) & "倍"
End sub

'================================================================
'=    
'================================================================
Declare Sub MainForm_MouseDown edecl (Button%, Shift%, X!, Y!)
Sub MainForm_MouseDown(Button%, Shift%, X!, Y!)
    Var Ret As Long

    Ret = Api_ReleaseCapture()
    Ret = Api_SendMessage(GethWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0)
End Sub

'================================================================
'= 
'================================================================
Declare Sub MainForm_QueryClose(Cancel%, ByVal Mode%)
Sub MainForm_QueryClose(Cancel%, ByVal Mode%)
    Var Ret As Long

    Ret = Api_ReleaseDC(hWnd, hDC)
    End
End sub

'================================================================
'=
'================================================================
While 1
    WaitEvent
Wend
Stop
End