質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

3155閲覧

(windows32API)ツールバーのアイコンが反映されない・ただの白い箱が表示される。

mercurian-teto

総合スコア75

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

1グッド

0クリップ

投稿2018/12/09 15:00

編集2018/12/16 08:06

visualstudio2017でwindows apiのプログラミングをしています。
ツールバーの表示がうまくいきません。
イメージ説明
toolbarにつかうbmpファイルは
visualstudioで新規作成したときに自動生成されるアイコンファイルがある場所に保存しましたし、何が原因でこのようなことが起きるのでしょうか。
回答お願いします。

#include <windows.h> #include <tchar.h> #include <commctrl.h> #include "resource.h" #include "toolbar.h" #define TITLE TEXT("toolbar") HWND hToolBar; // ツールバーのウィンドウハンドル char szClassName[] = "toolbar"; //ウィンドウクラス TBBUTTON tbb[] = { {0, 0, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, {1, 1, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, {2, 2, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, {3, 3, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, {4, 4, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, {5, 4, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, {6, 4, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, {7, 4, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, }; TBBUTTON tb = { 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0 }; int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); BOOL InitApp(HINSTANCE, LPCTSTR); BOOL InitInstance(HINSTANCE, LPCTSTR, int); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) { MSG msg; LPCTSTR szClassName = _T("aaaaaaaaaa"); //ウィンドウクラス if (!hPrevInst) { if (!InitApp(hInstance, szClassName)) return 0; } if (!InitInstance(hInstance, szClassName, nCmdShow)) { return 0; } while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int)msg.wParam; } //ウィンドウ・クラスの登録 BOOLはTRUEかFALSEしか返さないの意味 BOOL InitApp(HINSTANCE hInst, LPCTSTR szClassName) { WNDCLASS wc; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; //プロシージャ名 wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInst; //インスタンス wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; //メニュー名 wc.lpszClassName = szClassName; return (RegisterClass(&wc)); } //ウィンドウの生成 BOOL InitInstance(HINSTANCE hInst, LPCTSTR szClassName, int nCmdShow) { HWND hWnd; hWnd = CreateWindow(szClassName, _T("toolbar"),//タイトルバーにこの名前が表示されます WS_OVERLAPPEDWINDOW, //ウィンドウの種類 CW_USEDEFAULT, //X座標 CW_USEDEFAULT, //Y座標 CW_USEDEFAULT, //幅 CW_USEDEFAULT, //高さ NULL, //親ウィンドウのハンドル、親を作るときはNULL NULL, //メニューハンドル、クラスメニューを使うときはNULL hInst, //インスタンスハンドル NULL); if (!hWnd) return FALSE; ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; } //ウィンドウプロシージャ // //LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) //{ // PAINTSTRUCT ps; // HDC hdc; // TCHAR greeting[] = _T("Hello, World!"); // switch (msg) // { // case WM_PAINT: // // 描画処理の開始 // hdc = BeginPaint(hWnd, &ps); // // 文字列の出力。「Hello, World!」と出力する。 // TextOut(hdc, // 5, 5, // greeting, _tcslen(greeting)); // // ペイント処理の終了 // EndPaint(hWnd, &ps); // break; // case WM_DESTROY: // PostQuitMessage(0); // break; // default: // return DefWindowProc(hWnd, msg, wp, lp); // break; // } // // return 0; //} // LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { int id; HINSTANCE hInst; switch (msg) { case WM_CREATE: hInst = (HINSTANCE)GetWindowLong(hWnd, -6); InitCommonControls(); hToolBar = CreateToolbarEx( hWnd, WS_CHILD | WS_VISIBLE, ID_TOOLBAR, // コントロールID 4, //イメージの数 hInst, ID_MYBMP, tbb, 7, // ボタンの数 0, //ボタンの幅 0, //ボタンの高さ 15, //イメージの幅 15, //イメージの高さ sizeof(TBBUTTON)); SendMessage(hToolBar, TB_INSERTBUTTON, 3, (LPARAM)&tb); //toolbarをさらに追加 break; case WM_SIZE: SendMessage(hToolBar, WM_SIZE, wp, lp); break; case WM_COMMAND: switch (LOWORD(wp)) { case 1: MessageBox(hWnd, _T("1"), _T("ボタンの反応"), MB_OK); break; case 2: MessageBox(hWnd, _T("2"), _T("ボタンの反応"), MB_OK); break; case 3: MessageBox(hWnd, _T("3"), _T("ボタンの反応"), MB_OK); break; case 4: MessageBox(hWnd, _T("4"), _T("ボタンの反応"), MB_OK); break; } break; case WM_CLOSE: id = MessageBox(hWnd, _T("終了してもよいですか"), _T("終了確認"), MB_YESNO | MB_ICONQUESTION); if (id == IDYES) { DestroyWindow(hWnd); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } return 0L; }
// toolbar.rc #include "windows.h" #include "toolbar.h" ///////////////////////////////////////////////////////////////////////////// // // Bitmap // ID_MYBMP BITMAP DISCARDABLE "toolbar.bmp"

イメージ説明
toolbar4.bmp

##完成形

#define _CRT_SECURE_NO_WARNINGS #include <windows.h> #include <tchar.h> #include <commctrl.h> #include "toolbar.h" #define TITLE TEXT("Kitty on your lap") HWND hToolBar; // ツールバーのウィンドウハンドル char szClassName[] = "toolbar"; //ウィンドウクラス #define TOOLBAR_FLAT 0x800 TBBUTTON tbb[] = { {0, IDM_1, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, {1, IDM_2, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, {2, IDM_3, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, {3, IDM_4, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, {4, IDM_4, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, {5, IDM_4, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, {6, IDM_4, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, {8, IDM_4, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, {9, IDM_4, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, {10, IDM_4, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, {11, IDM_4, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, }; TBBUTTON tb = { 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0 }; int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); BOOL InitApp(HINSTANCE, LPCTSTR); BOOL InitInstance(HINSTANCE, LPCTSTR, int); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) { MSG msg; LPCTSTR szClassName = _T("timer"); //ウィンドウクラス if (!hPrevInst) { if (!InitApp(hInstance, szClassName)) return 0; } if (!InitInstance(hInstance, szClassName, nCmdShow)) { return 0; } while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int)msg.wParam; } BOOL InitApp(HINSTANCE hInst, LPCTSTR szClassName) { WNDCLASS wc; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; //プロシージャ名 wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInst; //インスタンス wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; //メニュー名 wc.lpszClassName = szClassName; return (RegisterClass(&wc)); } //ウィンドウの生成 BOOL InitInstance(HINSTANCE hInst, LPCTSTR szClassName, int nCmdShow) { HWND hWnd; hWnd = CreateWindow(szClassName, _T("toolbar"),//タイトルバーにこの名前が表示されます WS_OVERLAPPEDWINDOW, //ウィンドウの種類 CW_USEDEFAULT, //X座標 CW_USEDEFAULT, //Y座標 CW_USEDEFAULT, //幅 CW_USEDEFAULT, //高さ NULL, //親ウィンドウのハンドル、親を作るときはNULL NULL, //メニューハンドル、クラスメニューを使うときはNULL hInst, //インスタンスハンドル NULL); if (!hWnd) return FALSE; ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; } //ウィンドウプロシージャ // //LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) //{ // PAINTSTRUCT ps; // HDC hdc; // TCHAR greeting[] = _T("Hello, World!"); // switch (msg) // { // case WM_PAINT: // // 描画処理の開始 // hdc = BeginPaint(hWnd, &ps); // // 文字列の出力。「Hello, World!」と出力する。 // TextOut(hdc, // 5, 5, // greeting, _tcslen(greeting)); // // ペイント処理の終了 // EndPaint(hWnd, &ps); // break; // case WM_DESTROY: // PostQuitMessage(0); // break; // default: // return DefWindowProc(hWnd, msg, wp, lp); // break; // } // // return 0; //} // LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { int id; HINSTANCE hInst; static HBITMAP hBitmap; switch (msg) { case WM_CREATE: hInst = (HINSTANCE)GetWindowLong(hWnd, -6); InitCommonControls(); hBitmap = LoadBitmap( ((LPCREATESTRUCT)lp)->hInstance, MAKEINTRESOURCE(ID_MYBMP) ); hToolBar = CreateToolbarEx( hWnd, WS_CHILD | WS_VISIBLE, ID_TOOLBAR, // コントロールID 9, //イメージの数 NULL, (UINT_PTR)hBitmap, //リソースかmakeintresource tbb, 9, // ボタンの数 0, //ボタンの幅 0, //ボタンの高さ 16, //イメージの幅 15, //イメージの高さ sizeof(TBBUTTON)); //SendMessage(hToolBar, TB_INSERTBUTTON,3, (LPARAM)&tb); //toolbar(空白)をさらに追加 break; case WM_SIZE: SendMessage(hToolBar, WM_SIZE, wp, lp); break; case WM_COMMAND: switch (LOWORD(wp)) { case IDM_1: MessageBox(hWnd, _T("1"), _T("ボタンの反応"), MB_OK); break; case IDM_2: MessageBox(hWnd, _T("2"), _T("ボタンの反応"), MB_OK); break; case IDM_3: MessageBox(hWnd, _T("3"), _T("ボタンの反応"), MB_OK); break; case IDM_4: MessageBox(hWnd, _T("4"), _T("ボタンの反応"), MB_OK); break; } break; case WM_CLOSE: id = MessageBox(hWnd, _T("終了してもよいですか"), _T("終了確認"), MB_YESNO | MB_ICONQUESTION); if (id == IDYES) { DestroyWindow(hWnd); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } return 0L; }
atata0319👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ソースに問題はありますが、ビットマップが表示されない理由とは考えられません。おそらくリソースで指定しているビットマップの形式に問題があると推測されます。CreateToolbarEx にリソース ID 形式で指定可能なビットマップはパレット付ビットマップまたは 32 ビット ARGB 形式のビットマップのみ(Windows 10 の場合)となります。16 ビットと 24 ビットビットマップを指定する場合、LoadBitmap か LoadImage で読み込んだビットマップハンドルをビットマップの ID を指定しているところに指定してください。その際、hInst に NULL を指定するようにしてください。
また、ビットマップの幅が 120 ピクセルに満たない場合も同じ現象が発生する可能性はあります。

上記以外に、ソース上で問題のあるところを指摘します。

C++

1TBBUTTON tbb[] = { 2 {0, 0, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, 3 {1, 1, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, 4 {2, 2, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, 5 {3, 3, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, 6 {4, 4, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, 7{5, 4, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, 8{6, 4, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, 9{7, 4, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, 10 11}; 12... 13 hToolBar = CreateToolbarEx( 14 hWnd, 15 WS_CHILD | WS_VISIBLE, 16 ID_TOOLBAR, // コントロールID 17 4, //イメージの数 18 hInst, 19 ID_MYBMP, 20 tbb, 21 7, // ボタンの数 22 0, //ボタンの幅 23 0, //ボタンの高さ 24 15, //イメージの幅 25 15, //イメージの高さ 26 sizeof(TBBUTTON));

は、イメージの数が一致していません。イメージの数は 4 を指定していますが、tbb のイメージのインデックスは 7 まで指定されています。ただ、CreateToolbarEx では指定したイメージの数は無視されるので、表示されない理由とは関係がないと推測されます。

C++

1 hInst = (HINSTANCE)GetWindowLong(hWnd, -6);

は、以下のように書き換えることができます。

C++

1 hInst = (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE);

投稿2018/12/09 16:17

atata0319

総合スコア881

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mercurian-teto

2018/12/10 13:44

回答ありがとうございます。 <16 ビットと 24 ビットビットマップを指定する場合、LoadBitmap か <LoadImage で読み込んだビットマップハンドルをビットマップの ID を<指定しているところに指定してください。その際、hInst に NULL を指定<するようにしてください。 bmpファイルをとりあえず上の追記の 画像のようにビット深さ16bitに変更し、 hBitmap = LoadBitmap( ((LPCREATESTRUCT)lp)->hInstance, TEXT("ID_MYBMP ") ); hToolBar = CreateToolbarEx( hWnd, WS_CHILD | WS_VISIBLE, ID_TOOLBAR, // コントロールID 4, //イメージの数 NULL, //hInst (UINT_PTR)hBitmap, tbb, 7, // ボタンの数 0, //ボタンの幅 0, //ボタンの高さ 15, //イメージの幅 15, //イメージの高さ sizeof(TBBUTTON)); としたのですが、何か違っているでしょうか。画像は依然表示されていないのです。
atata0319

2018/12/11 23:34 編集

hBitmap = LoadBitmap( ((LPCREATESTRUCT)lp)->hInstance, MAKEINTRESOURCE(ID_MYBMP) ); ですね。hBitmap の値が NULL ではないか確認してみてください。
atata0319

2018/12/10 15:52

元のソースで気になってたのは #include "resource.h" #include "toolbar.h" と2つインクルードがあることですね。rc ファイルに toolbar.h がインクルードしてあるなら resource.h は不要かと思いますが、その辺はどうなっていますか?
atata0319

2018/12/11 23:42

↑でMAKEINTRESOURCEの名前が間違ってまたのを修正しました。
mercurian-teto

2018/12/16 08:09

<hBitmap = LoadBitmap(((LPCREATESTRUCT)lp)->hInstance, <MAKEINTRESOURCE(ID_MYBMP)); <ですね。hBitmap の値が NULL ではないか確認してみてください。 24 ビットビットマップのツールバーのbmpファイルにしてから atataさんの最終的に提示した方法でちゃんと画像を表示 することができました。最終的なコードは追記の完成形で書いてあります。 ほかの細かいところも修正しました。 回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問