Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ и WinAPI
Войти
Регистрация
Восстановить пароль
 
beshik
0 / 0 / 1
Регистрация: 25.11.2016
Сообщений: 6
#1

Фон дочерних окон - C++ WinAPI

25.11.2016, 15:23. Просмотров 233. Ответов 1
Метки нет (Все метки)

Здравствуйте, в общем ситуация обстоит так, нужно создать главное окно, и при левом клике на него должны появляться дочерние окна(максимум 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
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
#include <windows.h> 
#include <stdlib.h>
#include <string.h>
#include <tchar.h>
 
#define ID_FIRSTCHILD   101
#define ID_SECONDCHILD  102
#define ID_THIRDCHILD   103
#define ID_QUARDCHILD   104
#define ID_FIFTHCHILD   105
 
 
int x = 30;
int y = 30;
int child_num = 0;
wchar_t counterString[256];
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK ChildProc(HWND, UINT, WPARAM, LPARAM);
 
HINSTANCE hinst;
HWND window_mass[5];
 
int WINAPI WinMain(HINSTANCE hInstance, //дескриптор экземпляра приложения
                    HINSTANCE hPrevInstance, //дескриптор предыдущего экземпляра приложения
                    LPSTR lpszCmdLine, //указатель на параметры командной строки
                    int nCmdShow) //константа, характеризующая начальный вид окна
{
    HWND hwnd;
    MSG msg;
    WNDCLASS main_window; //класс окна
 
    memset(&main_window, 0, sizeof(WNDCLASS));   //заполняет num байтов блока памяти (заполнение структурной переменной)
 
    main_window.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
    main_window.lpfnWndProc = WndProc;           //адрес оконной процедуры
    main_window.hInstance = hInstance;           //дескриптор приложения
    main_window.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    main_window.lpszClassName = L"MainWindow";
 
    RegisterClass(&main_window);
 
    hwnd = CreateWindow(L"MainWindow", L"Menu", WS_OVERLAPPEDWINDOW, 300, 200, 800, 560, NULL, NULL, hInstance, NULL);
 
    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);         //передает WM_PAINT в обход цикла обработки
 
    while (GetMessage(&msg, NULL, 0, 0))   //если второй параметр NULL, то работает со всеми
    {
        TranslateMessage(&msg);      //переводит keydown и keyup в char
        DispatchMessage(&msg);       //вызов оконной функции
    }
 
    return msg.wParam;
}
 
LRESULT CALLBACK WndProc(HWND hwnd, //дескриптор (хэндл) окна, которому предназначено данное сообщение
                    UINT Message,   //код пришедшего сообщения
                    WPARAM wparam,  //дополнительная информация
                    LPARAM lparam)  //дополнительная информация
{
    WNDCLASS child_window;
 
    memset(&child_window, 0, sizeof(WNDCLASS));
 
    child_window.style =  CS_DBLCLKS;
    child_window.lpfnWndProc = ChildProc;
    child_window.hInstance = hinst;
    child_window.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    child_window.lpszClassName = L"ChildWClass";
 
    RegisterClass(&child_window);
 
    switch (Message)
    {
 
        case WM_DESTROY: {
            PostQuitMessage(0);   //ставит в очередь WM_QUIT
        } break;
 
        case WM_KEYDOWN: {
        
        }
        break;
 
        case WM_CHAR:
        {
            if (child_num > 0)
            {
                DestroyWindow(window_mass[child_num - 1]);
                child_num--;
                x -= 30;
                y -= 30;
            }
        } break;
 
        case WM_LBUTTONDOWN: {
            if (child_num < 5)
            {
                wsprintfW(counterString, L"%d", child_num + 1);
                window_mass[child_num] = CreateWindowEx(0, L"ChildWClass", counterString,
                    WS_CHILD | WS_BORDER | WS_CAPTION | WS_SYSMENU | WS_VISIBLE, x, y,
                                        200, 200, hwnd, (HMENU)(int)(ID_FIRSTCHILD + child_num), hinst, NULL);
                
                ShowWindow(window_mass[child_num], SW_NORMAL);
 
                x += 30;
                y += 30;
                child_num++;
            }
            else
            {
                MessageBox(hwnd, L"Enough windows!", L"Warning", MB_OKCANCEL);
            }
        
        } break;
 
        case WM_LBUTTONDBLCLK: {
            SetWindowText(hwnd, L"Mobile menu");
            MoveWindow(hwnd, 100, 100, 300, 450, TRUE);    // x,y,width,height
        } break;
 
        case WM_CLOSE: { 
            if (IDOK == MessageBox(hwnd, L"Exit programm?", L"Close", MB_OKCANCEL | MB_ICONQUESTION | MB_DEFBUTTON2))
            {
                SendMessage(hwnd, WM_DESTROY, NULL, NULL);
            }
        } break;
    
        default: {
            return DefWindowProc(hwnd, Message, wparam, lparam);
        }
 
    }
    return 0;
}
 
LRESULT CALLBACK ChildProc(HWND hwnd, 
                            UINT Message, 
                            WPARAM wparam, 
                            LPARAM lparam)
{
    switch (Message)
    {
 
        case WM_DESTROY: {
            return 0;
        } break;
 
        case WM_CHAR: {
            DestroyWindow(hwnd);
        } break;
 
        default: {
            return DefWindowProc(hwnd, Message, wparam, lparam);
        }
    }
    return 0;
}
Возможно кто-нибудь сможет что-нибудь подсказать?

p.s. С win api знаком очень плохо, все делается в пределах одной лабораторной работы. И сюда пишу в первые, поэтому если что-то оформлено некорректно, прошу простить)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.11.2016, 15:23
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Фон дочерних окон (C++ WinAPI):

Минимизация дочерних окон
Здравствуйте! Есть задание: Написать приложение, обладающее следующей ...

Создание своих дочерних окон
Всем здрасьте ! У меня проблема с Моими дочерними окнами. Может где надо...

Создание 2-х типов дочерних окон
Помогите, совсем профан в этом. Не создается второе дочернее окно. В чем...

Обработка сообщений от дочерних окон
Понимаю эт не серезный вопрос-но я новичок (изучаю Visul C++ токо месяц)....

Получение сообщений от дочерних окон
Есть класс создающий дочернее окошко внутри основного окна. Все сообщения...

Перехват сообщений дочерних окон
Каким образом перехватываются сообщения дочерних окон класа &quot;button&quot;, &quot;edit&quot;....

1
Alex5
1120 / 781 / 231
Регистрация: 12.04.2010
Сообщений: 2,007
25.11.2016, 23:26 #2
Цитата Сообщение от beshik Посмотреть сообщение
int x = 30;
int y = 30;
Цитата Сообщение от beshik Посмотреть сообщение
ShowWindow(window_mass[child_num], SW_NORMAL);
x += 30;
y += 30;
beshik, судя по этим строчкам, приведённый код не связан с этим рисунком.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.11.2016, 23:26
Привет! Вот еще темы с решениями:

Изменение z-index-а дочерних окон
Создаю два окна, потом по действиям пользователя изменяю их z-index, ничего не...

Перечень существующих и дочерних окон
Прошу помощи уважаемые, вот такое задали: В основном окне приложения WIN32...

Изменение размера дочерних окон
Имеется главное окно с тремя дочерними, конкретнее все 3 дочерних окна это...

Закрытие всех дочерних окон
У меня есть программа которая по нажатию ЛКМ создает дочернее окно. Мне нужно...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

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