スタートボタンの操作          <TOP>


スタートボタンの表示・非表示とスタートボタンを移動させてみます。

FindWindowEx クラス名 、または キャプションを与えてウィンドウのハンドルを取得

SetWindowPos ウィンドウのサイズ、位置、および Z オーダーを設定

SendMessage ウィンドウにメッセージを送信

ShowWindow 指定されたウィンドウの表示状態を設定

 

表示/非表示のチェック切替によりスタートボタンを表示/非表示させています。

 

 

 

固定/移動のチェック切替によりスタートボタンを移動させています。

 

'================================================================
'= スタートボタンの操作
'=    (SetWindowPos6.bas)
'================================================================
#include "Windows.bi"

' クラス名 、または キャプションを与えてウィンドウのハンドルを取得
Declare Function Api_FindWindowEx& Lib "user32" Alias "FindWindowExA" (ByVal hWndParent&, ByVal hWndChildAfter&, ByVal lpszClassName As Any, ByVal lpszWindow 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_SendMessage& Lib "user32" Alias "SendMessageA" (ByVal hWnd&, ByVal wMsg&, ByVal wParam&, ByVal lParam&)

' 指定されたウィンドウの表示状態を設定
Declare Function Api_ShowWindow& Lib "user32" Alias "ShowWindow" (ByVal hWnd&, ByVal nCmdShow&)

' 画像ファイルの読み込み
Declare Function Api_LoadImage& Lib "user32" Alias "LoadImageA" (ByVal hInst&, ByVal lpszName$, ByVal uType&, ByVal cxDesired&, ByVal cyDesired&, ByVal fuLoad&)

#define SW_HIDE 0                       '指定のウィンドウを非表示にし他のウィンドウをアクティブ化
#define SW_RESTORE 9                    'ウィンドウをアクティブ化し表示。ウィンドウがアイコン化または最大化されているときは元の位置とサイズに
#define GW_CHILD 5                      '基準となるウィンドウの子ウィンドウのうちトップレベルのウィンドウを検索
#define SWP_NOSIZE &H1                  'ウィンドウの現在のサイズを保持する
#define WM_CLOSE &H10                   'ウィンドウ或いはアプリケーションをクローズされた
#define BM_GETIMAGE &HF6                'ボタンに関連付けられているイメージのハンドルを取得
#define BM_SETIMAGE &HF7                'イメージをボタンに関連付ける
#define IMAGE_BITMAP 0                  'ビットマップ
#define LR_LOADFROMFILE &H10            '外部ファイルからロードする

Var Shared Check1 As Object
Var Shared Check2 As Object
Var Shared Timer1 As Object

Check1.Attach GetDlgItem("Check1") : Check1.SetFontSize 14
Check2.Attach GetDlgItem("Check2") : Check2.SetFontSize 14
Timer1.Attach GetDlgItem("Timer1")

Var Shared hStart As Long
Var Shared hOldPic As Long
Var Shared X As Long
Var Shared Y As Long
Var Shared stp As Long

'================================================================
'=
'================================================================
Declare Sub MainForm_Start edecl ()
Sub MainForm_Start()
    Var Ret As Long

    X = 0
    stp = 2

    Ret = Api_FindWindowEx(0, 0, "Shell_TrayWnd", 0)
    hStart = Api_FindWindowEx(Ret, 0, "BUTTON", 0)
    
    hOldPic = Api_SendMessage(hStart, BM_GETIMAGE, IMAGE_BITMAP, ByVal 0)
                     
    Timer1.SetInterval 10
    Timer1.Enable 0
End Sub

'================================================================
'= スタートボタンの表示/非表示
'================================================================
Declare Sub Check1_on edecl ()
Sub Check1_on()
    Var Ret As Long

    If Check1.GetCheck = 1 Then
        Ret = Api_ShowWindow(hStart, SW_HIDE)
    Else
        Ret = Api_ShowWindow(hStart, SW_RESTORE)
        Ret = Api_SetWindowPos(hStart, 0, 0, 0, 0, 0, SWP_NOSIZE)
    End If
End Sub

'================================================================
'= タイマーのOn/Off
'================================================================
Declare Sub Check2_on edecl ()
Sub Check2_on()
    If Check2.GetCheck = 1 Then
        Timer1.Enable -1
    Else
        Timer1.Enable 0
    End If
End Sub

'================================================================
'= スタートボタンを移動させる
'================================================================
Declare Sub Timer1_Timer edecl ()
Sub Timer1_Timer()
    Var Ret As Long
    
    Y = sin(X / 10) * 10

    Ret = Api_SetWindowPos(hStart, 0, X, Y, 0, 0, SWP_NOSIZE)

    X = X + stp
    
    If X > 200 Then stp = -2
    If X < 0 Then stp = 2
End Sub

'================================================================
'= スタートボタンを所定の位置へ
'================================================================
Declare Sub ResetStartButton()
Sub ResetStartButton()
    Var Ret As Long

    Timer1.Enable 0

    Ret = Api_ShowWindow(hStart, SW_RESTORE)
    Ret = Api_SetWindowPos(hStart, 0, 0, 0, 0, 0, SWP_NOSIZE)
    Ret = Api_SendMessage(hStart, BM_SETIMAGE, IMAGE_BITMAP, ByVal hOldPic)
End Sub

'================================================================
'= 
'================================================================
Declare Sub MainForm_QueryClose edecl ()
Sub MainForm_QueryClose()

    ResetStartButton
End Sub

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