Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.84/50: Рейтинг темы: голосов - 50, средняя оценка - 4.84
 Аватар для alkagolik
1599 / 622 / 113
Регистрация: 15.07.2011
Сообщений: 3,548

Дочернее окно

18.08.2011, 00:53. Показов 10132. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не могу найти как создается дочернее окно. Надо подготовить курсовик по WinApi. Я долго оттягивал, но делать - то надо. Что же, придется убить время на программирование для виндовс, может и пригодится. Итак, задача у меня для низкого старта, так что я буду в этой теме спрашивать по мере необходимости. На данном этапе мне нужно просто создать 2 дочерних окна. Вот пока есть сам скелет, на который будет натягиваться кожа.
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
#include <windows.h>
#include <tchar.h>
 
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
TCHAR WinName[] = _T("MainFrame");
int APIENTRY _tWinMain(HINSTANCE This, HINSTANCE Prev,
    LPTSTR cmd, int mode)
{
    HWND hWnd;     //Дескриптор главного окна программы
    MSG msg;       //Структура для хранения сообщения  
    WNDCLASS wc;   //Класс окна с дальнейшим его определением
 
    wc.hInstance        = This;
    wc.lpszClassName    = WinName;                              //Имя класса окна
    wc.lpfnWndProc      = WndProc;                              //Функция окна
    wc.style            = CS_HREDRAW |CS_VREDRAW;               //Стиль окна
    wc.hIcon            = LoadIcon (NULL, IDI_WINLOGO);         //Иконка по умолчанию
    wc.hCursor          = LoadCursor (NULL, IDC_ARROW);         //Курсор мыши
    wc.lpszMenuName     = NULL;                                 //Меню нету
    wc.cbClsExtra       = 0;                                    //Нет доролнительных данных класса
    wc.cbWndExtra       = 0;                                    //Нет дополнительных данных
    wc.hbrBackground    = (HBRUSH)(COLOR_WINDOW+1);             //Заполнение окна белым цветом
    //Регистрация класса окна
    RegisterClass(&wc);
        
    hWnd = CreateWindow(WinName,            //имя класса окна
        _T("Каркасс оконного приложения"), //Заголовок окна
        WS_OVERLAPPEDWINDOW,                //стиль окна
        CW_USEDEFAULT,                      //x
        CW_USEDEFAULT,                      //y
        CW_USEDEFAULT,                      //Ширина (widht)
        CW_USEDEFAULT,                      //Высота (height)
        HWND_DESKTOP,                       //Дескриптор родительского окна
        NULL,                               //Нет меню
        This,                               //Дескриптор приложения
        NULL                                //Дполнительная информация
        );
    ShowWindow(hWnd, mode);                 //Показать окно
    //Цикл обработки сообщений
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);             //Функция транслирования кодов нажатой клавиши
        DispatchMessage(&msg);              //Посылает сообщение функции WndProc
    }
    return 0;
}
//Оконная процедура. Вызывается ОС-й и получает сообщения из очереди
//для данного приложения
LRESULT CALLBACK WndProc (HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
    switch (Message)
    {
    case WM_DESTROY: 
        PostQuitMessage(0);
        break;
    default: return DefWindowProc(hWnd, Message, wParam, lParam);
    }
    return 0;
}
Как я понимаю надо объявить еще две переменные void* рядом и описать их?
C++
1
HWND hWnd, child_1, child_2;
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.08.2011, 00:53
Ответы с готовыми решениями:

Создаю окно CWnd дочернее к диалогу, проблема с NWHD
MyWnd = new CWnd срабатывает; MyWnd-&gt;Create(...) Срабатывает; MyWnd-&gt;ShowWindow(...) Застревает. В реализации ShowWindow не проходит...

Создать класс окно, используя композицию и иерархию, определить окно заголовком и кнопкой.
Создать класс окно, используя композицию и иерархию, определить окно заголовком и кнопкой. Класс заголовок и окно тоже должны быть...

Создать окно с кнопкой, закрывающей это окно
Создайте новый оконный проект в ОС Microsoft Windows 7 или Linux. Разместите посередине окна кнопку с надписью &quot;Close&quot;. После...

25
53 / 53 / 2
Регистрация: 06.04.2011
Сообщений: 209
20.08.2011, 09:30
Студворк — интернет-сервис помощи студентам
alkagolik, При создании дочерних окон Вы задаёте в качестве параметра hMenu - идентификатор дочернего окна (например, (HMENU) ID_CHILD), то есть целое число (но только для дочерних окон, для родительских этот параметр является описателем меню). Зная описатель дочернего окна, можно получить идентификатор этого окна.
C
1
id = GetWindowLong(hwnd, GWL_ID);
alkagolik,
C
1
2
3
4
GetClientRect(hChldOM, &rect);
 
        ymax = rect.bottom - 10;
        ymin = rect.top +5;
При заходе в оконную процедуру каждый раз вычисляется это. Не лучше ли вычислять только тогда, когда это действительно нужно.
C
1
2
3
4
case WM_TIMER:
       checkOM = true;
       break;
case WM_PAINT:
рисуется только один пиксель потому, что Вы не правильно перерисовываете. В функции WM_PAINT, то есть при получении описателя контекста устройства с помощью функции BeginPaint Вы можете рисовать только в так называемой недействительной области окна (т. е. та, которую действительно нужно перерисовать), которая является прямоугольником ps.rcPaint. За пределами этой области рисовать нельзя. Это сделано для того, чтобы не перерисовывать то, что не нужно, и ускорить процесс рисования. Поэтому при обработке сообщения WM_TIMER Вам необходимо использовать функцию InvalidateRect для установки недействительной области.
C
1
2
3
4
5
6
BOOL InvalidateRect(
  __in  HWND hWnd,          
  __in  const RECT *lpRect,  /* недействительная область, если == NULL, то вся клиентская область */
  __in  BOOL bErase   /* если == TRUE, то фон окна в недействительной стирается,
                                                т. е. закрашивается кистью фона */
);
Т. к. сообщение WM_PAINT извлекается из очереди сообщений последним, то можете использовать функцию (после InvalidateRect)
C
1
UpdateWindow(hwnd);
, чтобы немедленно обработать сообщение WM_PAINT.
1
 Аватар для alkagolik
1599 / 622 / 113
Регистрация: 15.07.2011
Сообщений: 3,548
21.08.2011, 17:51  [ТС]
Ну в принципе график построен, точечный конечно смотрится не фонтан, но надо точечный. Может есть какие предложения\замечания
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
case WM_CREATE:
        SetTimer(hChldOM, TIMER_CHILDOM, 1000, NULL);
        break;
case WM_TIMER:
        InvalidateRect(hChldOM, &rect, true);
        ymax = rect.bottom - 10;
        ymin = rect.top +5;
 
        if (xOM <= rect.left + 10) {xOM = rect.right-15; j = 0;}
        --xOM;
        ++j;
        MEMORYSTATUSEX statex;
        statex.dwLength = sizeof(statex);
        GlobalMemoryStatusEx(&statex);
        percent = statex.dwMemoryLoad;
        yOM = ymax - (ymax - ymin)*percent/100;
        ptOM[j].x = xOM;
        ptOM[j].y = yOM;
        break;
case WM_PAINT:
        hDC = BeginPaint(hChldOM, &ps);
        GetClientRect(hChldOM, &rect);
        //отрисовка осей координат
        x = rect.left + 10;
        y = rect.bottom - 10;
        SelectObject(hDC, hpen1);
        MoveToEx(hDC, x, y, NULL);
        LineTo(hDC, x, rect.top +5);
        MoveToEx(hDC, x, y, NULL);
        LineTo(hDC, rect.right - 15, y);
        MoveToEx(hDC, x, y, NULL);
        tmp = (y - rect.top + 5)/4;
        MoveToEx(hDC, x, y - tmp, NULL);
        SelectObject(hDC, hpen2);
        LineTo(hDC, rect.right - 15, y - tmp);
        MoveToEx(hDC, x, y - 2 * tmp, NULL);
        LineTo(hDC, rect.right - 15, y - 2 * tmp);
        MoveToEx(hDC, x, y - 3 * tmp, NULL);
        LineTo(hDC, rect.right - 15, y - 3 * tmp);
        //вывод текста
        rect.left = rect.left + 15;
        DrawText(hDC, "Оперативная память", -1, &rect, DT_LEFT | DT_TOP);
        GetClientRect(hChldOM, &rect);
        // график
        for (int i = rect.right-15; i>0; --i)
        {
            SetPixel(hDC, ptOM[i].x, ptOM[i].y, (RGB(255,000,000)));
        }
 
        EndPaint(hChldOM, &ps);
        UpdateWindow(hChldOM);
        break;
Добавлено через 20 часов 56 минут
ааа, как тут можно работать , никакой свободы, VS все делает за тебя, если бы еще и код писала, то я бы молчал, а так пол дня гребаный ресурс не могу сткорректировать. Как запретить среде самостоятельно редактировать resource.rc и resource.h? т.е. чтобы их правил я, а не ядро оболочки.
0
 Аватар для alkagolik
1599 / 622 / 113
Регистрация: 15.07.2011
Сообщений: 3,548
21.08.2011, 20:31  [ТС]
Вот у меня есть такой диалог
C++
1
2
3
4
case ID_40002:
    CreateDialog(hInst, MAKEINTRESOURCE(IDD_DIALOG1),
        hWnd, (DLGPROC)DialogProc);
    break;
вот его процедура
C++
1
2
3
4
5
6
7
8
9
10
INT_PTR CALLBACK DialogProc(HWND hDlg,UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    }
    return 0;
}
вот его макрос (правильно назвал?)
C++
1
2
3
4
5
6
7
8
IDD_DIALOG1 DIALOGEX 0, 0, 288, 146
STYLE DS_SETFONT | DS_SETFOREGROUND | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_NOINHERITLAYOUT
CAPTION "Dialog"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
    DEFPUSHBUTTON   "ОК",IDOK,231,125,50,14
END
так же его снимок. Как в него добавить еще области вывода? В частности 1 область для bitmap, 2 -для текста с вычисленной информацией
Миниатюры
Дочернее окно  
0
 Аватар для jonson
240 / 213 / 84
Регистрация: 18.03.2010
Сообщений: 750
21.08.2011, 20:46

Не по теме:

Цитата Сообщение от alkagolik Посмотреть сообщение
ааа, как тут можно работать , никакой свободы, VS все делает за тебя
А я то подумал что VS правда всё за тебя делает;)



Цитата Сообщение от alkagolik Посмотреть сообщение
Как в него добавить еще области вывода?
И что мешает перетащить их с панели инструментов, или написать кодом?
0
 Аватар для alkagolik
1599 / 622 / 113
Регистрация: 15.07.2011
Сообщений: 3,548
22.08.2011, 03:50  [ТС]
Цитата Сообщение от jonson Посмотреть сообщение
[OFF]
или написать кодом?
ключи поиска. Но это я уже нашел, сейчас ищу как вставить битмап. Ну да, я маялся столько. напишешь ресурс, только закрыл, поправил хедер, тут ресурс испорчен, поправил ресурс, а он все равно какой-то подбитый, то ide вылетает с ошибкой, то правишь ресурс, сохраняешь, открываешь, а он такой же как и был. Конечно такие "приятные" неожиданности отталкивают.

Добавлено через 6 часов 2 минуты
Ну тут дальше без коренных виновсов с наскока не обойтись нужно теперь считать из реестра информацию произвольных железа и софта. Скажем так, какие ключи реестра нужно использовать чтобы считать: 1. информацию о сетевых контроллерах; 2. ОС?
0
 Аватар для jonson
240 / 213 / 84
Регистрация: 18.03.2010
Сообщений: 750
22.08.2011, 16:52
ну ОС вроде здесь HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Wi ndows NT\CurrentVersion
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.08.2011, 16:52

В SDL2 мне нужно создать окно и туда вставить предметы, но только создается окно а предметы не додаются
И я не знаю что не так. Взял код с туториала. Нужна ваша помощь Мой код:#include &quot;pch.h&quot; #include &quot;SDL.h&quot; ...

Дочернее окно копируется в не дочернее(хотя не должно)
При нажатии кнопки появляется окно, но вместо того, что бы отрисоваться как надо, в него копируется дочернее окно главного окна. При...

Закрыть дочернее окно и открыть в единственном экземпляре Главное окно
Есть главная форма Main Form , там кнопка Button 1 при нажатии на Button 1 открывыется дочерняя форма Form 1, на фомрме Form 1 есть кнопка...

Создать модальное окно (дочернее окно) как в одноклассниках
Здраствуйте всем, Нужна помощь. Я хочу создать модальное окно (дочерное окно) в ASP.NET на примере как в одноклассниках. В...

Создать дочернее окно из программы (окно внутри окна)
Люди, помогите плиз!!!!!!!!!!!!! Подскажите, как в Lazaruse создать дочернее окно из программы (окно в нути окна ), в Делфи нет...


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

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Новые блоги и статьи
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru