ウィンドウ(コントロール)をコードで作成(Visual Style) <TOP>
BUTTON、CHECK、GROUP、EDIT、COMBOの各コントロールをWindowsXPスタイルで作成します。
WindowsXPスタイルは、当然ながらWindowsXPでなければ効果はありません。VB6(FB)についてはサポート外ですので、不具合もあるようです。(最下段参照)
コントロールをコードで作成と全く同じですが、WindowsXP(ビジュアル)スタイルで表示します。
GetSysColor システムのCOLOR取得
CreateWindowEx 新しいウインドウ(コントロール)を作成
DestroyWindow ウインドウ(コントロール)の解放
マニフェストを作成しアプリケーションがビジュアル スタイルを使用できるようにします。
以下のマニフェストファイルをメモ帳などで作成、実行ファイル名と同じにし、同じフォルダに置いてください。
例:本体実行ファイル名を CreateWindowEx.exe とした場合、 CreateWindowEx.exe.manifest とします。青色で表している個所は各exeファイルの内容により変わります。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
version="1.0.0.0"
processorArchitecture="X86"
name="CompanyName.ProductName.CreateWindowEx.exe"
type="win32"
/>
<description>コントロールをWindowsXPスタイルで(Visual Style)</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="X86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
</assembly>
MAINFORMは、可視なし、BUTTON1を貼り付ます。
起動後BUTTON1の表示色(COLOR_BTNFACE)を取得し、MAINFORMをその色で塗りつぶしています。
フォーム作成時(左)・起動時(右)ボタンの角が丸みを帯びている
BUTTON1をクリックすることによりその他のコントロールを作成します。チェックの色(緑)・スクロールバー・コンボボックスなどががビジュアルスタイルに・・・
※F-Basicでフォームに貼り付けたスクロールバーはこんな風になってしまいました。^^;)
プログレスバー部のみ<プログレスバーの作成>のコードを流用しています。
参照
★コントロールをコードで作成<コントロールをコードで作成>
★Windows XP ビジュアル スタイルについて
http://www.microsoft.com/japan/msdn/windows/windowsxp/xptheming.asp#xptheming_topic3
http://support.microsoft.com/kb/309366/ja
'================================================================ '= CreateWindowExのテスト '= (CreateWindowEx2.bas) '================================================================ #include "Windows.bi" ' システムの背景色を取得 Declare Function Api_GetSysColor& Lib "user32" Alias "GetSysColor" (ByVal nIndex&) #define COLOR_BTNFACE 15 '3Dオブジェクトの表面色 ' ウィンドウ(コントロール)を作成 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&) ' CreateWindowExの解放 Declare Function Api_DestroyWindow& Lib "user32" Alias "DestroyWindow" (ByVal hWnd&) #define WS_BORDER &H800000 'フォームの枠線がある #define WS_CHILD &H40000000 '親ウインドウを持つコントロール(子ウインドウ)を作成する #define WS_CLIPSIBLINGS &H4000000 '兄弟関係にある子ウィンドウをクリップする #define WS_EX_WINDOWEDGE &H100 'ウィンドウが盛り上がった縁の境界線を持つように指定 #define WS_EX_OVERLAPPEDWINDOW &H300 'WS_EX_WINDOWEDGEとWS_EX_CLIENTEDGEの組み合わせ #define WS_VISIBLE &H10000000 '可視状態のウィンドウを作成する #define WS_HSCROLL &H100000 '水平スクロールバーを持つウィンドウを作成する #define WS_VSCROLL &H200000 '垂直スクロールバーを持つウィンドウを作成する #define WS_EX_CLIENTEDGE &H200 #define BS_PUSHBUTTON &H0 'プッシュボタン #define BS_AUTOCHECKBOX &H3 'チェックボックス #define BS_AUTORADIOBUTTON &H9 'ラジオボタン #define BS_GROUPBOX &H7 'グループボックス #define ES_AUTOHSCROLL &H80 '入力範囲を越えたら自動的に水平スクロールする #define ES_AUTOVSCROLL &H40 '最後の行で自動的に垂直スクロールをする #define ES_CENTER 1 'テキストを水平方向で中央に表示する #define ES_LEFT 0 'テキストを左揃えする(デフォルト) #define ES_LOWERCASE &H10 '入力文字を小文字にする #define ES_MULTILINE 4 '複数行エディットを作成する #define ES_NOHIDESEL &H100 'フォーカスを失っても選択範囲を表示する #define ES_NUMBER &H2000 '数値入力専用にする #define ES_OEMCONVERT &H400 '入力文字をOEM文字セットに変換する #define ES_PASSWORD &H20 '入力文字をデフォルトでは*にして表示する #define ES_READONLY &H800 '読みとり専用にする(選択してコピーはできる) #define ES_RIGHT 2 'テキストを右揃えする #define ES_UPPERCASE 8 '入力文字を大文字にする #define ES_WANTRETURN &H1000 '複数行エディットでEnterキーで改行する #define CBS_SIMPLE &H1 '単純なコンボボックス。リストは常にドロップダウンされている #define CBS_DROPDOWN &H2 'CBS_SIMPLEで、リストはドロップダウンアイコンで表示する Var Shared Button1 As Object Button1.Attach GetDlgItem("Button1") '================================================================ '= '================================================================ Declare Sub MainForm_Start edecl () Sub MainForm_Start() Var rgbColor As Long 'Buttonの表面色を取得(EDE9EC) rgbColor = Api_GetSysColor(COLOR_BTNFACE) 'Mainformを取得色で塗り SetBackColor rgbColor '画面を消去し Cls 'Mainformを表示 ShowWindow -1 End Sub '================================================================ '= '================================================================ Declare Sub Button1_on edecl () Sub Button1_on() Var StdStyles As Long Var Ret As Long 'コマンドボタン作成 Ret = Api_CreateWindowEx(0, "Button", "BUTTON2", WS_CHILD Or WS_VISIBLE Or BS_PUSHBUTTON, 20, 50, 130, 24, GethWnd, 0, 0, 0) 'グループ作成 Ret = Api_CreateWindowEx(0, "Button", "GROUP1", WS_CHILD Or WS_VISIBLE Or BS_GROUPBOX, 20, 90, 130, 110, GethWnd, 0, 0, 0) 'チェックボタン作成 Ret = Api_CreateWindowEx(0, "Button", "CHECK1", WS_CHILD Or WS_VISIBLE Or BS_AUTOCHECKBOX, 30, 120, 110, 24, GethWnd, 0, 0, 0) 'ラジオボタン作成 Ret = Api_CreateWindowEx(0, "Button", "RADIO1", WS_CHILD Or WS_VISIBLE Or BS_AUTORADIOBUTTON, 30, 160, 110, 24, GethWnd, 0, 0, 0) 'テキストボックス作成(境界線あり・3Dなし) Ret = Api_CreateWindowEx(0, "Static", "TEXT1", WS_CHILD Or WS_VISIBLE Or WS_BORDER Or ES_CENTER, 20, 210, 130, 24, GethWnd, 0, 0, 0) 'エディットボックス作成(境界線あり・3Dなし) Ret = Api_CreateWindowEx(0, "Edit", "EDIT1", WS_CHILD Or WS_VISIBLE Or WS_BORDER Or ES_LEFT , 180, 10, 130, 24, GethWnd, 0, 0, 0) 'エディットボックス作成(複数行入力あり・3Dあり) StdStyles = WS_BORDER Or WS_CHILD Or WS_HSCROLL Or WS_VSCROLL Or WS_VISIBLE Or ES_AUTOHSCROLL Or ES_AUTOVSCROLL Or ES_MULTILINE Or ES_LEFT Ret = Api_CreateWindowEx(WS_EX_CLIENTEDGE, "Edit", "EDIT2", StdStyles, 180, 40, 130, 80, GethWnd, 0, 0, 0) 'コンボボックス作成 Ret = Api_CreateWindowEx(0, "ComboBox", "COMBO1", WS_CHILD Or WS_VISIBLE Or CBS_SIMPLE Or CBS_DROPDOWN, 180, 130, 130, 100, GethWnd, 0, 0, 0) End Sub '================================================================ '= '================================================================ While 1 WaitEvent Wend Stop End