Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/19: Рейтинг темы: голосов - 19, средняя оценка - 4.74
3 / 3 / 2
Регистрация: 28.09.2013
Сообщений: 32

ООП Сапер на WinAPI

28.09.2013, 18:24. Показов 3933. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Передо мной стоит задача написать Сапер на чистом винапи (на С++) в полностью ООП стиле. Сам в C++ ориентируюсь, а вот с WinAPI большие пробелы. Отсюда несколько глупых нубских вопросов от человека, никогда не делавшего gui на винапи:
1. Каким образом создать на форме произвольное количество кнопочек-мин? Как в таком случае обрабатывать события кликов на них? Желательно так что бы их можно было бы представлять в качестве объектов и задать им дополнительные свойства (открыта или нет, с миной или нет). При возникновении клика менять состояние кнопочки - клетки. Про события, как я уже сказал, вообще самая большая проблема для меня.
2. Как предпочтительнее (правильно и красиво) сделать цифры со счетом времени игры, картинки мин на кнопочках и тд.
Пока очень прошу ответить на эти вопросы, далее буду думать и спрашивать, если что. В гугл за исходниками сапера пожалуйста не посылайте, единственный работающий в принципе вариант, который я там встретил, отличается на мой взгляд очень некрасивым решением в виде отслеживания координат клика и рисования кнопочек не собственно кнопками форм, а просто картинками, заполняющими форму, отслеживая координаты курсора при клике. Так не годится, да и как осмысленные объекты их в таком случае не представишь. Заранее спасибо
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.09.2013, 18:24
Ответы с готовыми решениями:

ООП и winapi
Здравствуйте! Передо мной стоит задача: написать программу на С++ средствами winapi, применяя ООП. С ООП я уже знакома, писала мелкие...

ООП заготовка для стандартного проекта WinAPI в Visual Studio
Здравствуйте, есть ли кого нибудь такая заготовочка? Если не сложно, выложите.

Кто поможет c C++ (ООП, WinAPI) в определенный день?
Здравствуйте. Кто бы смог помочь с c++ и возможно winapi в определенный день? Пару простых вопросов по ООП. Напишите в лс.

6
567 / 198 / 70
Регистрация: 25.05.2012
Сообщений: 816
28.09.2013, 19:50
1. Каким образом создать на форме произвольное количество кнопочек-мин?
CreateWindow(Ex), как обычно.

Как в таком случае обрабатывать события кликов на них?
Обрабатывать в callback-функции. HWND кнопки при этом находится в lParam, например, что-то типа такого:

C++
1
2
3
        case WM_COMMAND:
            if ((HWND)lParam == button[i][j].hwnd)
                        ...
1
3 / 3 / 2
Регистрация: 28.09.2013
Сообщений: 32
29.09.2013, 00:07  [ТС]
Хм, то есть я правильно понимаю, что при каждом клике мы должны перебирать в цикле все кнопки в поиске нужного hwnd? И более красивого варианта нет?
0
567 / 198 / 70
Регистрация: 25.05.2012
Сообщений: 816
29.09.2013, 01:26
Можно определять нажатую кнопку по координатам мыши по событию WM_LBUTTONDOWN, например. Наверное будет быстрее, чем искать hwnd. Больше навскидку ничего не предложу.
0
4 / 4 / 3
Регистрация: 20.06.2013
Сообщений: 35
29.09.2013, 16:22
Можно каждой кнопке индентификатор присвоить и по нему узнавать X,Y нажатой кнопки
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
#define SAP_WIDTH 20            //Ширина поля
#define SAP_HEIGHT 20           //Высота поля
#define SAP_TOP 15      //Отступ сверху
#define SAP_LEFT 15         //Отступ слева
 
...
 
case WM_CREATE:
    for(int x=0; x<SAP_WIDTH; x++)
        for(int y=0; y<SAP_HEIGHT; y++){
            //Создаем кнопки с индентификаторами от 1 до ...
            CreateWindowEx(0,"BUTTON","",
                WS_CHILD | WS_VISIBLE | BS_BITMAP, SAP_LEFT+x*20,SAP_TOP+y*20,20,20,
                wnd,(HMENU)(x+y*SAP_WIDTH+1),inst,0);
        }
    break;
 
case WM_COMMAND:
    //Если это контрол
    if(lpar!=0){
        //Индентификатор кнопки - 1
        int id=(wpar & 0x0000ffff)-1;
        //Строки
        char str1[30],str2[30],str3[70]="Нажато на кнопку ";
        //id%SAP_WIDTH - находим X координату кнопки
        itoa(id%SAP_WIDTH,str1,10);
        //id%SAP_WIDTH - находим Y координату кнопки
        itoa(id/SAP_WIDTH,str2,10);
        strcat(str3,str1);
        strcat(str3," : ");
        strcat(str3,str2);
        MessageBox(wnd,str3,"Оповещение",0);
        //Загружаем BITMAP из ресурсов и шлем сообщение BM_SETIMAGE кнопке
        HBITMAP ic=LoadBitmap(inst,MAKEINTRESOURCE(101));
        SendMessage((HWND)lpar,BM_SETIMAGE,IMAGE_BITMAP,(LPARAM)ic);
        
    }
    break;
0
835 / 643 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
02.10.2013, 12:50
Цитата Сообщение от Surgery Посмотреть сообщение
Хм, то есть я правильно понимаю, что при каждом клике мы должны перебирать в цикле все кнопки в поиске нужного hwnd? И более красивого варианта нет?
Ну, можно завести map...
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
11.10.2013, 23:12
Небольшая либа на тему:AbstractWindows
Недоделаная, идея подсмотрена в либах от Делфи
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.10.2013, 23:12
Помогаю со студенческими работами здесь

Изучаю Python, сейчас учу основы ООП, где можно найти задачи по ООП
Скиньте пожалуйста источники с задачами(желательно на русском)

C# сапёр
в общем написал сапёра но логика на главной форме , а препод заставил убрать абсолютно всю логику с главной формы ... помогите плиз не...

Сапер на C++
Народ хочу попробовать написать игру сапер. Не могу понять как мне расставить программно 100 кнопок на поле я могу и понимаю как работать с...

сапёр
здравствуйте извините, если повторяюсь (видела, что подобная тема была, причём не одна, но не нашла там того, что надо), но мне срочно...

Сапер
Кто подскажет как сделать в сапере чтобы он выводил в конце игры время за которое ты прошел, и чтобы записывал таблицу рекордов, как в...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru