スタートボタンの操作 <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