В Windows значки, а также некоторые другие элементы (курсоры, растровые изображения, ...) должны указываться в файле ресурсов, который после компиляции будет связан с программой.
Первый пример того, как добавить значок в программу Windows, которая проиллюстрирует его использование в Eclipse. Вот простая программа, которая просто создает окно. Посмотрите, когда мы заполняем WNDCLASSEX, там находится ссылка на значок приложения:
resources.h - этот файл может использоваться для присвоения значения идентификатору ресурса, поэтому вместо него используйте значение:
#define AppIcon 101
Следующий файл - это файл ресурсов, вы можете создать его вручную или из Eclipse, чтобы создать его в Eclipse, щелкнуть правой кнопкой мыши по каталогу, которым вы хотите (в данном случае это src
), и выбрать New -> File
. Там напишите нужное имя и нажмите Finish
. Чтобы отредактировать его из Eclipse, щелкните его правой кнопкой мыши и выберите Open with -> Text Editor
.
resources.rc - здесь будет указан значок:
#include "resources.h"
// The icon path I used will be needed by Eclipse.
// If you want to use back-slashes you have to scape them (\\ instead of \):
AppIcon ICON "../src/icon.ico"
demoicon.c - файл, содержащий код программы:
#include <windows.h>
#include "resources.h"
const char *ClassName = "DemoIcon";
// Declaration of the window procedure, to be used in the WNDCLASSEX struct:
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrev, LPSTR lpCmdLine, int nShowCmd) {
WNDCLASSEX wc;
HWND hWnd;
MSG msg;
// Filling the structure:
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = 0;
wc.lpfnWndProc = WindowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
// Remember this just loads 32x32, use LoadImage() instead for other dimensions (16x16, 48x48, ...):
wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(AppIcon));
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW);
wc.lpszMenuName = NULL;
wc.lpszClassName = ClassName;
// Here we'll use LoadImage, as we need a 16x16 mini icon:
wc.hIconSm = LoadImage(hInstance,MAKEINTRESOURCE(AppIcon),IMAGE_ICON,16,16, LR_DEFAULTCOLOR);
// Registering the class:
if(!RegisterClassEx(&wc)) {
MessageBox(NULL,
"Could not register window.",
"Error",
MB_ICONEXCLAMATION | MB_OK);
return -1;
}
// Create the window using the "MainWindow" class:
hWnd = CreateWindowEx(WS_EX_WINDOWEDGE,
ClassName,
"Demo Icon",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
200,
150,
NULL,
NULL,
hInstance,
NULL);
// If the window was not created show error and exit:
if(hWnd == NULL) {
MessageBox(NULL,
"Could not create window.",
"Error",
MB_ICONEXCLAMATION | MB_OK);
return -1;
}
// Set the windows show state, to show it:
ShowWindow(hWnd, nShowCmd);
// Draw the window:
UpdateWindow(hWnd);
// Retrieve messages from the message queue:
while(GetMessage(&msg, NULL, 0, 0) > 0) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
// Implementation of the window procedure, will handle the messages:
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
switch(uMsg) {
case WM_CLOSE:
DestroyWindow(hWnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
return 0;
}
Теперь, в вашем исходном каталоге проекта Eclipse, убедитесь, что у вас есть все файлы (в примере 3 файла, упомянутых выше, и файл значков).
После этого перейдите к Project -> Properties
.
Там перейдите на вкладку C/C++ Build -> Settings -> Build Steps
.
Там вы увидите Pre-build steps -> Command
. Команда, которую вы там заполните, будет выполнена до начала компиляции, поэтому вы скажете ей скомпилировать файл ресурсов. Поскольку вы используете MinGW, компилятор ресурсов будет windres
:
windres ../src/resources.rc -o ../Resources/resources.o
Как вы можете видеть, я помещу скомпилированный файл ресурсов в каталог с именем Resources
, вы можете оставить его там, где хотите (и поэтому имя файла не обязательно должно называться * 1038). *).
Теперь перейдите на вкладку Tool Settings
.
Там перейдите к MinGW C Linker -> Miscellaneous
, и в других объектах добавьте созданный ранее объектный файл, в этом случае вы должны добавить:
Resources/resources.o
Поскольку это приложение для Windows, добавьте параметр -mwindows
к флагам компоновщика в верхней части той же вкладки.
Готово, при сборке вашего проекта Eclipse сначала скомпилирует файл ресурсов, а затем свяжет сгенерированный объект как любой другой объектный файл вашего проекта.
Надеюсь, это достаточно ясно, чтобы прочитать это.