Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 28, средняя оценка - 4.68
alkagolik
Заблокирован
#1

Дочернее окно - C++

18.08.2011, 00:53. Просмотров 3709. Ответов 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;
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.08.2011, 00:53     Дочернее окно
Посмотрите здесь:

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

Дочернее окно - C++ WinAPI
Создаю дочернее окно - оно создается но перетаскивать его за пределы окна родителя нельзя, а мне нужно чтобы можно было, эксперементировал...

Дочернее окно - C++ WinAPI
Есть код, в нём создал главное окно, и дочернее. Но как сделать так, что бы по щелчку на дочернее окно, для него появлялось ещё одно...

Дочернее окно - Visual C++
скажите, как создать дочернее окно с помощью WinAPI, чтобы внешне оно не отличалось от родительского (его можно было двигать, закрывать на...

Дочернее окно - C#
Подскажите, плиз, как сделать так чтобы дочернее окно могло перемещаться только внутри родительского...

Дочернее окно - C++ WinAPI
Не могу создать дочернее окно. Выдает ошибку. Заранее спасибо за любую помощь: LRESULT CALLBACK ChildProc(HWND hWnd, UINT uMsg, WPARAM...

Дочернее окно - C#
Как создать окно наподобии ShowDialog но с возможностью динамически добавлять UserControl? Controls.Add(xxx) не дает результата если...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
stdcout
53 / 53 / 2
Регистрация: 06.04.2011
Сообщений: 210
20.08.2011, 09:30     Дочернее окно #21
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.
alkagolik
Заблокирован
21.08.2011, 17:51  [ТС]     Дочернее окно #22
Ну в принципе график построен, точечный конечно смотрится не фонтан, но надо точечный. Может есть какие предложения\замечания
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? т.е. чтобы их правил я, а не ядро оболочки.
alkagolik
Заблокирован
21.08.2011, 20:31  [ТС]     Дочернее окно #23
Вот у меня есть такой диалог
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 -для текста с вычисленной информацией
Миниатюры
Дочернее окно  
jonson
231 / 204 / 61
Регистрация: 18.03.2010
Сообщений: 749
21.08.2011, 20:46     Дочернее окно #24

Не по теме:

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



Цитата Сообщение от alkagolik Посмотреть сообщение
Как в него добавить еще области вывода?
И что мешает перетащить их с панели инструментов, или написать кодом?
alkagolik
Заблокирован
22.08.2011, 03:50  [ТС]     Дочернее окно #25
Цитата Сообщение от jonson Посмотреть сообщение
[OFF]
или написать кодом?
ключи поиска. Но это я уже нашел, сейчас ищу как вставить битмап. Ну да, я маялся столько. напишешь ресурс, только закрыл, поправил хедер, тут ресурс испорчен, поправил ресурс, а он все равно какой-то подбитый, то ide вылетает с ошибкой, то правишь ресурс, сохраняешь, открываешь, а он такой же как и был. Конечно такие "приятные" неожиданности отталкивают.

Добавлено через 6 часов 2 минуты
Ну тут дальше без коренных виновсов с наскока не обойтись нужно теперь считать из реестра информацию произвольных железа и софта. Скажем так, какие ключи реестра нужно использовать чтобы считать: 1. информацию о сетевых контроллерах; 2. ОС?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.08.2011, 16:52     Дочернее окно
Еще ссылки по теме:

Дочернее окно - C++ WinAPI
Доброго времени суток. Продолжаю писать свою программу, возникла проблема. Я пытался сделать, чтобы дочернее окно открывалось так: скрин....

Дочернее окно - C++ WinAPI
Задание: дочернее окно должно убегать от курсора мыши в пределах рабочей области родительского окна. Вот код: #include &quot;stdafx.h&quot; ...

Показать дочернее окно - C++ WinAPI
господа у меня дочернее окно находится в состаянии SW_HIDE затем в программе делаются определённые действия и дочернее окно должно...

Не закрывается дочернее окно - C++ WinAPI
Здравствуйте, объясните пожалуйста, почему дочернее окно не закрывается и вообще ни на что не реагирует. И как это можно исправить. ...

Дочернее главное окно - C++ Qt
У меня есть 2 формы. Как мне открыть одну форму обычным способом, а вторую форму таким образом, чтобы нельзя было изменить фокус на первое...


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

Или воспользуйтесь поиском по форуму:
jonson
231 / 204 / 61
Регистрация: 18.03.2010
Сообщений: 749
22.08.2011, 16:52     Дочернее окно #26
ну ОС вроде здесь HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
Yandex
Объявления
22.08.2011, 16:52     Дочернее окно
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru