ウィンドウ(コントロール)をコードで作成(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