コピー・切り取り・クリア          <TOP>


SendMessage ウィンドウにメッセージを送信
WM_COPY(&H301) テキストボックス・コンボボックスの選択テキストをクリップボードにコピー
WM_CUT(&H300) 選択されているテキスト部分を削除し、そのテキストをCF_TEXTフォーマットでクリップボードにコピー
WM_CLEAR(&H303) テキストボックス・コンボボックスの選択テキストを削除
CF_TEXT(1) テキスト形式のデータ。各行は復帰改行(CR-LF)コードで終わる
 

 

'================================================================
'= コピー・切り取り・クリア
'=    (SendMessage8.bas)
'================================================================
#include "Windows.bi"

' ウィンドウにメッセージを送信
Declare Function Api_SendMessage& Lib "user32" Alias "SendMessageA" (ByVal hWnd&, ByVal wMsg&, ByVal wParam&, lParam As Any)

' クリップボードをオープン
Declare Function Api_OpenClipboard& Lib "user32" Alias "OpenClipboard" (ByVal hWnd&)

' クリップボードから指定フォーマットのデータを検索
Declare Function Api_GetClipboardData& Lib "user32" Alias "GetClipboardData" (ByVal wFormat&)

' クリップボードをクローズ
Declare Function Api_CloseClipboard& Lib "user32" Alias "CloseClipboard" ()

' ヒープに確保されたメモリをロック
Declare Function Api_GlobalLock& Lib "kernel32" Alias "GlobalLock" (ByVal hMem&)

' メモリブロックのロックを解除
Declare Function Api_GlobalUnlock& Lib "kernel32" Alias "GlobalUnlock" (ByVal hMem&)

' 文字列をコピーする
Declare Function Api_lstrcpy& Lib "kernel32" Alias "lstrcpy" (ByVal lpString1 As Any, ByVal lpString2 As Any)

#define WM_COPY &H301                   'テキストボックス・コンボボックスの選択テキストをクリップボードにコピー
#define WM_CUT &H300                    '選択されているテキスト部分を削除し、そのテキストをCF_TEXTフォーマットでクリップボードにコピー
#define WM_CLEAR &H303                  'テキストボックス・コンボボックスの選択テキストを削除
#define CF_TEXT 1                       'テキスト形式のデータ。各行は復帰改行(CR-LF)コードで終わる
#define MAXSIZE 4096

Var Shared Edit1 As Object
Var Shared Text1 As Object
Var Shared Radio(2) As Object
Var Shared Button1 As Object

Edit1.Attach GetDlgItem("Edit1") : Edit1.SetFontSize 14
Text1.Attach GetDlgItem("Text1") : Text1.SetFontSize 14
Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14
For i = 0 To 2
    Radio(i).Attach GetDlgItem("Radio" & Trim$(Str$(i + 1)))
    Radio(i).SetFontSize 14
Next

'================================================================
'=
'================================================================
Declare Function Index bdecl () As Integer
Function Index()
    Index = Val(Mid$(GetDlgRadioSelect("Radio1"), 6)) - 1
End Function

'================================================================
'=
'================================================================
Declare Sub MainForm_Start edecl ()
Sub MainForm_Start()
    Edit1.SetWindowText "F-Basic Programming Tips"

    '"Programming "を選択
    Edit1.SetSelText 8, 20
End Sub

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var hMem As Long
    Var lpMem As Long
    Var txt As String
    Var Ret As Long

    ClearCB

    Select Case Index
        Case 0
            'コピー
            Ret = Api_SendMessage(Edit1.GethWnd, WM_COPY, 0, ByVal 0)
        Case 1
            '切り取り
            Ret = Api_SendMessage(Edit1.GethWnd, WM_CUT, 0, ByVal 0)
        Case 2
            'クリア
            Ret = Api_SendMessage(Edit1.GethWnd, WM_CLEAR, 0, ByVal 0)
    End Select

    Text1.SetWindowText ""

    If Api_OpenClipboard(0) = 0 Then
        Text1.SetWindowText "クリップボードが開きません"
        Exit Sub
    End If
   
    'テキストを参照しているグローバルメモリのブロックへのハンドルを取得
    hMem = Api_GetClipboardData(CF_TEXT)

    'クリップボードのメモリをロックし、実際の文字列を参照
    lpMem = Api_GlobalLock(hMem)
    
    If lpMem <> 0 Then
        txt = Space$(MAXSIZE)
        Ret = Api_lstrcpy(txt, lpMem)
        Ret = Api_GlobalUnlock(hMem)
        
        'nullを削除
        txt = Left$(txt, InStr(txt, Chr$(0)) - 1)
        Text1.SetWindowText txt
    Else
        Text1.SetWindowText "文字列を参照できません!"
    End If

    Ret = Api_CloseClipboard()
End Sub

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