by jacoby » 2006年9月06日(水) 20:52
整理のために改めてウインドウにツールバーのみを設置
するプログラムを書きました。
まず、ヘルプセンターWin32プログラミング講座「ツールバーを作る」より
そこのツールバーボタンビットマップを挿入したもので実行させると、
コンパイルは通り、ツールバーが表示されます。
(↓下がソースです。ver4.24、プロジェクト名「ToolBarTest424」で製作。)
ここにソースが表示されます。 [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]
コード: 全て選択
'-----------------------------------------------------------------------------
' イベント プロシージャ
'-----------------------------------------------------------------------------
' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。
' ウィンドウ ハンドル: hMainWnd
' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。
Const ID_TOOLBAR = 70 'ツールバーのID
Const IDM_NEW=1005
Const IDM_OPEN=1006
Const IDM_SAVE=1007
Const IDM_EXIT=1008
Const IDM_UNDO=1009
Const IDM_CUT=1010
Const IDM_COPY=1011
Const IDM_PASTE=1012
Const IDM_ALLSELECT=1013
Const IDM_ABOUT=1014
'-----------------------------------------------------------------------------
' ウィンドウメッセージを処理するためのコールバック関数
Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。
' イベントプロシージャの呼び出しを行います。
MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function
'-----------------------------------------------------------------------------
' ここから下は、イベントプロシージャを記述するための領域になります。
'
'●デストロイ・イベント
'
Sub MainWnd_Destroy()
ToolBarTest424_DestroyObjects()
PostQuitMessage(0)
End Sub
'
'●リサイズ・イベント
'
Sub MainWnd_Resize(SizeType As Long, cx As Integer, cy As Integer)
Dim hToolBar As HWND
'ツールバーのハンドルを取得
hToolBar=GetDlgItem(hMainWnd,ID_TOOLBAR)
'ツールバーのサイズ自動変更
SendMessage(hToolBar, TB_AUTOSIZE, 0, 0)
End Sub
'
'●クリエイト・イベント
'
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
Dim ic As INITCOMMONCONTROLSEX
Dim tbb[9] As TBBUTTON
'コモンコントロールの初期化
ic.dwSize=Len(ic)
ic.dwICC=ICC_BAR_CLASSES
InitCommonControlsEx(ic)
'ボタン情報をセット
SetTbButtonData(tbb[0],0,IDM_NEW,TBSTATE_ENABLED,TBSTYLE_BUTTON)
SetTbButtonData(tbb[1],1,IDM_OPEN,TBSTATE_ENABLED,TBSTYLE_BUTTON)
SetTbButtonData(tbb[2],2,IDM_SAVE,TBSTATE_ENABLED,TBSTYLE_BUTTON)
SetTbButtonData(tbb[3],0,0,TBSTATE_ENABLED,TBSTYLE_SEP)
SetTbButtonData(tbb[4],3,IDM_ABOUT,TBSTATE_ENABLED,TBSTYLE_BUTTON)
'ツールバーを生成
CreateToolbarEx(_
hMainWnd, _
WS_CHILD or WS_VISIBLE, _
ID_TOOLBAR, _ 'ID_TOOLBAR, _
4, _ 'ビットマップの個数
GetModuleHandle(0), _
IDB_BITMAP1, _ 'ビットマップのリソースID
tbb, _
5, _ 'ボタンの個数
0,0, _ 'ボタンサイズ(0指定で自動セットに)
16,15, _ 'ビットマップサイズ
Len(tbb[0]))
End Sub
'
'●ツールバーボタン情報のセットサブ
'
Sub SetTbButtonData(ByRef ptb As TBBUTTON,
iBitmap As Long,
idCommand As Long,
fsState As Byte,
fsStyle As Byte)
'ptb(TBBUTTON構造体)にボタン情報を格納する
With ptb
.iBitmap=iBitmap
.idCommand=idCommand
.fsState=fsState
.fsStyle=fsStyle
.dwData=0
.iString=0
End With
End Sub
'----------------------------------
'↓以降はツールバーボタンをクリックした時の表示
'
'●新規作成
'
Sub MainWnd_IDM_NEW_MenuClick()
MessageBox(hMainWnd,"NEW","Message",MB_OK)
End Sub
'
'●ファイルのオープン
'
Sub MainWnd_IDM_OPEN_MenuClick()
MessageBox(hMainWnd,"OPEN","Message",MB_OK)
End Sub
'
'●ファイルの保存
'
Sub MainWnd_IDM_SAVE_MenuClick()
MessageBox(hMainWnd,"SAVE","Message",MB_OK)
End Sub
'
'●ヘルプ
'
Sub MainWnd_IDM_ABOUT_MenuClick()
MessageBox(hMainWnd,"ABOUT","Message",MB_OK)
End Sub
次に、「標準のビットマップ」を使うため、クリエイト・イベントを
下の様に変更したソースを作りました。
ここにソースが表示されます。 [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]
コード: 全て選択
'
'●クリエイト・イベント
'
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
Dim ic As INITCOMMONCONTROLSEX
Dim tbb[9] As TBBUTTON
'コモンコントロールの初期化
ic.dwSize=Len(ic)
ic.dwICC=ICC_BAR_CLASSES
InitCommonControlsEx(ic)
'ボタン情報をセット
SetTbButtonData(tbb[0],STD_FILENEW,IDM_NEW,TBSTATE_ENABLED,TBSTYLE_BUTTON)
SetTbButtonData(tbb[1],STD_FILEOPEN,IDM_OPEN,TBSTATE_ENABLED,TBSTYLE_BUTTON)
SetTbButtonData(tbb[2],STD_FILESAVE,IDM_SAVE,TBSTATE_ENABLED,TBSTYLE_BUTTON)
SetTbButtonData(tbb[3],0,0,TBSTATE_ENABLED,TBSTYLE_SEP)
SetTbButtonData(tbb[4],STD_HELP,IDM_ABOUT,TBSTATE_ENABLED,TBSTYLE_BUTTON)
'ツールバーを生成
CreateToolbarEx(_
hMainWnd, _
WS_CHILD or WS_VISIBLE, _
ID_TOOLBAR, _ 'ID_TOOLBAR, _
4, _ 'ビットマップの個数
HINST_COMMCTRL,_ 'GetModuleHandle(0), _
IDB_STD_SMALL_COLOR, _'IDB_BITMAP1, _ 'ビットマップのリソースID
tbb, _
5, _ 'ボタンの個数
0,0, _ 'ボタンサイズ(0指定で自動セットに)
16,15, _ 'ビットマップサイズ
Len(tbb[0]))
End Sub
ボタン情報セットの箇所、
標準ビットマップボタンは、インデックスに STD というプリフィクスを持ち
ビュービットマップボタンは VIEW というプリフィックスを持っています
あとは、TBBUTTON の iBitmap メンバに、用いたいボタンのインデックス値を指定します
なので、そのように iBitmap メンバを"STD_FILENEW"などと書き換えて、
後はCreateToolbarExの
GetModuleHandle(0)を "HINST_COMMCTRL"に、
ビットマップのリソースIDを"IDB_STD_SMALL_COLOR"に
(今回はより前述の説明ページのソースと合わせるため、"LARGE_COLOR"ではなく "SMALL_COLOR"で行いました。)
それぞれ変えて実行しました。
コンパイル結果は、
コード: 全て選択
MainWnd.sbp(74) - "STD_FILENEW" 無効な識別子です
MainWnd.sbp(75) - "STD_FILEOPEN" 無効な識別子です
MainWnd.sbp(76) - "STD_FILESAVE" 無効な識別子です
MainWnd.sbp(78) - "STD_HELP" 無効な識別子です
MainWnd.sbp(81) - "IDB_STD_SMALL_COLOR" 無効な識別子です
とエラーが出て来ます。
"IDB_STD_SMALL_COLOR"など
標準のビットマップを使うための定数が定義されていないのでは
とは思いますが、分からないのは、
「これらは定義されているものではないのか?」ということと、
「もし自分で定義しなければならないとすれば、実際に
どのような値をセットしなければならないのか?」ということです。
サーチエンジンで少し調べては見たのですが、定数の中身の数値までは
中々見つけられていません。
エラーの原因はこのことばかりではないかも知れませんが、
これらについて、気づかれたことがありましたら教えてください。
整理のために改めてウインドウにツールバーのみを設置
するプログラムを書きました。
まず、ヘルプセンターWin32プログラミング講座「ツールバーを作る」より
そこのツールバーボタンビットマップを挿入したもので実行させると、
コンパイルは通り、ツールバーが表示されます。
(↓下がソースです。ver4.24、プロジェクト名「ToolBarTest424」で製作。)
[hide=ここにソースが表示されます。]
[code]
'-----------------------------------------------------------------------------
' イベント プロシージャ
'-----------------------------------------------------------------------------
' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。
' ウィンドウ ハンドル: hMainWnd
' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。
Const ID_TOOLBAR = 70 'ツールバーのID
Const IDM_NEW=1005
Const IDM_OPEN=1006
Const IDM_SAVE=1007
Const IDM_EXIT=1008
Const IDM_UNDO=1009
Const IDM_CUT=1010
Const IDM_COPY=1011
Const IDM_PASTE=1012
Const IDM_ALLSELECT=1013
Const IDM_ABOUT=1014
'-----------------------------------------------------------------------------
' ウィンドウメッセージを処理するためのコールバック関数
Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。
' イベントプロシージャの呼び出しを行います。
MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function
'-----------------------------------------------------------------------------
' ここから下は、イベントプロシージャを記述するための領域になります。
'
'●デストロイ・イベント
'
Sub MainWnd_Destroy()
ToolBarTest424_DestroyObjects()
PostQuitMessage(0)
End Sub
'
'●リサイズ・イベント
'
Sub MainWnd_Resize(SizeType As Long, cx As Integer, cy As Integer)
Dim hToolBar As HWND
'ツールバーのハンドルを取得
hToolBar=GetDlgItem(hMainWnd,ID_TOOLBAR)
'ツールバーのサイズ自動変更
SendMessage(hToolBar, TB_AUTOSIZE, 0, 0)
End Sub
'
'●クリエイト・イベント
'
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
Dim ic As INITCOMMONCONTROLSEX
Dim tbb[9] As TBBUTTON
'コモンコントロールの初期化
ic.dwSize=Len(ic)
ic.dwICC=ICC_BAR_CLASSES
InitCommonControlsEx(ic)
'ボタン情報をセット
SetTbButtonData(tbb[0],0,IDM_NEW,TBSTATE_ENABLED,TBSTYLE_BUTTON)
SetTbButtonData(tbb[1],1,IDM_OPEN,TBSTATE_ENABLED,TBSTYLE_BUTTON)
SetTbButtonData(tbb[2],2,IDM_SAVE,TBSTATE_ENABLED,TBSTYLE_BUTTON)
SetTbButtonData(tbb[3],0,0,TBSTATE_ENABLED,TBSTYLE_SEP)
SetTbButtonData(tbb[4],3,IDM_ABOUT,TBSTATE_ENABLED,TBSTYLE_BUTTON)
'ツールバーを生成
CreateToolbarEx(_
hMainWnd, _
WS_CHILD or WS_VISIBLE, _
ID_TOOLBAR, _ 'ID_TOOLBAR, _
4, _ 'ビットマップの個数
GetModuleHandle(0), _
IDB_BITMAP1, _ 'ビットマップのリソースID
tbb, _
5, _ 'ボタンの個数
0,0, _ 'ボタンサイズ(0指定で自動セットに)
16,15, _ 'ビットマップサイズ
Len(tbb[0]))
End Sub
'
'●ツールバーボタン情報のセットサブ
'
Sub SetTbButtonData(ByRef ptb As TBBUTTON,
iBitmap As Long,
idCommand As Long,
fsState As Byte,
fsStyle As Byte)
'ptb(TBBUTTON構造体)にボタン情報を格納する
With ptb
.iBitmap=iBitmap
.idCommand=idCommand
.fsState=fsState
.fsStyle=fsStyle
.dwData=0
.iString=0
End With
End Sub
'----------------------------------
'↓以降はツールバーボタンをクリックした時の表示
'
'●新規作成
'
Sub MainWnd_IDM_NEW_MenuClick()
MessageBox(hMainWnd,"NEW","Message",MB_OK)
End Sub
'
'●ファイルのオープン
'
Sub MainWnd_IDM_OPEN_MenuClick()
MessageBox(hMainWnd,"OPEN","Message",MB_OK)
End Sub
'
'●ファイルの保存
'
Sub MainWnd_IDM_SAVE_MenuClick()
MessageBox(hMainWnd,"SAVE","Message",MB_OK)
End Sub
'
'●ヘルプ
'
Sub MainWnd_IDM_ABOUT_MenuClick()
MessageBox(hMainWnd,"ABOUT","Message",MB_OK)
End Sub
[/code]
[/hide]
次に、「標準のビットマップ」を使うため、クリエイト・イベントを
下の様に変更したソースを作りました。
[hide=ここにソースが表示されます。]
[code]
'
'●クリエイト・イベント
'
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
Dim ic As INITCOMMONCONTROLSEX
Dim tbb[9] As TBBUTTON
'コモンコントロールの初期化
ic.dwSize=Len(ic)
ic.dwICC=ICC_BAR_CLASSES
InitCommonControlsEx(ic)
'ボタン情報をセット
SetTbButtonData(tbb[0],STD_FILENEW,IDM_NEW,TBSTATE_ENABLED,TBSTYLE_BUTTON)
SetTbButtonData(tbb[1],STD_FILEOPEN,IDM_OPEN,TBSTATE_ENABLED,TBSTYLE_BUTTON)
SetTbButtonData(tbb[2],STD_FILESAVE,IDM_SAVE,TBSTATE_ENABLED,TBSTYLE_BUTTON)
SetTbButtonData(tbb[3],0,0,TBSTATE_ENABLED,TBSTYLE_SEP)
SetTbButtonData(tbb[4],STD_HELP,IDM_ABOUT,TBSTATE_ENABLED,TBSTYLE_BUTTON)
'ツールバーを生成
CreateToolbarEx(_
hMainWnd, _
WS_CHILD or WS_VISIBLE, _
ID_TOOLBAR, _ 'ID_TOOLBAR, _
4, _ 'ビットマップの個数
HINST_COMMCTRL,_ 'GetModuleHandle(0), _
IDB_STD_SMALL_COLOR, _'IDB_BITMAP1, _ 'ビットマップのリソースID
tbb, _
5, _ 'ボタンの個数
0,0, _ 'ボタンサイズ(0指定で自動セットに)
16,15, _ 'ビットマップサイズ
Len(tbb[0]))
End Sub
[/code]
[/hide]
ボタン情報セットの箇所、
[quote]
標準ビットマップボタンは、インデックスに STD というプリフィクスを持ち
ビュービットマップボタンは VIEW というプリフィックスを持っています
あとは、TBBUTTON の iBitmap メンバに、用いたいボタンのインデックス値を指定します
[/quote]
なので、そのように iBitmap メンバを"STD_FILENEW"などと書き換えて、
後はCreateToolbarExの
GetModuleHandle(0)を "HINST_COMMCTRL"に、
ビットマップのリソースIDを"IDB_STD_SMALL_COLOR"に
(今回はより前述の説明ページのソースと合わせるため、"LARGE_COLOR"ではなく "SMALL_COLOR"で行いました。)
それぞれ変えて実行しました。
コンパイル結果は、
[code]
MainWnd.sbp(74) - "STD_FILENEW" 無効な識別子です
MainWnd.sbp(75) - "STD_FILEOPEN" 無効な識別子です
MainWnd.sbp(76) - "STD_FILESAVE" 無効な識別子です
MainWnd.sbp(78) - "STD_HELP" 無効な識別子です
MainWnd.sbp(81) - "IDB_STD_SMALL_COLOR" 無効な識別子です
[/code]
とエラーが出て来ます。
"IDB_STD_SMALL_COLOR"など
標準のビットマップを使うための定数が定義されていないのでは
とは思いますが、分からないのは、
「これらは定義されているものではないのか?」ということと、
「もし自分で定義しなければならないとすれば、実際に
どのような値をセットしなければならないのか?」ということです。
サーチエンジンで少し調べては見たのですが、定数の中身の数値までは
中々見つけられていません。
エラーの原因はこのことばかりではないかも知れませんが、
これらについて、気づかれたことがありましたら教えてください。