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

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

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

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

18.08.2011, 00:53. Просмотров 3753. Ответов 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) не дает результата если...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
bretba
63 / 58 / 5
Регистрация: 24.07.2011
Сообщений: 343
18.08.2011, 01:01     Дочернее окно #2
Дочернее окно создается так же как и основное с помощью функции createwindow

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
HWND CreateWindowEx(
 
DWORD dwExStyle,       
 LPCTSTR lpClassName,   
 LPCTSTR lpWindowName,  
 DWORD dwStyle,         //  стиль окна
 int x,                
 int y,                 
 int nWidth,            
 int nHeight,           
 HWND hWndParent,      //  дескриптор родительского или окна владельца
 HMENU hMenu,           
 HINSTANCE hInstance,   
 LPVOID lpParam        
 
 );
Важные параметры для дочернего-это HWND hWndParent и DWORD dwStyle

HWND hWndParent-это ссылка на родительский дескриптор
DWORD dwStyle -стиль,который должен быть WS_CHILD
alkagolik
Заблокирован
18.08.2011, 01:09  [ТС]     Дочернее окно #3
а что если сделать вот так?
C++
1
2
HWND hWndParent //как взять дескриптор родительского окна?
dwExStyle = WS_EX_MDICHILD
bretba
63 / 58 / 5
Регистрация: 24.07.2011
Сообщений: 343
18.08.2011, 01:48     Дочернее окно #4
Не понял вопроса?

Цитата Сообщение от alkagolik Посмотреть сообщение
HWND hWnd; //Дескриптор главного окна программы
вот вы сами пишете что это дескриптор главного окна
alkagolik
Заблокирован
18.08.2011, 02:00  [ТС]     Дочернее окно #5
да да, то я сначала спросил, а потом подумал... впопыхах. вот так не работает
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
int APIENTRY _tWinMain(HINSTANCE This, HINSTANCE Prev,
    LPTSTR cmd, int mode)
{
    HWND hWnd, child_OM/*operation memory*/, child_GM/*global memory*/; //Дескрипторы окон
    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
        800,                                //Ширина (widht)
        600,                                //Высота (height)
        HWND_DESKTOP,                       //Дескриптор родительского окна
        NULL,                               //Нет меню
        This,                               //Дескриптор приложения
        NULL                                //Дполнительная информация
        );
 
    child_OM = CreateWindow(
        NULL,
        _T("график "),
        WS_CHILD,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        800,
        300,
        hWnd,
        NULL,
        This,
        NULL
        );
 
    ShowWindow(hWnd, mode);                     //Показать окно
    ShowWindow(child_OM, mode);                 //Показать окно
    //Цикл обработки сообщений
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);             //Функция транслирования кодов нажатой клавиши
        DispatchMessage(&msg);              //Посылает сообщение функции WndProc
    }
    return 0;
}
оговорюсь что WM_PAINT еще не добавлен.
stdcout
53 / 53 / 2
Регистрация: 06.04.2011
Сообщений: 210
18.08.2011, 09:12     Дочернее окно #6
alkagolik,
C
1
2
child_OM = CreateWindow(
                NULL,
Не знаю, как хорошо будет работать ваш код. У вас вместо имени класса для дочернего окна стоит NULL. Но мне кажется, что нужно зарегистрировать класс и для дочернего окна и передать в CreateWindow имя этого класса. И возможно для дочернего окна нужно будет написать отдельный обработчик.
bretba
63 / 58 / 5
Регистрация: 24.07.2011
Сообщений: 343
18.08.2011, 14:48     Дочернее окно #7
stdcout,да...нужно...ведь может быть мы хотим изменить иконку,курсор и многое другое для дочернего окна и самое главное это имя класса естественно...его нужно передавать в функцию createwindow
alkagolik
Заблокирован
18.08.2011, 21:35  [ТС]     Дочернее окно #8
Ну вот я так переделал. Компилирует, но не запускает. ошибка с номером -3 (регистрация дочернего класса) что не так? MessageBos не поддерживает шрифтов рус\англ. Где в свойствах подпрваить?
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#include <Windows.h>
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK ChildProc(HWND, UINT, WPARAM, LPARAM);
 
 
int WINAPI WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    
    HWND hWnd;          //Дескриптор главного окна программы
    MSG msg;            //Структура для хранения сообщения   
    WNDCLASSEX wc;      //Класс главного окна программы
    
    char ClassPName[] = "ClassParent";
    wc.cbSize       = sizeof(wc);
    wc.style        = WS_OVERLAPPEDWINDOW | CS_HREDRAW | CS_HREDRAW;
    wc.lpfnWndProc  = WndProc;
    wc.cbClsExtra   = 0;
    wc.cbWndExtra   = 0;
    wc.hInstance    = hInstance;
    wc.hIcon        = LoadIcon(NULL, IDI_APPLICATION) ;
    wc.hCursor      = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground= (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.lpszMenuName = NULL;
    wc.lpszClassName= (LPWSTR)ClassPName;
    wc.hIconSm      = LoadIcon (NULL, IDI_APPLICATION);
 
    if(!RegisterClassEx(&wc)){
        MessageBox(NULL,(LPCWSTR) "Can't register class parrent",
            (LPCWSTR) "Error", MB_OK);
        return -1;
    }
 
    hWnd = CreateWindowEx(
        WS_EX_CLIENTEDGE,
        (LPWSTR)ClassPName,
        (LPWSTR)"Kursovaya Rabota",
        WS_OVERLAPPEDWINDOW,
        900, 600, 300, 300,
        NULL, NULL,
        hInstance, NULL);
    if(!hWnd){
        MessageBox(NULL,(LPCWSTR) "Can't create parent window",
            (LPCWSTR) "Error", MB_OK);
        return -2;
    }
        
    HWND hChldOM, hChldGM;          //Дескриптор главного окна программы
    WNDCLASSEX wchcl;       //Класс главного окна программы
    
    char ClassChName[]      = "ClassParent";
    wchcl.cbSize            = sizeof(wchcl);
    wchcl.style             = WS_OVERLAPPEDWINDOW|CS_HREDRAW | CS_HREDRAW;
    wchcl.lpfnWndProc       = ChildProc;
    wchcl.cbClsExtra        = 0;
    wchcl.cbWndExtra        = 0;
    wchcl.hInstance         = hInstance;
    wchcl.hIcon             = LoadIcon(NULL, IDI_APPLICATION) ;
    wchcl.hCursor           = LoadCursor(NULL, IDC_ARROW);
    wchcl.hbrBackground     = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wchcl.lpszMenuName      = NULL;
    wchcl.lpszClassName     = (LPWSTR)ClassChName;
    wchcl.hIconSm           = LoadIcon (NULL, IDI_APPLICATION);
 
    if(!RegisterClassEx(&wchcl)){
        MessageBox(NULL,(LPCWSTR) "Can't register child class",
            (LPCWSTR) "Error", MB_OK);
        return -3;
    }
 
    hChldOM = CreateWindowEx(
        WS_EX_CLIENTEDGE,
        (LPWSTR)ClassChName,
        (LPWSTR)"Graphik operativnoy pamyaty",
        WS_CHILD,
        900, 600, 300, 150,
        hWnd, NULL,
        hInstance, NULL);
    if(!hChldOM){
        MessageBox(NULL,(LPCWSTR) "Can't create child window",
            (LPCWSTR) "Error", MB_OK);
        return -4;
    }
    
    hChldGM = CreateWindowEx(
        WS_EX_CLIENTEDGE,
        (LPWSTR)ClassChName,
        (LPWSTR)"Graphik phizicheskoi pamyzti",
        WS_CHILD,
        900, 300, 300, 150,
        hWnd, NULL,
        hInstance, NULL);
    if(!hChldGM){
        MessageBox(NULL,(LPCWSTR) "Can't create child window",
            (LPCWSTR) "Error", MB_OK);
        return -5;
    }
    
    ShowWindow(hWnd, nCmdShow);
    ShowWindow(hChldOM, nCmdShow);
    ShowWindow(hChldGM, nCmdShow);
 
    while(GetMessage(&msg, NULL, 0, 0)){
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return 0;
}
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
        switch (uMsg)
        {
        case WM_DESTROY: 
                PostQuitMessage(0);
                break;
        default: return DefWindowProc(hWnd, uMsg, wParam, lParam);
        }
        return 0;
}
LRESULT CALLBACK ChildProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    if (uMsg == WM_DESTROY )
    {
        return 0;
    }
    return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
Добавлено через 19 минут
Подправил строку 52, запустилось. но кракозябры все равно остались
stdcout
53 / 53 / 2
Регистрация: 06.04.2011
Сообщений: 210
18.08.2011, 21:48     Дочернее окно #9
alkagolik, Почитай лучше хорошую литературу, поищи темы в разделе WinAPI. Так для тебя и быстрее будет и понятнее что да как.
alkagolik
Заблокирован
18.08.2011, 22:16  [ТС]     Дочернее окно #10
Цитата Сообщение от stdcout Посмотреть сообщение
alkagolik, Почитай лучше хорошую литературу, поищи темы в разделе WinAPI. Так для тебя и быстрее будет и понятнее что да как.
Нету ни желания ни времени. Работать в Виндовс и так напряжение, а кодить для говноОС напряжение вдвойне. Уж и так читаю читаю и понять все не могу зачем в ядре столько уровней, и зачем такой ГИГАНТСКИЙ набор API функций.... и еще много к чему придраться есть Но это все оффтоп.
jonson
18.08.2011, 22:30
  #11

Не по теме:

Цитата Сообщение от alkagolik Посмотреть сообщение
Работать в Виндовс и так напряжение, а кодить для говноОС напряжение вдвойне.
Странный вывод... Врятли есть ОС где вам придраться будет не к чему

alkagolik
Заблокирован
18.08.2011, 22:35  [ТС]     Дочернее окно #12
jonson, спокойно товарищ, не вывод, а субъективное восприятие + привычки + раздраженность от перемены рабочей среды. Эмоционально конечно, но доля истины есть... а по теме? Я читаю Литвиненко "Программирование на С win32api" в очень плохом качестве, но содержание как раз то что надо, есть в хорошем?
jonson
232 / 205 / 61
Регистрация: 18.03.2010
Сообщений: 749
18.08.2011, 23:05     Дочернее окно #13
я так понял вам нужен многооконный интерфейс средствами WinAPI.
вот тут или тут гляньте, по моему достаточно ясно.
alkagolik
Заблокирован
19.08.2011, 03:05  [ТС]     Дочернее окно #14
Ну в принципе есть окошко, с двумя дочками, кодировки в проекте выстроил, только не пойму как вторую дочку привязать к родителю левым нижним углом к левому нижнему углу родителя, а так процесс идет, не стоит на месте. Этот вопрос специфический, сходу не нагуглишь. подскажите кто знает. код:
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#include <Windows.h>
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK ChildProc(HWND, UINT, WPARAM, LPARAM);
 
 
int WINAPI WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    
    HWND hWnd;          //Дескриптор главного окна программы
    MSG msg;            //Структура для хранения сообщения   
    WNDCLASSEX wc;      //Класс главного окна программы
    
    char ClassPName[] = "ClassParent";
    wc.cbSize       = sizeof(wc);
    wc.style        = CS_HREDRAW | CS_HREDRAW;
    wc.lpfnWndProc  = WndProc;
    wc.cbClsExtra   = 0;
    wc.cbWndExtra   = 0;
    wc.hInstance    = hInstance;
    wc.hIcon        = LoadIcon(NULL, IDI_APPLICATION) ;
    wc.hCursor      = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground= (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.lpszMenuName = NULL;
    wc.lpszClassName= ClassPName;
    wc.hIconSm      = LoadIcon (NULL, IDI_APPLICATION);
 
    if(!RegisterClassEx(&wc)){
        MessageBox(NULL, "не удается зарегистрировать родительский класс",
            "Ошибка!", MB_OK);
        return -1;
    }
 
    hWnd = CreateWindowEx(
        WS_EX_CLIENTEDGE,
        ClassPName,
        "Курсовая работа",
        WS_OVERLAPPEDWINDOW,
        250, 250, 800, 600,
        NULL, NULL,
        hInstance, NULL);
    if(!hWnd){
        MessageBox(NULL,"не удается создать родительское окно",
            "Ошибка!", MB_OK);
        return -2;
    }
        
    HWND hChldOM, hChldGM;          
    WNDCLASSEX wchcl;
    
    char ClassChName[]      = "ClassChild";
    wchcl.cbSize            = sizeof(wchcl);
    wchcl.style             = CS_HREDRAW | CS_HREDRAW;
    wchcl.lpfnWndProc       = ChildProc;
    wchcl.cbClsExtra        = 0;
    wchcl.cbWndExtra        = 0;
    wchcl.hInstance         = hInstance;
    wchcl.hIcon             = LoadIcon(NULL, IDI_APPLICATION) ;
    wchcl.hCursor           = LoadCursor(NULL, IDC_ARROW);
    wchcl.hbrBackground     = (HBRUSH)GetStockObject(GRAY_BRUSH);
    wchcl.lpszMenuName      = NULL;
    wchcl.lpszClassName     = ClassChName;
    wchcl.hIconSm           = LoadIcon (NULL, IDI_APPLICATION);
 
    if(!RegisterClassEx(&wchcl)){
        MessageBox(NULL, "не удается зарегистрировать дочерний класс",
            "Ошибка!", MB_OK);
        return -3;
    }
 
    hChldOM = CreateWindowEx(
        WS_EX_CLIENTEDGE,
        ClassChName,
        "График оперативной памяти",
        WS_CHILD|WS_BORDER|WS_VISIBLE,
        CW_USEDEFAULT, CW_USEDEFAULT, 800, 300,
        hWnd, NULL,
        hInstance, NULL);
    if(!hChldOM){
        MessageBox(NULL,"Не удается создать дочернее окно",
            "Ошибка!", MB_OK);
        return -4;
    }
    
    hChldGM = CreateWindowEx(
        WS_EX_CLIENTEDGE,
        ClassChName,
        "График глобальной памяти",
        WS_CHILD|WS_BORDER|WS_VISIBLE,
        CW_USEDEFAULT, 550, 800, 300,
        hWnd, NULL,
        hInstance, NULL);
    if(!hChldGM){
        MessageBox(NULL,"не удается создать дочернее окно",
            "Ошибка", MB_OK);
        return -5;
    }
    
    ShowWindow(hWnd, nCmdShow);
    ShowWindow(hChldOM, nCmdShow);
    ShowWindow(hChldGM, nCmdShow);
    
    while(GetMessage(&msg, NULL, 0, 0)){
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return 0;
}
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
        case WM_CREATE:
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default: return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
    return 0;
}
LRESULT CALLBACK ChildProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    if (uMsg == WM_DESTROY )
    {
        return 0;
    }
    return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
Добавлено через 8 минут
jonson, спасибо, а то я вот отсюда читал, прямо жуть, но лучше не нашел... знал бы что искать. Но я так и не понял толком что такое MDI. Это фреймы в родителе? это всплывающие диалоги? в смысле их природа какая?

Добавлено через 3 часа 49 минут
В общем проблема такого характера. При попытке вызвать
C++
1
2
3
4
5
...
case WM_SIZE:
    GetClientRect(hWnd, &rcClient);
    MoveWindow(hChldOM, ...);
...
Естественно необъявленный идентификатор hChldOM
При попытке создать дочки в процедуре WinProc не хватает параметра hInstance, хотел его хранить в промежуточной переменной. но он вообще не инициализирован. Как быть? что делать?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.08.2011, 08:35     Дочернее окно
Еще ссылки по теме:

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
stdcout
53 / 53 / 2
Регистрация: 06.04.2011
Сообщений: 210
19.08.2011, 08:35     Дочернее окно #15
alkagolik, при обработке сообщения WM_CREATE параметр lParam фактически является указателем на структуру типа CREATESTRUCT. В этой структуре есть поле hInstance, которое ты задаёшь предпоследним параметром в CreateWindowEx. Создай статическую переменную и сохрани в неё значение hInstance. Примерно так:
C
1
2
3
4
5
6
7
8
9
10
static HINSTANCE hInstance;
/*  */
switch (uMsg)
{
    case WM_CREATE:
        hInstance = ((CREATESTRUCT *) lParam)->hInstance;
        return 0;
    /*  */
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
Yandex
Объявления
19.08.2011, 08:35     Дочернее окно
Ответ Создать тему
Опции темы

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