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"
##完成形
#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; }

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/10 13:44
2018/12/11 23:34 編集
2018/12/10 15:52
2018/12/11 23:42
2018/12/16 08:09