Zireael |
Отправлено: 24 Ноября, 2018 - 02:05:22
|
Эксперт
Покинул форум
Сообщений всего: 4465
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Что-то вроде этого?
CODE:win desktop=window ("FolderView", "SysListView32", window ("Program Manager", "Progman", -1)); // рабочий стол
createdialog(0);
showdialog(0, "Диалог", 600, 400, 500, 300, 1, 1);
while(window("Диалог")==0)sleep(100); // ждём когда диалог откроется
win dialog=window("Диалог"); // указатель на диалог
visualwindow(dialog, 0, 0, 0, 500, 300, 0, 0, 100, desktop); // вывод на диалог
int x, y;
loop()
{
if(getkeystate(1)==1) // если нажата левая кнопка
{
getmouse(x, y, dialog); // получаем координаты курсора относительно диалога
sendmouse(LEFT, x, y, desktop); // клик левой по рабочему столу
}
sleep(10);
}
Клик левой кнопкой по диалогу будет отсылать клик на рабочий стол.
На счёт изменения скрина, смотря сколько пикселей надо будет перекрасить. Если какие-то мелкие элементы, то можно циклами в самом кибор. Если закрашивать большие области, то это только в длл, иначе будет медленно. И, скорее всего, придётся играться с двумя скринами, пока один выводится, второй перекрашивать, потом выводить второй и перекрашивать первый. Если один и тот же скрин выводить и перекрашивать, то будет мерцание. |
|
|
Kutuz_off |
Отправлено: 24 Ноября, 2018 - 08:56:08
|
Наблюдатель
Покинул форум
Сообщений всего: 47
Дата рег-ции: Окт. 2016
Репутация: 0
|
Zireael,
- да, именно это.
- да, интересно научиться работать с длл, был бы рад узнать максимально практичные книжки/мануалы/видео, желательно с более подробными ссылками на темы/резделы, которые так помогут в решении данного вопроса. Думаю тема будет актуальна не только для меня. Уверен, многие начинают программировать с нуля благодаря этой программе и увлечению к играм.
Сейчас задача по перекрашиванию примерно в 600/200 или 900/300px в зависимости от разрешения экрана. Часть работы уже реализовывал (непосредственным выводом на экран, а не в диалог), и было заметно как КИБОР перекрашивает картинку по столбцам. В принципе приемлемо, но только для реализации вывода одного такого изображения, если же нагружать далее - эфект уже будет не тот. Интерфейс который отрисовывается с задержкой не радует глаз. Определенно нужна более быстрая работа с изображениями. |
|
|
Dantes3000 |
Отправлено: 24 Ноября, 2018 - 16:29:23
|
Эксперт
Покинул форум
Сообщений всего: 1489
Дата рег-ции: Июнь 2016
Репутация: 58
|
Kutuz_off , а не проще сделать диалог с кнопками поверх окна игры?
(Добавление)
.
Kutuz_off пишет: Я уже сделал такое в Кибе, и надо сказать: выглядит не очень презентабельно
Dantes3000 пишет: но кибором лучше этого не делать
я об этом и говорил |
|
|
Zireael |
Отправлено: 24 Ноября, 2018 - 18:51:28
|
Эксперт
Покинул форум
Сообщений всего: 4465
Дата рег-ции: Нояб. 2017
Репутация: 585
|
https://drive.google.com/open?id...-hGv-dQIXj07Nry3
В архиве dll и картинка для примера, закинуть всё в папку с кибор.
Функция paint копирует двухмерный массив int в другой двухмерный массив int.
Принимаемые параметры:
1. Указатель на двухмерный массив int, в который будет копироваться другой массив.
2. Первая размерность массива.
3. Вторая размерность массива.
4. Указатель на двухмерный массив int, который будет копироваться.
5. Первая размерность массива.
6. Вторая размерность массива.
7. Цвет фона. Этот цвет игнорируется при копировании. Т. е., если надо поместить на скрин круг, то надо закрасить всё что не нужно в один цвет, например белый (16777215) и указать его в качестве фона.
8. Позиция X.
9. Позиция Y.
code (Отобразить)CODE:external(VOID, "paint", "paint", pathfolder()+"\paint.dll");
win desktop=window ("FolderView", "SysListView32", window ("Program Manager", "Progman", -1)); // рабочий стол
createdialog(0);
showdialog(0, "Диалог", 600, 400, 500, 300, 1, 1);
while(window("Диалог")==0)sleep(100); // ждём когда диалог откроется
win dialog=window("Диалог"); // указатель на диалог
int x, y, i, j;
int a[1920][1080]; // массив для скрина1
int b[1920][1080]; // массив для скрина2
int image[50][50]; // картинка, которую будем дорисовывать на скрин
loadimage(#image[0][0], pathfolder()+"ring.bmp"); // загрузить картинку
enabletimer(0);
loop()
{
screen (#a[0][0], 0, 0, 500, 300, desktop); // скрин1 части рабочего стола
// рисуем круг в координатах 50, 30
paint(address(#a[0][0]), sizearray(a), sizearray(a[]), address(#image[0][0]), sizearray(image), sizearray(image[]), 16777215, 50, 30);
// рисуем круг в координатах 120, 80
paint(address(#a[0][0]), sizearray(a), sizearray(a[]), address(#image[0][0]), sizearray(image), sizearray(image[]), 16777215, 120, 80);
visualwindow(dialog, 0, 0, 0, 500, 300, 0, 0, 100, #a[0][0]); // вывод на диалог
screen (#b[0][0], 0, 0, 500, 300, desktop); // скрин2 части рабочего стола
paint(address(#b[0][0]), sizearray(b), sizearray(b[]), address(#image[0][0]), sizearray(image), sizearray(image[]), 16777215, 50, 30);
paint(address(#b[0][0]), sizearray(b), sizearray(b[]), address(#image[0][0]), sizearray(image), sizearray(image[]), 16777215, 120, 80);
visualwindow(dialog, 0, 0, 0, 500, 300, 0, 0, 100, #b[0][0]); // вывод на диалог
sleep(1);
}
CREATE_TIMER(0, 30)
{
if(getkeystate(1)==1) // если нажата левая кнопка
{
getmouse(x, y, dialog); // получаем координаты курсора относительно диалога
sendmouse(LEFT, x, y, desktop); // клик левой по рабочему столу
}
sleep(10);
} |
|
|
|