Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
1

Z-order

28.11.2018, 20:57. Показов 1697. Ответов 4

Author24 — интернет-сервис помощи студентам
Как бы мне разобраться с тем, что такое Z-последовательность и с чем ее едят?
Как я представляю, у каждого приложения поддерживается список наложенных друг на дружку окон. и если мы щелкнем по окну, которое ниже, то фокус все равно попадет к верхнему окну.
(для простоты считаем все окна диалоговыми, модальными. Собственно, только этот случай меня и интересует)
Кроме того, если я подвину верхнее окно, то окна лежащие ниже перерисуются. А если я вызову другое приложение, перекрывающие частично мое, и щелкну в любом месте моего, то фокус вернется к верхнему. Восстановится вся стопка окон моего приложения.
Все хорошо, и это поведение меня вполне устраивает.
Но тут я хочу из диалогового окна моего приложения (назовем его приложением А) вызвать другое свое же приложение В. Тоже диалоговое. И если бы мне удалось окна приложения В прицепить к Z-последовательности приложения А, я был бы
просто счастлив.
Приложение В тоже может образовать свою стопку диалогов. Мне нужно, чтобы эти 2 стопки объединились.
На всякий случай. Приложение А не должно работать до окончания работы приложения В. Так что никакие потоки тут не нужны. Но должно, конечно, перерисовываться при изменении геометрии окон В.

ЗЫ. Приложение В знает хендл главного окна приложения А. Кстати, а как из него получить верхнее окно приложения А? Т.е. пройтись по Z-цепочке вверх?
И обратно, приложение В может в любой момент сообщить А хендл любого своего окна.

ЗЗЫ. Приложение В вызывается через CreateProcess
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.11.2018, 20:57
Ответы с готовыми решениями:

Z-order поиск и сеттер
Привет. имеется некое окно HWND_1 сторонней программы. я его нахожу и прикручиваю к левому краю...

Про Z-order (последовательность окон)
Всем привет. Есть небольшая проблемка. У меня имеется небольшое winapi-шное приложение, окно с...

Можно ли изменить позицию (z-order) моего окна относительно панели задач?
Привет, Есть ли у панели задач Windows z-order (z позиция в стеке), и можно ли изменить позицию...

HSQL запрос. Что не так? "from hiberdata.Order order where order.clientId=?"
public List loadOrdersByClientId(Integer clientId) { return getHibernateTemplate().find( 'from...

4
2376 / 834 / 317
Регистрация: 10.02.2018
Сообщений: 1,968
29.11.2018, 22:47 2
Мне кажется, что это не правильный подход. Если требуется использование одного интерфейса в нескольких программах, то лучше сделать этот интерфейс в виде DLL-модуля и подключать её куда нужно. Можно ещё посмотреть на activeX и то, как работает встраивание ворда и экселя в другие приложения, но это на порядок сложнее.

Что касается описанной синхронизации окон разных приложений, то стандартного документированного способа делать подобное я не встречал. Так что все дальнейшие рассуждения - это, скорее, мазохизм и создание гибрида велосипеда с граблями. Есть такая штука Owned Windows. По своему описанию она очень похожа на то, что хочется получить. Но, подобные отношения между окнами описаны для одного процесса и создание такой связи задаётся при вызове CreateWindow. Однако, можно извернуться и всё же попытаться проделать подобное для двух процессов. Как это всё может сказаться на работе программ и каким боком аукнуться в будущем, я не представляю. Ниже пример запуска из приложения блокнота и установка его окну owner-ом окна своего приложения.
Кликните здесь для просмотра всего текста
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include "stdafx.h"
 
HWND g_hButton;
HANDLE g_hChildProcess = 0;
HWND g_hChildWindow = 0;
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    WNDCLASS wc;
    memset(&wc, 0, sizeof(wc));
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hCursor = LoadCursor(nullptr, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wc.lpszClassName = TEXT("MyWindowClass");
    RegisterClass(&wc);
 
    HWND hWnd = CreateWindow(wc.lpszClassName, TEXT("MyWindow"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, 0, 0, hInstance, 0);
    if (!hWnd)
        return FALSE;
 
    g_hButton = CreateWindow(TEXT("BUTTON"), TEXT("Test"), WS_CHILD | WS_VISIBLE, 100, 100, 100, 30, hWnd, 0, hInstance, 0);
 
    SetTimer(hWnd, 1, 1000, 0);
 
    ShowWindow(hWnd, SW_SHOW);
    UpdateWindow(hWnd);
 
    MSG msg;
    while (GetMessage(&msg, 0, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return (int)msg.wParam;
}
 
BOOL CALLBACK EnumThreadWndProc(HWND hwnd, LPARAM lParam)
{
    g_hChildWindow = hwnd;
    return FALSE;
}
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
        case WM_COMMAND:
            if ((HIWORD(wParam) == BN_CLICKED) && (lParam == (LPARAM)g_hButton))
            {
                STARTUPINFO si = { sizeof(si) };
                PROCESS_INFORMATION pi;
                if (CreateProcess(TEXT("C:\\WINDOWS\\system32\\notepad.exe"), 0, 0, 0, FALSE, 0, 0, 0, &si, &pi))
                {
                    CloseHandle(pi.hThread);
                    g_hChildProcess = pi.hProcess;
                    WaitForInputIdle(g_hChildProcess, INFINITE);
                    EnumThreadWindows(pi.dwThreadId, EnumThreadWndProc, 0);
                    if (g_hChildWindow)
                    {
                        SetWindowLong(g_hChildWindow, GWLP_HWNDPARENT, (LONG)hWnd);
                        EnableWindow(hWnd, FALSE);
                    }
                }
                else
                {
                    DWORD dwErr = GetLastError();
                    MessageBox(hWnd, TEXT("Error!\r\nCan't create process."), TEXT("CreateProcess"), MB_ICONERROR);
                }
            }
            break;
 
        case WM_TIMER:
            if (wParam == 1)
            {
                if (g_hChildProcess)
                {
                    if (WaitForSingleObject(g_hChildProcess, 0) == WAIT_OBJECT_0)
                    {
                        CloseHandle(g_hChildProcess);
                        g_hChildProcess = 0;
                        g_hChildWindow = 0;
                        EnableWindow(hWnd, TRUE);
                        SetForegroundWindow(hWnd);
                    }
                }
            }
            break;
 
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
 
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
    }
 
    return 0;
}
1
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
29.11.2018, 23:57  [ТС] 3
Ygg, спасибо, информации много, и мне надо ее как следует проанализировать. Как вы, наверное, понимаете, это продолжение все той же темы о взаимодействии программ.
Причем тут DLL, не очень понимаю, впрочем я очень мало работал с этой штукой.
Что касается actiiveX, в эти дебри мне влезать не охота. Плюс - придется отказаться от мечты о кроссплатформенности. Хотя я умею встраивать Ворд-Ексель в свои программы. Неуклюже, но как-то.
Со своей проблемой я, в общем-то справился. Костыльно. Просто каждое окно программы В сообщает программе А - "я тут главное". А программа А на это уже реагирует, выводя его на передний план. Это все тонко, и часто рвется.
Но наблюдая происходящее на экране, мне пришла в голову мысля, что ежели бы соединить ихние Z-последовательности, то все было бы O'Key, и не было бы у меня забот.
0
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
30.11.2018, 09:56 4
Цитата Сообщение от Байт Посмотреть сообщение
Плюс - придется отказаться от мечты о кроссплатформенности.
Но ведь вы и так привязываетесь к особенностям winapi, о какой кроссплатформенности речь?
0
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
30.11.2018, 11:06  [ТС] 5
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
вы и так привязываетесь к особенностям winapi, о какой кроссплатформенности речь?
Верно! Но хотелось бы сделать эту привязку минимальной и локализованной. Сейчас это 5 строк кода в программе В и 30 в программе А.
Но в общем-то вы правы. До кросса еще очень далеко. Для этого надо весь функционал программы А перевести на Qt. А тогда и надобность во всех этих танцах отпадет.
0
30.11.2018, 11:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.11.2018, 11:06
Помогаю со студенческими работами здесь

Order by внутри order by
Добрый день, есть условно таблица с пользователями, у которых есть несколько сообщений,...

ORDER BY
Учусь делать sql запросы, и не получается сортировать таблицу по первичному ключу SELECT ...

ORDER BY?
Здравствуйте. Нужна помощ!!! SELECT * FROM paint WHERE paint.id IN (SELECT DISTINCT P_id FROM...

ORDER BY
ORDER BY может сортировать полям перечисленным в SELECT ORDER BY не может отсортировать по полю,...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru