2013-08-19 2 views
4

Я работаю с экспресс-версией Visual Studio. Поэтому использование функций, вызывающих MAKEINTRESOURCE, не может быть и речи. Я пытаюсь установить значок приложения, переопределив функцию getAdditionalClassInfo.Установка значка программы без ресурсов с помощью WIN32 API

WNDCLASSW *Robot::getAdditionalClassInfo(void) const { 
    WNDCLASSW *wc = Window::getAdditionalClassInfo(); 
    HANDLE hIcon = LoadImage(NULL, L"imagepath/image.png", 32, 32, LR_LOADFROMFILE); 

    wc->hIcon = .....; 
    return wc; 
} 

Кто-нибудь знает, как я могу установить этот значок БЕЗ использования ресурса?

+1

Вы должны использовать ресурс. Использование Express Edition в порядке, когда у вас есть много свободного времени, чтобы выяснить, как написать файл .rc. Это подразумевается как учебное издание. –

+2

В вашем вызове 'LoadImage' отсутствует параметр типа (IMAGE_ICON'), и я не знаю, принимает ли Windows непосредственно загрузку PNG-файлов в виде значков; вы должны использовать такую ​​программу, как Gimp, чтобы сделать ее фактическим файлом значка (.ico). Также, как сказал Ханс, вы можете «создавать» ресурсы с помощью экспресс-версии, вам нужно просто написать файл .rc вручную (версия Express поставляется с компилятором ресурсов, хотя у него нет редактора ресурсов). – Medinoc

+0

Не углубляйтесь в это. Либо сделайте вашу жизнь терпимой, получив бесплатный редактор ресурсов для использования с Express, либо купите коммерческое издание. – SChepurin

ответ

3

Мое предложение, если вы хотите использовать PNG и иметь возможность изменять значок, - это использовать FreeImage для его загрузки. Затем вы можете использовать FreeImage, чтобы легко конвертировать его в стандартный HBITMAP.

Если вы хорошо с помощью фактического значок файла, вы можете сделать следующее после того, как окно было создано:

HANDLE hIcon = LoadImage(0, _T("imagepath/image.ico"), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE); 
if (hIcon) { 
    //Change both icons to the same icon handle. 
    SendMessage(hwnd, WM_SETICON, ICON_SMALL, hIcon); 
    SendMessage(hwnd, WM_SETICON, ICON_BIG, hIcon); 

    //This will ensure that the application icon gets changed too. 
    SendMessage(GetWindow(hwnd, GW_OWNER), WM_SETICON, ICON_SMALL, hIcon); 
    SendMessage(GetWindow(hwnd, GW_OWNER), WM_SETICON, ICON_BIG, hIcon); 
} 

Вы, вероятно, может вызвать аналогичную функцию из вашего getAdditionalClassInfo и установить его в hIcon.

+0

Должно ли 'hIcon' быть выпущено как-то после этого? –

+0

@MattMcNabb Не отпустите его, пока он больше не понадобится. Освобождение его до того, как окно будет выгружено, испортит ситуацию. –

+0

, поэтому мне нужно будет сохранить этот дескриптор вместе с классом окна, а затем вызвать CloseHandle на нем, когда окно будет уничтожено? –