プログレスバーの色を変える <TOP>
プログレスバー の色、および背景色を変えてみます。
CreateWindowEx ウインドウ(コントロール)を作成
InitCommonControlsEx 特定のコモンコントロールクラスを登録
SendMessage ウィンドウにメッセージを送信
ColorRef = RGB(Red, Green, Blue)でプログレスバーの色を変えることができます。
背景色は、それぞれ255までの数値を入れてください。
※どういう訳か、プログレスバー作成(スムーズ表示)の行で、&HBのところをPBS_SMOOTHにするとエラー[2]になります。
以前は、大丈夫だったはずなのだが???...
ちなみに、プログレスバーの作成では、大丈夫なのでF-BASICの不具合かなぁ...
'================================================================ '= プログレスバーの色を変える '= (ProgressBar2.bas) '================================================================ #include "Windows.bi" Type tagINITCOMMONCONTROLSEX dwSize As Long '構造体のバイト数 dwICC As Long 'ロードするクラスを指定する End Type ' ウインドウ(コントロール)を作成 Declare Function Api_CreateWindowEx& Lib "user32" Alias "CreateWindowExA" (ByVal ExStyle&, ByVal ClassName$, ByVal WinName$, ByVal Style&, ByVal x&, ByVal y&, ByVal nWidth&, ByVal nHeight&, ByVal Parent&, ByVal Menu&, ByVal Instance&, ByVal Param&) ' コモンコントロールのダイナミックリンクライブラリ(DLL)に含まれている、特定のコモンコントロールクラスを登録 Declare Function Api_InitCommonControlsEx& Lib "comctl32" Alias "InitCommonControlsEx" (lpInitCtrls As tagINITCOMMONCONTROLSEX) ' ウィンドウにメッセージを送信。この関数は、指定したウィンドウのウィンドウプロシージャが処理を終了するまで制御を返さない Declare Function Api_SendMessage& Lib "user32" Alias "SendMessageA" (ByVal hWnd&, ByVal wMsg&, ByVal wParam&, ByVal lParam&) ' ウィンドウにメッセージを送信。この関数は、指定したウィンドウのウィンドウプロシージャが処理を終了するまで制御を返さない Declare Function Api_SendMessageP& Lib "user32" Alias "SendMessageA" (ByVal hWnd&, ByVal wMsg&, ByVal wParam&, lParam As Any) ' ウィンドウスタイルの定数 #define WS_CHILD &H40000000 '親ウインドウを持つコントロール(子ウインドウ)を作成する #define WS_VISIBLE &H10000000 'Visibleである #define WS_BORDER &H800000 'フォームの枠線がある ' プログレスバー関係 #define WM_USER &H400 'ユーザーが定義できるメッセージの使用領域を表すだけでこれ自体に意味はない #define PBM_SETRANGE &H401 '(WM_USER + 1)範囲の設定 #define PBM_SETPOS &H402 '(WM_USER + 2)位置の指定 #define PBM_DELTAPOS &H403 '(WM_USER + 3)デフォルトの位置 #define PBM_SETSTEP &H404 '(WM_USER + 4)増分の設定 #define PBS_SMOOTH &HB '滑らかなプログレスバー #define ICC_PROGRESS_CLASS &H20 'プログレスバーコントロール #define PROGRESS_CLASS "msctls_progress32" 'プログレスバーコントロールクラス #define CCM_FIRST &H2000 #define CCM_SETBKCOLOR &H2001 #define PBM_SETBKCOLOR &H2001 '背景色の設定(IE3以降) #define PBM_SETBARCOLOR &H409 'バーの色設定(IE4以降) Var Shared Text1 As Object Var Shared Check1 As Object Var Shared Group1 As Object Var Shared Edit(2) As Object Var Shared Radio(2) As Object Var Shared Timer1 As Object Var Shared Button1 As Object Text1.Attach GetDlgItem("Text1") : Text1.SetFontSize 14 For i = 0 To 2 Edit(i).Attach GetDlgItem("Edit" & Trim$(Str$(i + 1))) : Edit(i).SetFontSize 14 Radio(i).Attach GetDlgItem("Radio" & Trim$(Str$(i + 1))) : Radio(i).SetFontSize 14 Next i Check1.Attach GetDlgItem("Check1") : Check1.SetFontSize 14 Timer1.Attach GetDlgItem("Timer1") Group1.Attach GetDlgItem("Group1") : Group1.setFontSize 14 Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14 'プログレスバーのハンドル保存用 Var Shared pBarhWnd As Long Var Shared Cnt As Long Var Shared Flg As Byte Var Shared ColorRef As Long '================================================================ '= '================================================================ Declare Function BkRGB(ByVal r As Byte, ByVal g As Byte, ByVal b As Byte) As Long Function BkRGB(ByVal r As Byte, ByVal g As Byte, ByVal b As Byte) As Long 'シフト演算した値の論理和 BkRGB = CLng(b) * (2 ^ 16) Or CLng(g) * (2 ^ 8) Or CLng(r) End Function '================================================================ '= '================================================================ Declare Function GetLong(ByVal UpperWord As Long, ByVal LowerWord As Long) As Long Function GetLong(ByVal UpperWord As Long, ByVal LowerWord As Long) As Long '下位・上位を与えて長整数値(32ビット値)を取得 GetLong = UpperWord& + LowerWord& * &H10000 End Function '================================================================ '= '================================================================ Declare Function Index bdecl () As Integer Function Index() As Integer Index = Val(Mid$(GetDlgRadioSelect("Radio1"), 6)) - 1 End Function '================================================================ '= '================================================================ Declare Sub MainForm_Start edecl () Sub MainForm_Start() 'タイマーセット Timer1.SetInterval 5 Timer1.Enable 0 ShowWindow -1 End Sub '================================================================ '= '================================================================ Declare Sub Timer1_Timer edecl () Sub Timer1_Timer() Var Ret As Long 'プログレスバーのカウント Cnt = Cnt + 1 Ret = Api_SendMessage(pBarhWnd, PBM_SETPOS, Cnt, 0) Text1.SetWindowText Str$(Cnt) & "%" If Cnt > 99 Then Cnt = 0 Timer1.Enable 0 Button1.EnableWindow -1 End If End Sub '================================================================ '= '================================================================ Declare Sub Button1_on edecl () Sub Button1_on() Var cc As tagINITCOMMONCONTROLSEX Var BkColor As Long Var bR As Byte Var bG As Byte Var bB As Byte Var Ret As Long cc.dwSize = Len(cc) cc.dwICC = ICC_PROGRESS_CLASS If Check1.GetCheck = 0 Then 'プログレスバー作成(段階表示) pBarhWnd = Api_CreateWindowEx(0, PROGRESS_CLASS, "Progress Bar", WS_CHILD Or WS_VISIBLE Or WS_BORDER, 14, 8, 238, 20, GethWnd, 0, GethInst, 0) Else 'プログレスバー作成(スムーズ表示) pBarhWnd = Api_CreateWindowEx(0, PROGRESS_CLASS, "Progress Bar", WS_CHILD Or WS_VISIBLE Or WS_BORDER Or &HB, 14, 8, 238, 20, GethWnd, 0, GethInst, 0) End If '範囲の設定(0〜100) Ret = Api_SendMessage(pBarhWnd, PBM_SETRANGE, 0, GetLong(0, 100)) 'ステップの設定 Ret = Api_SendMessage(pBarhWnd, PBM_SETSTEP, 1, 0) '背景色(RGB)を取得 bR = Val(Edit(0).GetWindowText) bG = Val(Edit(1).GetWindowText) bB = Val(Edit(2).GetWindowText) BkColor = BkRGB(bR, bG, bB) 'プログレスバーの背景色を設定 Ret = Api_SendMessage(pBarhWnd, PBM_SETBKCOLOR, 0, ByVal BkColor) Select Case Index Case 0 ColorRef = RGB(255, 0, 0) Case 1 ColorRef = RGB(0, 255, 0) Case 2 ColorRef = RGB(0, 0, 255) End Select 'プログレスバーの色を設定 Ret = Api_SendMessage(pBarhWnd, PBM_SETBARCOLOR, 0, ColorRef) 'プログレスバーの値を「0」にする Ret = Api_SendMessage(pBarhWnd, PBM_SETPOS, 0, 0) Cnt = 0 Timer1.Enable -1 'コマンドボタンの無効化 Button1.EnableWindow 0 End Sub '================================================================ '= '================================================================ While 1 WaitEvent Wend Stop End