Кибор » Кибор - Интегрированная среда разработки ботов » Вопросы и решение проблем » Отображение картинки(visualwindow) на картинке (visualwindow) в немодальном окне.

Страниц (2): [1] 2 »
 

1. Cocacaca - 18 Июля, 2018 - 13:20:51 - перейти к сообщению
Собственно вопрос следующий, требуется отобразить в диологовом окне на картинке которая была размещена на немодальном окне с помощью visualwindow из файла, при клике мышью по данной области именно этой картинки пользователем, разместить картинку в виде стрелки/галки из файла, тем же методом visualwindow.
То есть, требуется взять геттер мыши в области visualwindow и на нем разместить стрелку/галку, что-то нет мысли ...

CODE:

int Image_0_KIB[240][240];
loadimage (#Image_0_KIB[0][0], "D:\Man\China.bmp");
int pos_size_button0[1][4];
string text_button0[1];
int flag_button0[1];
win w = window("CheckImg");

pos_size_button0[0][0]=78; pos_size_button0[0][1]=241; pos_size_button0[0][2]=100; pos_size_button0[0][3]=20;
text_button0[0]="Start";

//////////

createdialog(0, BUTTON, #pos_size_button0[0][0], #text_button0[0], #flag_button0[0]);
//////////

showdialog(0, "CheckImg", 835, 390, 250, 300, 1, 1);
//////////
visualwindow(w, 0, 0, 0, 240, 240, 1, 1, 100, #Image_0_KIB[0][0]);

loop() sleep(10);
2. Kibor - 18 Июля, 2018 - 14:02:02 - перейти к сообщению

CODE:
int I1[500][500];
loadimage (#I1[0][0], "C:\China.bmp");//Фоновое изображение
int Size_X_I1=imagewidth(#I1[0][0]);
int Size_Y_I1=imageheight(#I1[0][0]);


int I2[50][50];
loadimage (#I2[0][0], "C:\strelka.bmp");//То чем рисум по клику на фоновом
int Size_X_I2=imagewidth(#I2[0][0]);
int Size_Y_I2=imageheight(#I2[0][0]);


int pos_size_button0[1][4];
string text_button0[1];
int flag_button0[1];
win w = window("CheckImg");

pos_size_button0[0][0]=78; pos_size_button0[0][1]=241; pos_size_button0[0][2]=100; pos_size_button0[0][3]=20;
text_button0[0]="Start";

//////////

createdialog(0, BUTTON, #pos_size_button0[0][0], #text_button0[0], #flag_button0[0]);
//////////

showdialog(0, "CheckImg", 835, 390, 250, 300, 1, 1);
//////////
visualwindow(w, 0, 0, 0, Size_X_I1, Size_Y_I1, 1, 1, 100, #I1[0][0]);




int cx, cy;
int x, y;


loop()
{
if (getkeystate(LBUTTON)==1)
{
getmouse(cx, cy);
w = window("CheckImg");
cx=cx-w.leftclient-Size_X_I2/2;
cy=cy-w.topclient-Size_Y_I2/2;

for (x=cx; x<cx+Size_X_I2; x++)
{
for (y=cy; y<cy+Size_Y_I2; y++)
{
if (x<0 || x>Size_X_I1-1)continue;//Если за пределы
if (y<0 || y>Size_Y_I1-1)continue;//Если за пределы
I1[x][y]=I2[x-cx][y-cy];
}
}
while(getkeystate(LBUTTON)==1)sleep(15);
}






sleep(10);
}
3. Kibor - 19 Июля, 2018 - 12:49:52 - перейти к сообщению
А более красивее если не учитывать какой то цвет фона



CODE:
int I1[500][500];
loadimage (#I1[0][0], "C:\China.bmp");//Фоновое изображение
int Size_X_I1=imagewidth(#I1[0][0]);
int Size_Y_I1=imageheight(#I1[0][0]);


int I2[50][50];
loadimage (#I2[0][0], "C:\strelka.bmp");//То чем рисум по клику на фоновом
int Size_X_I2=imagewidth(#I2[0][0]);
int Size_Y_I2=imageheight(#I2[0][0]);


int pos_size_button0[1][4];
string text_button0[1];
int flag_button0[1];
win w = window("CheckImg");

pos_size_button0[0][0]=78; pos_size_button0[0][1]=241; pos_size_button0[0][2]=100; pos_size_button0[0][3]=20;
text_button0[0]="Start";

//////////

createdialog(0, BUTTON, #pos_size_button0[0][0], #text_button0[0], #flag_button0[0]);
//////////

showdialog(0, "CheckImg", 835, 390, 250, 300, 1, 1);
//////////
visualwindow(w, 0, 0, 0, Size_X_I1, Size_Y_I1, 1, 1, 100, #I1[0][0]);




int cx, cy;
int x, y;


loop()
{
if (getkeystate(LBUTTON)==1)
{
getmouse(cx, cy);
w = window("CheckImg");
cx=cx-w.leftclient-Size_X_I2/2;
cy=cy-w.topclient-Size_Y_I2;

for (x=cx; x<cx+Size_X_I2; x++)
{
for (y=cy; y<cy+Size_Y_I2; y++)
{
if (x<0 || x>Size_X_I1-1 || y<0 || y>Size_Y_I1-1)continue;//Если за пределы
if (I2[x-cx][y-cy]!=0)I1[x][y]=I2[x-cx][y-cy];//Если не фоновый цвет черный
}
}
while(getkeystate(LBUTTON)==1)sleep(15);
}






sleep(10);
}
4. Cocacaca - 21 Июля, 2018 - 03:51:42 - перейти к сообщению
Все замечательно, но есть один нюанс! Есть 2 выпадающих списка, в зависимости от выбора в первом списке составляется второй список, и исходя из этого должна появится картинка соответствующая и вот на этой картинке надо снять координаты.
Вот уже второй день что-то не получается ни как Недовольство, огорчение

CODE:

int Image_0[200][200];
int Image_1[200][200];
int Image_2[200][200];
int Image_3[200][200];
loadimage (#Image_0[0][0], "C:\test\square.bmp");
loadimage (#Image_1[0][0], "C:\test\circle.bmp");
loadimage (#Image_2[0][0], "C:\test\Dog.bmp");
loadimage (#Image_3[0][0], "C:\test\Cat.bmp");

win w = ("Dialog");
int t= flag_combo0[0];
int pos_size_combo0[2][4];
string text_combo0[2][2];
int strok_combo0[2];
int flag_combo0[2];

text_combo0[1][0]="Square"; text_combo0[1][1]="Circle";
flag_combo0[0]=0; flag_combo0[1]=0;
dialog();
createdialog(0, COMBO, #pos_size_combo0[0][0], #text_combo0[0][0], #strok_combo0[0], #flag_combo0[0]);
showdialog(0, "Dialog", 600, 250, 600, 300, 1, 1);
visualwindow(w, 0, 0, 0, 200, 200, 300, 5 , 100, #Image_0[0][0]);
///////


enabletimer(0);

loop() sleep(10);//?????? ????? ?????


CREATE_TIMER(0, 200)//????? ???????, ?????????? ??????? ????? ????.
{
if (t!=flag_combo0[0])
{
t= flag_combo0[0];
if (flag_combo0[0]==0){
destroydialog(0);
dialog();
flag_combo0[0]=0;
text_combo0[1][0]="Square"; text_combo0[1][1]="Circle";
if(flag_combo0[1]==0){
flag_combo0[1]=0;
createdialog(0, COMBO, #pos_size_combo0[0][0], #text_combo0[0][0], #strok_combo0[0], #flag_combo0[0]);
showdialog(0, "Dialog", 600, 250, 600, 300, 1, 1);
visualwindow(w, 0, 0, 0, 200, 200, 300, 5 , 100, #Image_0[0][0]);
goto a;
}
if(flag_combo0[1]==1 && flag_combo0[0]==0){
flag_combo0[1]=1;
createdialog(0, COMBO, #pos_size_combo0[0][0], #text_combo0[0][0], #strok_combo0[0], #flag_combo0[0]);
showdialog(0, "Dialog", 600, 250, 600, 300, 1, 1);
visualwindow(w, 0, 0, 0, 200, 200, 300, 5 , 100, #Image_1[0][0]);
goto a;
}
}
if (flag_combo0[0]==1){
destroydialog(0);
dialog();
flag_combo0[0]=0;
text_combo0[1][0]="Dog"; text_combo0[1][1]="Cat";
if(flag_combo0[1]==0){
flag_combo0[1]=0;
createdialog(0, COMBO, #pos_size_combo0[0][0], #text_combo0[0][0], #strok_combo0[0], #flag_combo0[0]);
showdialog(0, "Dialog", 600, 250, 600, 300, 1, 1);
visualwindow(w, 0, 0, 0, 200, 200, 300, 5 , 100, #Image_0[0][0]);
goto a;
}
if(flag_combo0[1]==1 && flag_combo0[0]==0){
flag_combo0[1]=1;
createdialog(0, COMBO, #pos_size_combo0[0][0], #text_combo0[0][0], #strok_combo0[0], #flag_combo0[0]);
showdialog(0, "Dialog", 600, 250, 600, 300, 1, 1);
visualwindow(w, 0, 0, 0, 200, 200, 300, 5 , 100, #Image_1[0][0]);
goto a;
}
}
}
a:;
}


function dialog()
{
pos_size_combo0[0][0]=27; pos_size_combo0[0][1]=27; pos_size_combo0[0][2]=100; pos_size_combo0[0][3]=80;
pos_size_combo0[1][0]=32; pos_size_combo0[1][1]=165; pos_size_combo0[1][2]=100; pos_size_combo0[1][3]=80;
strok_combo0[0]=2; strok_combo0[1]=2;
text_combo0[0][0]="Shape"; text_combo0[0][1]="Animals";
}
5. Zireael - 21 Июля, 2018 - 11:23:17 - перейти к сообщению
CODE:
win w = ("Dialog");

CODE:
win w = window("Dialog");

Диалог ещё не создан, а уже получаете указатель на него. Сначала showdialog, потом получаем указатель.
CODE:
win w;
// тут параметры и создание диалога
showdialog(0, "Dialog", 600, 250, 600, 300, 1, 1);
while(window("Dialog")==0)sleep(50); // ждём когда диалог откроется
w = window("Dialog"); //получили указатель
visualwindow(w, 0, 0, 0, 200, 200, 300, 5 , 100, #Image_0[0][0]); // вывели изображение

 Цитата:
int t= flag_combo0[0];

Присваиваете переменной t значение не существующего элемента массива. До этой строки массив flag_combo0 ещё не объявлен.

Вывод картинки в зависимости от выбранного пункта combo (Отобразить)
6. Cocacaca - 22 Июля, 2018 - 03:56:03 - перейти к сообщению
Zireael , спасибо за указанные ошибки, данный код копипастился с разных, поэтому проскочило пару ошибок, скинул сюда для наглядной своей проблемы. А проблема в следующем:
1. Необходимо отслеживать изменения первого списка и исходя из выбора отображать нужные варианты во втором И при этом отслеживать возможно было нажатие на область картинки, если было нажатие, в этом месте отобразить стрелку, если не было нажатий, слушаем дальше пользователя, что он будет делать или изменять выбор в первом поиске или во втором, исходя из этого отображать нужную картинку. Если бы была многопоточность то это можно было бы сделать в два потока, но их нет. Вот и стал вопрос как-то это все сделать все аккуратно, то есть отслеживать 3 разных действия можно сказать одновременно.

Если я win w = window("Dialog"Подмигивание; объявлю до появления окна - по-моему ничего страшного, я же ее не вызываю, это точно так же как искать определенное окно, зная его название и ожидая его появления.
7. Zireael - 22 Июля, 2018 - 04:28:21 - перейти к сообщению
 Цитата:
Вот и стал вопрос как-то это все сделать все аккуратно, то есть отслеживать 3 разных действия можно сказать одновременно.

Что мешает проверять 3 условия в одном таймере?
8. Zireael - 22 Июля, 2018 - 13:28:39 - перейти к сообщению
 Цитата:
Есть 2 выпадающих списка, в зависимости от выбора в первом списке составляется второй список

code (Отобразить)
9. Cocacaca - 23 Июля, 2018 - 11:20:12 - перейти к сообщению
Спасибо за содействие! Сейчас возник вопрос, а как обновить окно, чтобы стрелочки которые пользователь натыкал исчезли, грубо говоря сбросились ? По нажатию на кнопку, ни update(w), ни visualwindow(w) не помогают, при destroydialog(0) - крашится, потому что закрывает окно на котором вызван visualwindow(), disablevisualwindow() перед дестроем тоже не помогает Не понял
10. Zireael - 23 Июля, 2018 - 18:02:19 - перейти к сообщению
 Цитата:
возник вопрос, а как обновить окно, чтобы стрелочки которые пользователь натыкал исчезли

Надо не окно обновлять, а картинку в массиве. Самое простое снова загрузить картинку.
Или же создавать 2 массива, в 1 хранить оригинал картинки, в другом рисовать, когда потребуется обновить придётся копировать из 1 во второй. Но, это не очень не слишком быстро.
 Цитата:
при destroydialog(0) - крашится

Значит что-то не так сделали. С visualwindow:
code (Отобразить)

Powered by ExBB FM 1.0 Final