Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 14.11.2017
Сообщений: 4

Непонятки в работе окна

14.11.2017, 18:24. Показов 984. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
При изучении WinAPI стало не ясно как можно обойти пару проблем в работе с окном. Хотелось бы в этом разобраться.

1)Допустим, я хочу чтобы окно при создании было свернуто сразу в трей. Интернет подсказывает, что лучший способ для этого, это присваивание функции CreateWindow параметр hWndParent = HWND_MESSAGE. Теперь мне захотелось окно отобразить, есть ли способ способ это сделать?

2)Продолжение 1. Если hWndParent = NULL при создании окна, то оно отобразится. Но нужно, чтобы окно при старте было в трее. Если его прятать туда во время WM_CREATE, то при запуске оно "мигнет" на экране. Можно ли этого избежать, не используя HWND_MESSAGE.

3)Главное окно имеет на панели задач иконку. Если же вызвать диалоговое окно, например для настроек чего-то, то оно таковой иконки не имеет. Как сделать, чтобы при запуске диалогового окна появлялась иконка на панели задач (как, например, для MessageBox)?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.11.2017, 18:24
Ответы с готовыми решениями:

Raspberry непонятки при работе с COM устройством
Добрый день. Очень нужна помощь. Советы, даже самые нелепые, только приветствуются. Есть виртуалка debian 7 и rasbian на raspberry. ...

Непонятки при работе с ком-портом
Камрады, поможите чайнику. С сями последний раз работал в школе, а с ком-портом вообще на си никогда не работал :( Вобщем есть вот такой...

таймера TIM2,3,4 F205, непонятки в работе (сбивается период)
Заметил, что сбивается время периодов таймеров, после некоторого времени работы, причём это время работы всегда разное. Где сцобака...

5
Software Developer
 Аватар для fastb1t
315 / 229 / 113
Регистрация: 03.05.2017
Сообщений: 1,336
15.11.2017, 12:55
Цитата Сообщение от glotref Посмотреть сообщение
Допустим, я хочу чтобы окно при создании было свернуто сразу в трей
Ответ для первого и второго пунктов: для этого есть функция ShowWindow.
Делаем так: в функции WinMain, после создания окна, всегда вызывается функция ShowWindow, где в первом параметре указывается дескриптор созданного окна, а во втором параметре указывается одна из констант:

SW_HIDE - Скрывает окно и активизирует другое окно
SW_MAXIMIZE - Максимизирует окно
SW_MINIMIZE - Сворачивает окно и активизирует расположенное под ним окно
SW_RESTORE - Восстанавливает свернутое окно
SW_SHOW - Активизирует окно в текущих размерах и позиции
SW_SHOWMAXIMIZED - Активизирует окно в максимально распахнутом виде
SW_SHOWMINIMIZED - Активизирует окно в свернутом виде
SW_SHOWMINNOACTIVE - Сворачивает окно
SW_SHOWNA - Показывает состояние окна
SW_SHOWNOACTIVATE - Показывает окно в текущих координатах
SW_SHOWNORMAL - Активизирует и отображает окно в первоначальных размерах и позиции

то есть вам нужно - SW_HIDE


І для третьего пункта:
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <windows.h>
 
BOOL CALLBACK DialogProcedure (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
         case WM_INITDIALOG:
              SetClassLong (hwnd, GCL_HICON, (LONG) LoadIcon (GetModuleHandle (NULL), "icon"));
              return TRUE;
         
         case WM_COMMAND:
              if (LOWORD (wParam) == IDCANCEL)
                   EndDialog (hwnd, 0);
              break;
         
         default:
              return FALSE;
    }
}
 
int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil)
{
    DialogBox (hThisInstance, "dialog_form", NULL, DialogProcedure);
    return 0;
}
resource.rc
C++
1
2
3
4
5
6
7
8
9
10
11
#include <windows.h>
 
icon ICON DISCARDABLE "icon.ico"
 
dialog_form DIALOG 100, 100, 100, 50
STYLE WS_SYSMENU | WS_CAPTION | WS_POPUP | DS_MODALFRAME
CAPTION "DialogWindow"
FONT 10, "Times New Roman"
{
    CONTROL "Test Window", -1, "static", SS_LEFT, 30, 20, 50, 20
}
0
0 / 0 / 0
Регистрация: 14.11.2017
Сообщений: 4
15.11.2017, 14:52  [ТС]
Да? действительно, спрятал начальную инициализацию в класс и не заметил, что так можно. А голова чет-на такое не сработала.

А вот с диалогом непонятно. Я попробую вызвать диалог из оконной процедуры и картинки нет. А вот если же диалог вызвать из WinMain, то иконка действительно появляется на панели задач.

И в догонку вопрос. Если главное окно делать диалоговым, как тут можно сразу его прятать в трей и чтобы оно не мерцало? Ведь тут нет никакого ShowWindow?
0
0 / 0 / 0
Регистрация: 14.11.2017
Сообщений: 4
16.11.2017, 19:24  [ТС]
decrement, и да, я попробовал вариант для диалогового окна, даже в таком случае иконка не меняется. Да, иконка на панели задач появляется, но отображается как "битая картинка". Пробовал ваш пример и написать по своему. В качестве картинки использовал IDI_APPLICATION.

C++
1
SetClassLong(hWnd, GCL_HICON, (LONG) LoadIcon (GetModuleHandle (NULL), IDI_APPLICATION));
0
Software Developer
 Аватар для fastb1t
315 / 229 / 113
Регистрация: 03.05.2017
Сообщений: 1,336
16.11.2017, 20:07
C++
1
LoadIcon (GetModuleHandle (NULL), IDI_APPLICATION)
так работать не будет
для стандартных иконок нужно делать так
C++
1
LoadIcon (NULL, IDI_APPLICATION)
Цитата Сообщение от glotref Посмотреть сообщение
Да, иконка на панели задач появляется, но отображается как "битая картинка"
ну это уже проблема либо в иконке, либо ресурсы повреждены
Цитата Сообщение от glotref Посмотреть сообщение
и да, я попробовал вариант для диалогового окна, даже в таком случае иконка не меняется
не меняется где?
у меня и на панели задач и маленькая иконка в окне появляется) и в проводнику на ехешнику (проводник ставит первую подходящую иконку которая есть в ресурсах)
попробуйте ещё так:
C++
1
2
SetClassLong (hwnd, GCL_HICON, (LONG) LoadIcon (GetModuleHandle (NULL), "icon"));
SetClassLong (hwnd, GCL_HICONSM, (LONG) LoadIcon (GetModuleHandle (NULL), "icon"));
1
0 / 0 / 0
Регистрация: 14.11.2017
Сообщений: 4
16.11.2017, 22:04  [ТС]
decrement, действительно, такой вариант заработал
C++
1
LoadIcon (NULL, IDI_APPLICATION)
С иконкой для диалогового окна проверил, оно действительно появляется. Видимо я где-то изначально допустил ошибку. Буду пытаться ее найти. Спасибо за разъяснение.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.11.2017, 22:04
Помогаю со студенческими работами здесь

Мерцание окна при работе макроса
Здравствуйте! Как убрать мерцание окна, если макрос работает с несколькими книгами? Он сначала открывает все нужные книги, затем открывает...

При работе в Chrome выскакивают окна
При работе в Chrome выскакивают окна обновите Flash player или выбрасывает на сайт Microsoft с предупреждение о вредоносном обеспечении...

Всплывающие окна при работе во всех браузерах
Помогите справиться с проблемой! Всплывающие окна появляются при переходе на любую страницу и блокируют работу в интернете.

всплывающие окна при работе во всех браузерах
Здравствуйте, помогите, пожалуйста При работе в любом браузере всплывают окна, типа у вас новое сообщение, некоторые без текста и...

Периодическое открытие нового окна IE при работе в WebBrowser
Суть такова. Есть поток, в потоке создаётся экземпляр winform-овского webbrowser-а. С самим браузером проблем нет, он отлично выполняет...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru