С Новым годом! Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/34: Рейтинг темы: голосов - 34, средняя оценка - 4.68
 Аватар для AirLiss
1 / 1 / 1
Регистрация: 06.06.2014
Сообщений: 115

2 окна в одном приложении

12.11.2016, 10:34. Показов 6875. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! пишу игру пятнашки... но не в ней дело =)
в начале запуска программы запускается сама игра из чисел.
но вот я хочу пособирать картинку...
загружаю ее... и вот хочу что бы у меня в игре рядом находилась итоговая картинка и сама игра где эту картинку собираю.
подскажите как такое сделать?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.11.2016, 10:34
Ответы с готовыми решениями:

Свойства запущенного окна в своем приложении
Здравствуйте! Позвольте тут спросить. Такая простая проблема - если опрашивать IsIconic(Application->Handle) , то вернет true если...

Как в одном окне создать другие окна?
Доброго времени суток! Как создать в окне еще окна, типа так, как браузер создает вкладки или что-то в этом роде. Напишите, пожалуйста,...

Возможно ли изменить иконку (в стороннем приложении), которая находится в верхнем левом углу окна?
Господа возможно ли изменить иконку ( в стороннем приложении ) которая находиться в верхнем левом углу стороннего окна , если да , то...

15
116 / 106 / 51
Регистрация: 29.03.2016
Сообщений: 480
12.11.2016, 10:41
вот поковыряйте проект (devc++). там как раз два окна
Вложения
Тип файла: 7z clicker.7z (54.4 Кб, 66 просмотров)
1
116 / 106 / 51
Регистрация: 29.03.2016
Сообщений: 480
12.11.2016, 10:42
второе окно появляется после нажатия на кнопку
0
 Аватар для AirLiss
1 / 1 / 1
Регистрация: 06.06.2014
Сообщений: 115
12.11.2016, 10:49  [ТС]
сама программулина приложена.
Вложения
Тип файла: rar 25.part1.rar (9.00 Мб, 47 просмотров)
Тип файла: rar 25.part2.rar (4.45 Мб, 22 просмотров)
0
 Аватар для AirLiss
1 / 1 / 1
Регистрация: 06.06.2014
Сообщений: 115
12.11.2016, 10:58  [ТС]
Serg_o_Grey, ок, ща гляну =)

Добавлено через 7 минут
Serg_o_Grey, мне надо что бы одновременно 2 окна были... окно с игрой и окно с картинкой. в моей программе готовая картинка вынесена на панельку(т.е. надо нажать на кнопочку что б посмотреть картинку)
0
116 / 106 / 51
Регистрация: 29.03.2016
Сообщений: 480
12.11.2016, 11:35
Цитата Сообщение от AirLiss Посмотреть сообщение
мне надо что бы одновременно 2 окна были...
ну так придется доработать немного... типа создавать не при щелчке мышкой по кнопке, а при создании главного окна
ну и размеры свои выставить и прозрачность убрать
там просто принцип создания 2х окон показан


Вот что-то я не пойму. Вы ведь уже реализовали практически весь функционал. Для Вас создать второе окно (имеющее нулевой размер) при создании окна с игрой не должно составлять проблем. При выборе картинки просто растягиваете окно с нулевым размером и рисуете на нем картинку
0
 Аватар для AirLiss
1 / 1 / 1
Регистрация: 06.06.2014
Сообщений: 115
12.11.2016, 13:03  [ТС]
Serg_o_Grey, т.к я новичек - у меня принцип - переделывать то что имею. Т.к. я не все знаю, поэтому и спрашиваю.
в идеале чего хочу:
что б по нажатии кнопки из вот этого кусочка
C++
1
2
3
4
5
6
7
8
9
10
11
case menu.ID_TIP:
            game->ShowRightCombination();
            if(menu.IsChecked(menu.ID_TIP))
                {
                menu.Uncheck(menu.ID_TIP);/*не кликабельно, если в цифрах*/
                }
            else
                {
                menu.Check(menu.ID_TIP);/*кликабельно если в картинке*/
                }
            break;
хотя бы появлялось такое же окошко, наподобии
C++
1
2
3
case menu.ID_HELP:
            MessageBox(hwnd,L"Игра 25-пяшки.",L"HELP",MB_OK);
            break;
только здесь окошко для текста, а мне надо окошко с картинкой.
теперь, наверно, почетче пояснила чего хочу =) ?

Добавлено через 13 минут
как не печально мне надо еще сделать кнопку выбора цвета задника =(
0
116 / 106 / 51
Регистрация: 29.03.2016
Сообщений: 480
12.11.2016, 13:19
Лучший ответ Сообщение было отмечено AirLiss как решение

Решение

как то так второе окно делаем:
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
HWND hsubwnd;   // глбальный дескриптор окна для картинки
 
// добавляем процедуру обработки сообщений окна для картинки
LRESULT CALLBACK SubWndProc(HWND, UINT, WPARAM, LPARAM);
 
// немного измененная Ваша главная функция
INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, INT iCmdShow)
{
    HWND hwnd;
    MSG msg;
    WNDCLASS wndClass;
    GdiplusStartupInput gdiStartup;
    ULONG_PTR gdiToken;
 
    GdiplusStartup(&gdiToken, &gdiStartup, NULL);
 
    wndClass.style = CS_HREDRAW | CS_VREDRAW;
    wndClass.lpfnWndProc = WndProc;
    wndClass.hInstance = hInstance;
    wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
    wndClass.lpszMenuName = NULL;
    wndClass.cbClsExtra = 0;
    wndClass.cbWndExtra = 0;
    wndClass.lpszClassName = TEXT("Puzzle");
    wndClass.hbrBackground = NULL;
    
    // дополнительный класс
    WNDCLASSEX subw;
    memset(&subw,0,sizeof(subw));
    subw.cbSize = sizeof(WNDCLASSEX);
    subw.style = CS_HREDRAW | CS_VREDRAW;
    subw.lpfnWndProc = SubWndProc;              // дополнительная оконная процедура
    subw.hInstance = hInstance;
    subw.hCursor = LoadCursor(NULL, IDC_ARROW);
    subw.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    subw.lpszClassName = TEXT("Window");
    
    if (RegisterClassEx(&wndClass) == 0) exit(1);
    if (RegisterClassEx(&subw) == 0) exit(1);
    
    hwnd = CreateWindow(TEXT("Puzzle"), TEXT("Пятнашки"), WS_OVERLAPPEDWINDOW ^ WS_MAXIMIZEBOX, CW_USEDEFAULT, CW_USEDEFAULT,
        300 + GetSystemMetrics(SM_CXBORDER) * 2, 300 + GetSystemMetrics(SM_CYBORDER) + GetSystemMetrics(SM_CYCAPTION) +
        GetSystemMetrics(SM_CYMENU) + 30, NULL, NULL, hInstance, NULL);
    
    // окно для картинки. обратите внимаение на его размеры
    hsubwnd = CreateWindowEx(0, TEXT("Window"), TEXT("Окно для картинки"), WS_OVERLAPPEDWINDOW, 0, 0, 0, 0, hwnd, NULL, hInstance, NULL);
    
    ShowWindow(hwnd, iCmdShow);
    UpdateWindow(hwnd);
 
    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    GdiplusShutdown(gdiToken);
    return 0;
}
 
// дополнительная оконная процедура (обрабатывающая события только окна для картинки)
LRESULT CALLBACK SubWndProc(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;
}
Добавлено через 9 минут
Цитата Сообщение от AirLiss Посмотреть сообщение
что б по нажатии кнопки из вот этого кусочка
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
case menu.ID_TIP:
    game->ShowRightCombination();
    if(menu.IsChecked(menu.ID_TIP))
    {
        menu.Uncheck(menu.ID_TIP);
        SetWindowPos(hsubwnd, HWND_TOPMOST, 0, 0, 0, 0, NULL);
        ShowWindow(hsubwnd, SW_SHOWNORMAL);
        UpdateWindow(hsubwnd);
    }
    else
    {
        menu.Check(menu.ID_TIP);
        SetWindowPos(hsubwnd, HWND_TOPMOST, 100, 100, 200, 200, NULL);
        ShowWindow(hsubwnd, SW_SHOWNORMAL);
        UpdateWindow(hsubwnd);
    }
break;
1
 Аватар для AirLiss
1 / 1 / 1
Регистрация: 06.06.2014
Сообщений: 115
12.11.2016, 14:14  [ТС]
Serg_o_Grey, вылезли ошибочки...
Ошибка 1 error C2664: "ATOM RegisterClassExW(const WNDCLASSEXW *)": невозможно преобразовать аргумент 1 из "WNDCLASS *" в "const WNDCLASSEXW *"
2 IntelliSense: аргумент типа "WNDCLASS *" несовместим с параметром типа "const WNDCLASSEXW *"
0
116 / 106 / 51
Регистрация: 29.03.2016
Сообщений: 480
12.11.2016, 14:42
используйте просто RegisterClass вместо RegisterClassEx; WNDCLASS вместо WNDCLASSEX; CreateWindow вместо CreateWindowEx

у меня нет VisualStudio, так что править непосредственно Вашу программу не могу

Добавлено через 5 минут
ну и процедуру оконную так лучше сделать, чтобы вся программа не закрывалась
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
LRESULT CALLBACK SubWndProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)
{
    switch(Message)
    {
        case WM_CLOSE:  
            SetWindowPos(hsubwnd, HWND_NOTOPMOST,0, 0, 0, 0, NULL);
            ShowWindow(hsubwnd,SW_HIDE);
        break;
        case WM_DESTROY: 
            PostQuitMessage(0); 
        break;
        default: return DefWindowProc(hwnd, Message, wparam, lparam);
    }
    return 0;
}
0
 Аватар для AirLiss
1 / 1 / 1
Регистрация: 06.06.2014
Сообщений: 115
12.11.2016, 14:52  [ТС]
Serg_o_Grey, глупо может о таком спрашивать...но там картинка не появилась) как ее туда прописать?
0
116 / 106 / 51
Регистрация: 29.03.2016
Сообщений: 480
12.11.2016, 14:58
а окно появилось?
0
 Аватар для AirLiss
1 / 1 / 1
Регистрация: 06.06.2014
Сообщений: 115
12.11.2016, 14:59  [ТС]
как понимаю что то изменить надо здесь, в формэмейдж
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/*цельная картинка*/
void FormImage::DrawRightCombination(Shape *shape, int width, int height)
{
    HDC hdc = GetDC(hwnd);
    Graphics gr(hdc);
    Bitmap backBuffer(width,height,&gr);
    Graphics temp(&backBuffer);
    height -= infoPanelHeight;
    temp.FillRectangle(brushBack,0,infoPanelHeight,width,height);
    int number = 0;
    for(int x = 0; x < 5; x++)
    {
        for(int y = 0; y < 5; y++)
        {
            LPRECT rect = shape->GetCell(x,y);
            temp.DrawImage(cells[number],rect->left,rect->top,rect->right,rect->bottom);
            number++;
        }
    }
    gr.DrawImage(&backBuffer,0,0);
    ReleaseDC(hwnd, hdc);
}
Добавлено через 13 секунд
да появилось
0
116 / 106 / 51
Регистрация: 29.03.2016
Сообщений: 480
12.11.2016, 15: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
LRESULT CALLBACK SubWndProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)
{
    switch(Message)
    {
        case WM_CREATE:
            HDC hdc = GetDC(hwnd);
            Graphics gr(hdc);
            Bitmap backBuffer(width,height,&gr);
            Graphics temp(&backBuffer);
            height -= infoPanelHeight;
            temp.FillRectangle(brushBack,0,infoPanelHeight,width,height);
            int number = 0;
            for(int x = 0; x < 5; x++)
            {
                for(int y = 0; y < 5; y++)
                {
                    LPRECT rect = shape->GetCell(x,y);
                    temp.DrawImage(cells[number],rect->left,rect->top,rect->right,rect->bottom);
                    number++;
                }
            }
            gr.DrawImage(&backBuffer,0,0);
            ReleaseDC(hwnd, hdc);
        break;
        //...
    }
    return 0;
}
единственное рисовать нужно начинать с координат (0, 0)
0
 Аватар для AirLiss
1 / 1 / 1
Регистрация: 06.06.2014
Сообщений: 115
12.11.2016, 15:29  [ТС]
Serg_o_Grey, слишком много ошибок - слишком много необъявленных индефикаторов...
0
116 / 106 / 51
Регистрация: 29.03.2016
Сообщений: 480
12.11.2016, 15:58
что сказать... у Вас width, height и infoPanelHeight не определены в оконной процедуре SubWndProc, это надо учитывать и исправлять

сделайте глобальными эти идентификаторы. только не спрашивайте - как..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.11.2016, 15:58
Помогаю со студенческими работами здесь

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

Консоль и форма в одном приложении
У меня есть приложение Windows Form но при запуске я хочу чтобы открывалась консоль и там были сведения о загрузке а потом уже Form1

Несколько Proxy в одном приложении
Здравствуйте! Помогите, пожалуйста, с одной проблемой. Недавно на сервере Mail.Ru Агента в целях борьбы со спамерами сделали жёсткое,...

Несколько прокси в одном приложении
Всех приветствую! Недавно я начал изучать Си++, вот пишу мою программу... Проблема в следующем... В программе задаются 10 прокси из...

Несколько форм в одном приложении
Проблема состоит в следующем: Приложение состоит из формы, при нажатии на кнопку должно открыться окно для ввода нескольких данных и...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru