Как создать иконку у окна на чистом WinAPI?

Тема в разделе "WASM.WIN32", создана пользователем amvoz, 1 окт 2017.

  1. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Друзья! У Айзелиона что-то я не нашёл.

    ...А вообще вот код из его третьего туториала, переделанный на Си. Создаёт простое окно (кстати, почему-то в редакторе сообщений нет тэга для кода, как так?)

    #include <windows.h>
    LRESULT CALLBACK WndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

    char ClassName []= "SimpleWinClass";
    char AppName []= "Our First Window";


    //У айзелиона это есть, а тут оказалось ненужным
    //Но по идее не нужны, но оставлю уж
    HINSTANCE hInstance;
    LPSTR CommandLine;

    //+++++++++++++++++++++++++++++++++

    int WinMain (HINSTANCE hInst,
    HINSTANCE hPrevInst,
    LPSTR CmdLine,
    int CmdShow)

    {

    hInstance= hInst;
    CommandLine= CmdLine;

    //структуры
    WNDCLASSEX wc;
    MSG msg;
    HWND hwnd;

    //инициализация;
    wc.cbSize= sizeof (WNDCLASSEX);
    wc.style= CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc= WndProc;
    wc.cbClsExtra= 0;
    wc.cbWndExtra= 0;
    wc.hInstance= hInst;
    wc.hbrBackground= (HBRUSH)(COLOR_WINDOW+1);
    wc.lpszMenuName= 0;
    wc.lpszClassName= ClassName;
    wc.hIcon= LoadIcon (NULL,IDI_APPLICATION);
    wc.hIconSm= 0; //здесь тоже правильно всё
    wc.hCursor= LoadCursor (NULL,IDC_ARROW);


    RegisterClassEx (&wc);

    hwnd= CreateWindowEx (0, ClassName,AppName,\
    WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
    CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\
    hInst,NULL);

    ShowWindow (hwnd,SW_SHOWNORMAL);
    UpdateWindow (hwnd);



    while (true) {
    if (!GetMessage (&msg,NULL,0,0))
    break;
    TranslateMessage (&msg);
    DispatchMessage (&msg);
    }
    return msg.wParam;
    }

    //+++++++++++++++++++++++++++++++++++++++++++++++
    //+++++++++++++++++++++++++++++++++++++++++++++++
    //+++++++++++++++++++++++++++++++++++++++++++++++
    //hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    LRESULT CALLBACK WndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
    if (uMsg==WM_DESTROY)
    PostQuitMessage (0);
    else
    return DefWindowProc (hWnd,uMsg,wParam,lParam );
    return 0;
    }

    Так, и вот там простая такая строчка есть с комментариями:

    wc.hIcon= LoadIcon (NULL,IDI_APPLICATION);
    hIcon: Хэндл иконки. Получите его функцией LoadIcon.

    Что, я собствено и делаю. Я создаю иконку она в файле kas.ico. Файл kas.ico лежит в той же диектории, что и исходный файл win_i.cpp. ПОтом всё это дело компилю (mingw).

    windres -o MENU.o MENU.rc
    g++ win_i.cpp MENU.o -o win_i.exe -mwindows -static
    del MENU.o

    В результате у меня получается экзешник win_i.exe с заявленной иконкой (видно в проводнике). Но когда я его запускаю, появляется окно БЕЗ ИКОНКИ, а надо, чтобы было с иконкой ЧЯДНТ? На всякий случай прикрепляю kas.ico.
    http://fayloobmennik.cloud/7102429
    (по-другому не прикрепляется)
    Спасибо, кто откликнется.
     
    Последнее редактирование: 1 окт 2017
  2. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    amvoz,

    Значит загрузка иконки прошла с ошибкой и это должен сообщить результат выполнения апи, конечно же необходимо проверять как завершается любая апи.
     
  3. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Да, надо было сперва посмотреть,загрузилась иконка с ошибкой или без!
    В общем, решилось пока так:

    1) Инициализируем структуру по простому, без изысков:
    wc.hIcon= LoadIcon(NULL, IDI_APPLICATION);
    wc.hIconSm= wc.hIcon;

    2) Так, а потом при создании окна делаем так:
    if (uMsg==WM_CREATE)
    {
    HICON hicon= LoadIcon(GetModuleHandle(0), MAKEINTRESOURCE (MAIN_ICON));
    SendMessage (hWnd, WM_SETICON, 1, (LPARAM)hicon);
    }

    (Это я посмотрел здесь)
    ++++++++++++++++++++++++++++++++++++++++++++++++

    Теперь ещё необходимо определить макрос MAIN_ICON в двух местах. В файле MENU.rc пишем:
    #define MAIN_ICON 11111
    MAIN_ICON ICON "kas.ico"


    Ну и в файле win_i.cpp то же самое:
    MAIN_ICON ICON "kas.ico"

    ...Всё ж таки, есть тут тэги оформления кода или нет?
     
  4. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    А можно, оказывается, при создании окна ничего не не делать, а структуру заполнить так:

    wc.hIcon= LoadIcon(GetModuleHandle(0), MAKEINTRESOURCE (MAIN_ICON));
    wc.hIconSm= wc.hIcon;


    (ну и макрос MAIN_ICON определить в в двух местах не забыть!)
     
  5. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    amvoz,

    > Всё ж таки, есть тут тэги оформления кода или нет?

    Вставить -> Код.
     
  6. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Indy_, а где тут код?
    [​IMG]
     
  7. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    Ну надо же. Кто бы мог подумать?.. :)

    Тоько в cpp надо не
    Код (C):
    1. MAIN_ICON ICON "kas.ico"
    а
    Код (C):
    1. #define MAIN_ICON 11111
    А еще лучше дефайн объявить в resource.h и в rc и cpp написать
    Код (C):
    1. #include "resource.h"
     
  8. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    rmn, а как у вас получается код вставлять?
     
  9. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    amvoz,
    Да просто вываливай километровые листинги как есть, модеры ночью придут и приведут в порядок пост. Им это нравится, ведь как иначе объяснить то, что до сих пор не запилили кнопку, обрамляющую выделение тегами [ code ] [/ code ] при нажатии?.. :)
     
  10. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    rmn, в общем, нет у меня никакой кнопки "код".
     
  11. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    amvoz,
    Пиши теги руками. Всегда так делаю.
     
    amvoz нравится это.