[概要] Windows API + C++ でウィンドウにアイコンを設定したいが、なぜか設定されない。 アイコンがちゃんとウィンドウに設定したい。
久しぶりにWin32 APIをやろうとしています。(忘れているところもある…)
標準 Windows APIをもとにやっているのですが、アイコンが設定されません。
自分なりのコード:
C++
// .\src\main.cpp #include<iostream> #include<vector> #include<random> #include<windows.h> #define UNICODE #include"resource/resource.h" LRESULT CALLBACK WindowProc( HWND hWnd, UINT msg, WPARAM wp, LPARAM lp ); int WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, PSTR lpCmdLine, int nCmdShow ){ WNDCLASSEXW winc; std::wstring className = L"test1"; winc.cbSize = sizeof(WNDCLASSEXW); winc.style = CS_HREDRAW | CS_VREDRAW; winc.lpfnWndProc = WindowProc; winc.cbClsExtra = 0; winc.cbWndExtra = 0; winc.hInstance = hInst; winc.hIcon = (HICON)LoadImageW( hInst, MAKEINTRESOURCE(IDI_MAINICONEX), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED ); //winc.hIcon = LoadIconA(hInst , MAKEINTRESOURCE(IDI_MAINICONEX)); winc.hCursor = LoadCursor( NULL, IDC_ARROW ); winc.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH ); winc.lpszMenuName = NULL; winc.lpszClassName = className.c_str(); winc.hIconSm = winc.hIcon; if( winc.hIcon == NULL ){ MessageBoxW( NULL, L"icon is null", L"エラー", MB_OK ); //return 1; } if( !RegisterClassExW( &winc ) ){ MessageBoxW( NULL, L"RegisterClassの失敗", L"エラー", MB_OK ); return 1; } HWND hWnd = CreateWindowW( className.c_str(), L"test1", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 200, 200, NULL, NULL, hInst, NULL ); if( hWnd == NULL ){ MessageBoxW( NULL, L"CreateWindowの失敗", L"エラー", MB_OK ); return 2; } ShowWindow( hWnd, SW_SHOW ); UpdateWindow( hWnd ); MSG msg; while( GetMessage( &msg, NULL, 0, 0 ) ){ TranslateMessage( &msg ); DispatchMessage( &msg ); } return msg.wParam; } LRESULT CALLBACK WindowProc( HWND hWnd, UINT msg, WPARAM wp, LPARAM lp ){ switch ( msg ){ case WM_DESTROY: MessageBoxW( hWnd, L"終了するぞ", L"WM_DESTORYメッセージを受け取った", MB_OK ); PostQuitMessage( 0 ); return 0; } return DefWindowProc( hWnd, msg, wp, lp ); }
C++
// .\src\resource\resource.h #ifndef RESOURCE_H #define RESOURCE_H #define IDI_MAINICONEX 102 #endif
C++
#include"resource.h" IDI_MAINICONEX ICON DISCARDABLE "..\..\res\icons\main.ico"
cmd
rem コンパイル方法 g++ -c .\src\main.cpp -o .\src\main.o -DUNICODE windres .\src\resource\resource.rc -o .\src\resource\resource.o g++ -o2 -std=c++11 -o .\bin\Main .\src\main.o .\src\resource\resource.o -mwindows
↑ 追記&修正: リソースファイルをリンクするのを忘れていたらしいです…
コンパイルは通るのですが、いざ起動すると、『icon is null』というメッセージボックスが表示され、
ウィンドウにはアイコンが設定されていません。
アイコンが壊れているのかと思い、C#で組んだもののアイコンを代わりに使っても同じでした。
コードが何か間違っているのかと思い、Windowsアプリケーションのアイコンの指定方法でも試してみましたが同じでした。
[試したこと]
試したこと1: if( winc.hIcon == NULL ) ... を配置し、NULLなのかどうかを調べる 結果: 『icon is null』と表示された。つまりアイコンが読み込まれていないか失敗したか。
試したこと2: アイコンを別のものに変えた 結果: 変える前と同様であった
試したこと3: 参考サイトを『Windowsアプリケーションのアイコンの指定方法』に変えてみて、 LoadIcon関数をLoadImageに変更した 結果: 今までと同様
試したこと4: アイコンがある場所を "....\res\resource" から resource.rc 等があるディレクトリに変えてみる。 もちろん、rcファイルに記述されているファイルパスも変える。 結果: 今までと同様
[情報]
言語: C++
コンパイラ: MinGW (g++ (i686-posix-dwarf-rev0, Built by MinGW-W64 project) 8.1.0)
OS: Windows 8, 10
[追記1]
dodox86さんのおっしゃるように GetError関数&FormatMessage関数を使って取得してみました。
その結果、『指定されたイメージ ファイルはリソース セクションを含んでいません』と出ています…
メッセージからは『リンクされていないことが原因』かと思うのですが、
まだ回答がついていません
会員登録して回答してみよう