アイコンを設定する          <TOP>


アイコンを設定します。

GetClassLong クラスに関連付けてる補足データ域からlong値を取得

SetClassLong クラスに関連付けている補足データ域にlong値を設定

GetClassName ウィンドウクラス名を取得

CallWindowProc 指定されたウィンドウプロシージャにメッセージ情報を渡す関数

LoadImage 画像ファイルの読み込み

 

例では、テストプログラムと同じフォルダにTEST.icoを用意していますが、インポートしていない状態です。

 

実行(起動)するとアイコンは設定されていません。

実行ボタンをクリックするとクラス名を取得表示し、TEST.icoがある場合メニューバーにアイコンをセットします。

 

'================================================================
'= アイコンを設定する
'=    (SetClassLong.bas)
'================================================================
#include "Windows.bi"

' クラスに関連付けてる補足データ域から Long 値を取得
Declare Function Api_GetClassLong& Lib "user32" Alias "GetClassLongA" (ByVal hWnd&, ByVal nIndex&)

' クラスに関連付けている補足データ域に Long 値を設定
Declare Function Api_SetClassLong& Lib "user32" Alias "SetClassLongA" (ByVal hWnd&, ByVal nIndex&, ByVal dwNewLong&)

' ウィンドウクラス名を取得
Declare Function Api_GetClassName& Lib "user32" Alias "GetClassNameA" (ByVal hWnd&, ByVal lpClassName$, ByVal nMaxCount&)

' 指定されたウィンドウプロシージャにメッセージ情報を渡す関数
Declare Function Api_CallWindowProc& Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc&, ByVal hWnd&, ByVal Msg&, ByVal WParam&, ByVal lParam&)

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

#define GCL_CBCLSEXTRA -20              'クラスに関連付けられている拡張クラスメモリのサイズをバイト単位で設定
#define GCL_CBWNDEXTRA -18              'ウィンドウに関連付けられている拡張ウィンドウメモリのサイズをバイト単位で設定
#define GCL_HBRBACKGROUND -10           'クラスに関連付けられている背景ブラシのハンドルを書き換える
#define GCL_HCURSOR -12                 'クラスに関連付けられているマウスカーソルのハンドルを書き換える
#define GCL_HICON -14                   'クラスに関連付けられているアイコンのハンドルを書き換える
#define GCL_HMODULE -16                 'クラスを登録したモジュールのハンドルを書き換える
#define GCL_MENUNAME -8                 'メニュー名が入った文字列のアドレスを書き換える
#define GCL_STYLE -26                   'ウィンドウクラスのスタイルビットを書き換える
#define GCL_WNDPROC -24                 'クラスに関連付けられているウィンドウプロシージャのアドレスを書き換える

#define IMAGE_BITMAP 0                  'ビットマップ
#define IMAGE_ICON 1                    'アイコン
#define IMAGE_CURSOR 2                  'カーソル
#define IMAGE_ENHMETAFILE 3             '拡張メタファイル

#define LR_CREATEDIBSECTION &H2000      'デバイス独立ビットマップとしてロードする
#define LR_DEFAULTCOLOR &H0             'デフォルト
#define LR_DEFAULTSIZE &H40             '幅・高さの指定がゼロであれば、システムメトリック値のサイズを採用する
#define LR_LOADFROMFILE &H10            '外部ファイルからロードする
#define LR_LOADMAP3DCOLORS &H1000       'カラーテーブルを走査して、3Dカラーをシステム値に置き換える
#define LR_LOADTRANSPARENT &H20         '最初のピクセルデータを背景色と見なし、システム値に置き換える
#define LR_MONOCHROME &H1               '白黒イメージとしてロード
#define LR_SHARED &H8000                'イメージハンドルを固定する
#define LR_COPYFROMSOURCE &H4000        'リソースから読み込む
#define WM_CLOSE &H10                   'ウインドウ或いはアプリケーションをクローズされた

Var Shared hIcon As Long

Var Shared Text1 As Object
Var Shared Text2 As Object
Var Shared Button1 As Object
Var Shared Button2 As Object

Text1.Attach GetDlgItem("Text1") : Text1.SetFontSize 12
Text2.Attach GetDlgItem("Text2") : Text2.SetFontSize 12
Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14
Button2.Attach GetDlgItem("Button2") : Button2.SetFontSize 14

'================================================================
'=
'================================================================
Declare Sub MainForm_Start edecl ()
Sub MainForm_Start()

    Text2.SetWindowText "↑ アイコンは設定されていません!"
End Sub

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var Buffer As String * 256
    Var Ret As Long

    Ret = Api_GetClassName(GethWnd, Buffer, Len(Buffer))
    If Ret = 0 Then
        Text1.SetWindowText "クラス名を取得できません!"
    Else
        Text1.SetWindowText "クラス名は " & Left$(Buffer, Ret) & " です!"
    End If

    hIcon = Api_LoadImage(GethInst, "TEST.ico", IMAGE_ICON, 32, 32, LR_LOADFROMFILE)
    If hIcon = 0 Then
        Text2.SetWindowText "アイコンはありません!"
        Wait 50
        Exit Sub
    End If

    Ret = Api_SetClassLong(GethWnd, GCL_HICON, hIcon)
    If Ret = 0 Then
        Text2.SetWindowText "アイコンを設定できません!"
    Else
        Text2.SetWindowText "↑ アイコンを設定しました!"
    End If
End Sub

'================================================================
'=
'================================================================
Declare Sub Button2_on edecl ()
Sub Button2_on()
    Var ProcAddress As Long
    Var Ret As Long

    ProcAddress = Api_GetClassLong(GethWnd, GCL_WNDPROC)
    If ProcAddress = 0 Then
        Text1.SetWindowText "ウィンドウクラス名の取得はできません!"
        Wait 50
        End
    End If

    Ret = Api_CallWindowProc(ProcAddress, GethWnd, WM_CLOSE, 0, 0)
End Sub

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