Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++ и WinAPI

Войти
Регистрация
Восстановить пароль
 
beshik
0 / 0 / 0
Регистрация: 25.11.2016
Сообщений: 6
#1

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

25.11.2016, 15:23. Просмотров 188. Ответов 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):

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

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

Создание своих дочерних окон - C++ WinAPI
Всем здрасьте ! У меня проблема с Моими дочерними окнами. Может где надо какой стиль добавить, может ещё что ... Я не знаю :С В...

Изменение z-index-а дочерних окон - C++ WinAPI
Создаю два окна, потом по действиям пользователя изменяю их z-index, ничего не выходит SetWindowPos ( hWnd, // дескриптор окна ...

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

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

1
Alex5
1087 / 748 / 116
Регистрация: 12.04.2010
Сообщений: 1,911
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
Привет! Вот еще темы с ответами:

Создание 2-х типов дочерних окон - C++ WinAPI
Помогите, совсем профан в этом. Не создается второе дочернее окно. В чем ошибка? // 123.cpp : Defines the entry point for the...

Изменение размера дочерних окон - C++ WinAPI
Имеется главное окно с тремя дочерними, конкретнее все 3 дочерних окна это контролы типа ListView, Tab control и обычное дочернее окно для...

Закрытие всех дочерних окон - C++ WinAPI
У меня есть программа которая по нажатию ЛКМ создает дочернее окно. Мне нужно закрыть все дочерние окна когда их будет 5 или больше.

Перехват сообщений дочерних окон - C++ WinAPI
Каким образом перехватываются сообщения дочерних окон класа &quot;button&quot;, &quot;edit&quot;. Например при нажатии клавишы tab нужно переключать фокус с...


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

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

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