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

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

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

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

18.08.2011, 00:53. Просмотров 3771. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Дочернее окно (C++):

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

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

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

Как сделать окно (окно домика) в пространстве, как на изображении? - C++
Здравствуйте, как сделать окно в пространстве, как на изображении? сделал крышу и &quot;фундамент&quot;: for (int i = 0, x = 9; i &lt; 21;...

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
alkagolik
Заблокирован
19.08.2011, 20:24  [ТС] #16
Ну все пока идет гут. Подскажите пожалуйста почему я рисую одно дочернее окно. а перерисовывается сразу два? как тут подпилить?
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
#include <Windows.h>
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK ChildProc(HWND, UINT, WPARAM, LPARAM);
BOOL CALLBACK EnumChildProc(HWND hWnd, LPARAM lParam);
 
char ClassChName[]  = "ClassChild";
char ClassPName[] = "ClassParent";
 
 
int WINAPI WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    
    HWND hWnd;          //Дескриптор главного окна программы
    MSG msg;            //Структура для хранения сообщения   
    WNDCLASSEX wc;      //Класс главного окна программы
    
    
    wc.cbSize       = sizeof(wc);
    wc.style        = CS_OWNDC;
    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,
        //(WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | \
        WS_MAXIMIZEBOX) &~(WS_THICKFRAME),
        250, 250, 600, 480,
        NULL, NULL,
        hInstance, NULL);
    if(!hWnd){
        MessageBox(NULL,"не удается создать родительское окно",
            "Ошибка!", MB_OK);
        return -2;
    }
    
    ShowWindow(hWnd, nCmdShow);
    while(GetMessage(&msg, NULL, 0, 0)){
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return 0;
}
 
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    RECT rect;
    PAINTSTRUCT ps;
    HDC hDC;
    int xGM, yGM, xOM, yOM;
    HWND hChldOM, hChldGM;
    static HINSTANCE hInst;
 
 
    switch (uMsg)
    {
        case WM_CREATE:
            hInst = ((CREATESTRUCT*)lParam)->hInstance;
                        
            WNDCLASSEX wchcl;
            wchcl.cbSize            = sizeof(wchcl);
            wchcl.style             = CS_HREDRAW | CS_HREDRAW;
            wchcl.lpfnWndProc       = ChildProc;
            wchcl.cbClsExtra        = 0;
            wchcl.cbWndExtra        = 0;
            wchcl.hInstance         = hInst;
            wchcl.hIcon             = LoadIcon(NULL, IDI_APPLICATION) ;
            wchcl.hCursor           = LoadCursor(NULL, IDC_ARROW);
            wchcl.hbrBackground     = (HBRUSH)GetStockObject(WHITE_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, 
                0, 0, 600, 220,
                hWnd, NULL, hInst, NULL);
 
            if(!hChldOM){
                MessageBox(NULL,"Не удается создать дочернее окно",
                    "Ошибка!", MB_OK);
                return -4;
            }
 
            hChldGM = CreateWindowEx(WS_EX_CLIENTEDGE, ClassChName,
                "График глобальной памяти", WS_CHILD|WS_BORDER|WS_VISIBLE,
                0, 220, ((CREATESTRUCT*)lParam)->cx, (((CREATESTRUCT*)lParam)->cy)/2,
                hWnd, NULL, hInst, NULL);
            if(!hChldGM){
                MessageBox(NULL,"не удается создать дочернее окно",
                    "Ошибка", MB_OK);
                return -5;
            }
 
            if(!ShowWindow(hChldOM, SW_SHOW)){
                MessageBox(NULL,"!ShowWindow(hChldOM, SW_SHOWNORMAL)",
                    "Ошибка", MB_OK);
                return -6;
            }
            if(!ShowWindow(hChldGM, SW_SHOW)){
                MessageBox(NULL,"!ShowWindow(hChldOM, SW_SHOWNORMAL)",
                    "Ошибка", MB_OK);
                return -7;
            }
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default: return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
    return 0;
}
 
LRESULT CALLBACK ChildProc(HWND hChldGM, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    RECT rect;
    HDC hDC;
    PAINTSTRUCT ps;
    int x, y;
    static HPEN hpen;
    if (uMsg == WM_DESTROY )
    {
        return 0;
    }
    switch(uMsg)
    {
    case WM_PAINT:
        hDC = BeginPaint(hChldGM, &ps);
        GetClientRect(hChldGM, &rect);
        x = rect.left + 5;
        y = rect.bottom + 5;
        SelectObject(hDC, hpen);
        MoveToEx(hDC, x, y, NULL);
        LineTo(hDC, x, rect.top -5);
        EndPaint(hChldGM, &ps);
 
    }
    return DefWindowProc(hChldGM, uMsg, wParam, lParam);;
}
Добавлено через 1 час 6 минут
Я конечно понимаю что можно реализовать отдельный класс и отдельную процедуру для каждой дочки. Но надо ли это делать? Или именно так и надо сделать?
stdcout
53 / 53 / 2
Регистрация: 06.04.2011
Сообщений: 210
19.08.2011, 21:44 #17
alkagolik, основная суть класса в том, чтобы предоставить всем окнам данного класса определённую процедуру (на которую указывает член lpfnWndProc структуры WNDCLASSEX), ну ещё там иконка, курсор и т. д. Если для всех дочерних окон необходимо примерно одинаковое поведение, то естественно, что достаточно одного класса.
alkagolik
Заблокирован
20.08.2011, 01:28  [ТС] #18
Цитата Сообщение от stdcout Посмотреть сообщение
Если для всех дочерних окон необходимо примерно одинаковое поведение
Поведение действительно необходимо одинаковое, даже не примерно а полностью, только для разных дочек с разными данными. И все таки как в общей процедуре выловить отдельное окно? Или все таки правильно слепить разные классы и процедуры?

Добавлено через 2 часа 33 минуты
В общем я пока описал отдельные класс и процедуру для каждой дочки, не знаю правильно или нет, но пока пусть будет так. Установил таймеры. Надо чтобы по срабатывании таймера рисовался график в дочке. Пока решение вижу так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
bool check = false //глобальная переменная
....
LRESULT CALLBACK ChildProcOM(HWND hChldOM, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
      ...
      case WM_TIMER:
            check = true;
      case WM_PAINT:
            if (check){
                 check = false;
                 ....
            }
}
В принципе конструкция должна работать, сейчас напишу проверю. Правильно такое решение или есть иное, которое принципиально?

Добавлено через 13 минут
конструкция работает, какая функция считывает информацию об оперативной памяти системы?
jonson
232 / 205 / 61
Регистрация: 18.03.2010
Сообщений: 749
20.08.2011, 02:17 #19
Цитата Сообщение от alkagolik Посмотреть сообщение
какая функция считывает информацию об оперативной памяти системы?
тыц сюда
alkagolik
Заблокирован
20.08.2011, 03:46  [ТС] #20
jonson, спасибо, но это был скорее риторический вопрос. msdn how to get RAM. Но по сути вопроса, Не работает рисование графика с таймером LRESULT CALLBACK ChildProcOM строка 165
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
#include <Windows.h>
 
#define TINER_CHILDOM 1
#define TINER_CHILDGM 2
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK ChildProcGM(HWND hChldGM, UINT uMsg, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK ChildProcOM(HWND hChldOM, UINT uMsg, WPARAM wParam, LPARAM lParam);
 
char const ClassChNameOM[]  = "ClassChildOM";
char const ClassChNameGM[]  = "ClassChildGM";
char const ClassPName[]     = "ClassParent";
 
static HPEN hpen1 = CreatePen(PS_SOLID, 2, RGB(128, 128, 128));
static HPEN hpen2 = CreatePen(PS_SOLID, 1, RGB(192, 192, 192));
 
static int xOM = 0, yOM = 0, xGM = 0, yGM = 0;
bool checkOM = false, checkGM = false;
 
int WINAPI WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    
    HWND hWnd;          //Дескриптор главного окна программы
    MSG msg;            //Структура для хранения сообщения   
    WNDCLASSEX wc;      //Класс главного окна программы
    
    
    wc.cbSize       = sizeof(wc);
    wc.style        = CS_OWNDC;
    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,
        (WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | 
        WS_MAXIMIZEBOX) &~(WS_THICKFRAME),
        250, 250, 600, 480,
        NULL, NULL,
        hInstance, NULL);
    if(!hWnd){
        MessageBox(NULL,"не удается создать родительское окно",
            "Ошибка!", MB_OK);
        return -2;
    }
    
    ShowWindow(hWnd, nCmdShow);
    while(GetMessage(&msg, NULL, 0, 0)){
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return 0;
}
 
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    HWND hChldOM, hChldGM;
    static HINSTANCE hInst;
 
 
    switch (uMsg)
    {
        case WM_CREATE:
            hInst = ((CREATESTRUCT*)lParam)->hInstance;
                        
            WNDCLASSEX wchclOM;
            wchclOM.cbSize          = sizeof(wchclOM);
            wchclOM.style               = CS_HREDRAW | CS_HREDRAW;
            wchclOM.lpfnWndProc     = ChildProcOM;
            wchclOM.cbClsExtra      = 0;
            wchclOM.cbWndExtra      = 0;
            wchclOM.hInstance           = hInst;
            wchclOM.hIcon               = LoadIcon(NULL, IDI_APPLICATION) ;
            wchclOM.hCursor         = LoadCursor(NULL, IDC_ARROW);
            wchclOM.hbrBackground       = (HBRUSH)GetStockObject(WHITE_BRUSH);
            wchclOM.lpszMenuName        = NULL;
            wchclOM.lpszClassName       = ClassChNameOM;
            wchclOM.hIconSm         = LoadIcon (NULL, IDI_APPLICATION);
 
            if(!RegisterClassEx(&wchclOM)){
                MessageBox(NULL, "не удается зарегистрировать дочерний класс",
                    "Ошибка!", MB_OK);
                return -3;
            }
            
            WNDCLASSEX wchclGM;
            wchclGM.cbSize          = sizeof(wchclGM);
            wchclGM.style               = CS_HREDRAW | CS_HREDRAW;
            wchclGM.lpfnWndProc     = ChildProcGM;
            wchclGM.cbClsExtra      = 0;
            wchclGM.cbWndExtra      = 0;
            wchclGM.hInstance           = hInst;
            wchclGM.hIcon               = LoadIcon(NULL, IDI_APPLICATION) ;
            wchclGM.hCursor         = LoadCursor(NULL, IDC_ARROW);
            wchclGM.hbrBackground       = (HBRUSH)GetStockObject(WHITE_BRUSH);
            wchclGM.lpszMenuName        = NULL;
            wchclGM.lpszClassName       = ClassChNameGM;
            wchclGM.hIconSm         = LoadIcon (NULL, IDI_APPLICATION);
 
            if(!RegisterClassEx(&wchclGM)){
                MessageBox(NULL, "не удается зарегистрировать дочерний класс",
                    "Ошибка!", MB_OK);
                return -4;
            }
 
            hChldOM = CreateWindowEx(WS_EX_CLIENTEDGE, ClassChNameOM,
                "График оперативной памяти", WS_CHILD|WS_BORDER|WS_VISIBLE, 
                0, 0, 600, 220,
                hWnd, NULL, hInst, NULL);
 
            if(!hChldOM){
                MessageBox(NULL,"Не удается создать дочернее окно",
                    "Ошибка!", MB_OK);
                return -5;
            }
 
            hChldGM = CreateWindowEx(WS_EX_CLIENTEDGE, ClassChNameGM,
                "График глобальной памяти", WS_CHILD|WS_BORDER|WS_VISIBLE,
                0, 220, 600, 220,
                hWnd, NULL, hInst, NULL);
            if(!hChldGM){
                MessageBox(NULL,"не удается создать дочернее окно",
                    "Ошибка", MB_OK);
                return -6;
            }
 
            if(!ShowWindow(hChldOM, SW_SHOW)){
                MessageBox(NULL,"!ShowWindow(hChldOM, SW_SHOWNORMAL)",
                    "Ошибка", MB_OK);
                return -7;
            }
            if(!ShowWindow(hChldGM, SW_SHOW)){
                MessageBox(NULL,"!ShowWindow(hChldOM, SW_SHOWNORMAL)",
                    "Ошибка", MB_OK);
                return -8;
            }
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default: return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
    return 0;
}
 
LRESULT CALLBACK ChildProcOM(HWND hChldOM, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    RECT rect;
    HDC hDC;
    PAINTSTRUCT ps;
    static int x, y, tmp, ymax, ymin;
    GetClientRect(hChldOM, &rect);
 
    ymax = rect.bottom - 10;
    ymin = rect.top +5;
    
    switch(uMsg)
    {
    case WM_CREATE:
        SetTimer(hChldOM, TINER_CHILDOM, 1000, NULL);
        break;
    case WM_TIMER:
        checkOM = true;
        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);
        if (checkOM){
            checkOM = false;
            if (xOM <= rect.left + 10) xOM = rect.right;
            --xOM;
            MEMORYSTATUSEX statex;
            statex.dwLength = sizeof(statex);
            GlobalMemoryStatusEx(&statex);
            yOM = ymax - (ymax - ymin)/(statex.ullTotalPhys/statex.ullAvailPhys);
            SetPixel(hDC, xOM, yOM, RGB(255, 0, 0));
        }
        
        EndPaint(hChldOM, &ps);
        break;
    case WM_DESTROY:
        DeleteObject(hpen1);
        DeleteObject(hpen2);
        KillTimer(hChldOM, TINER_CHILDOM);
        PostQuitMessage(0);
        break;
    }
    return DefWindowProc(hChldOM, uMsg, wParam, lParam);;
}
 
LRESULT CALLBACK ChildProcGM(HWND hChldGM, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    RECT rect;
    HDC hDC;
    PAINTSTRUCT ps;
    int x, y, tmp;
    
    switch(uMsg)
    {
    case WM_PAINT:
        hDC = BeginPaint(hChldGM, &ps);
        GetClientRect(hChldGM, &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(hChldGM, &rect);
        EndPaint(hChldGM, &ps);
        break;
    case WM_DESTROY:
        DeleteObject(hpen1);
        DeleteObject(hpen2);
        PostQuitMessage(0);
        break;
    }
    return DefWindowProc(hChldGM, uMsg, wParam, lParam);;
}
Добавлено через 1 час 13 минут
сейчас обратил внимание что первый пиксел рисуется, а дальше нет
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
232 / 205 / 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. ОС?
jonson
232 / 205 / 61
Регистрация: 18.03.2010
Сообщений: 749
22.08.2011, 16:52 #26
ну ОС вроде здесь HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.08.2011, 16:52
Привет! Вот еще темы с ответами:

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

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

Как закрыть или скрыть основное окно и открыть дочернее, и как потом закрыть дочернее окно и открыть основное - C# WPF
Здравствуйте, передо мной возникла проблема, с которой я не могу справиться. Суть проблемы в том, что мне необходимо, чтобы по клику по...

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
22.08.2011, 16:52
Ответ Создать тему
Опции темы

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