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

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

18.08.2011, 00:53. Показов 9805. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу 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