007wan |
Отправлено: 28 Октября, 2019 - 08:02:09
|
Эксперт
Покинул форум
Сообщений всего: 1837
Дата рег-ции: Март 2017
Репутация: -2
|
Можно, пожалуйста пример? Выводит 4 окна миниатюры рабочего стола в диалог с отступами.
4 миниатюры будут расположены примерно так:
[-] [-]
[-] [-]
Где скобки - это нарисованный прямоугольник(рамка красного цвета), а пробелы между миниатюрами - это отступы(так же стоит учесть отступы между краями диалога и рамкой, что бы не лепить слишком близко к краями диалога).
При наведении на прямоугольник(любой), окрашивает его в желтый цвет(как курсор), убираем - обратно в прежний цвет.
Так же хочу обратить внимание на глобальную проблему: миниатюры сбрасываются resettextout или др, как и нарисованное впрочем тоже. Как избавится, что бы миниатюра сбрасывалась, а нарисованное не стиралось после того как мы нарисовали впервые? Т.е диалог запустили, всё нарисовалось, миниатюру сбрасываем, а нарисованное не стирается(Без использования таймера!) |
|
|
Zireael |
Отправлено: 28 Октября, 2019 - 09:38:38
|
Эксперт
Покинул форум
Сообщений всего: 4465
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: Можно, пожалуйста пример? Выводит 4 окна миниатюры рабочего стола в диалог с отступами.
Пример есть в этой теме.
Цитата: При наведении на прямоугольник(любой), окрашивает его в желтый цвет(как курсор), убираем - обратно в прежний цвет.
Рисование рамки через visualwindow есть на форуме.
Цитата: Как избавится, что бы миниатюра сбрасывалась, а нарисованное не стиралось после того как мы нарисовали впервые?
Сделать скрин диалога и выводить через visualwindow. |
|
|
Zireael |
Отправлено: 29 Октября, 2019 - 02:28:03
|
Эксперт
Покинул форум
Сообщений всего: 4465
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: При наведении на прямоугольник(любой), окрашивает его в желтый цвет(как курсор), убираем - обратно в прежний цвет.
code (Отобразить)CODE:#define DWM_TNP_RECTDESTINATION 1
#define DWM_TNP_VISIBLE 8
#define DWM_TNP_SOURCECLIENTAREAONLY 16
external(INT, "DwmRegisterThumbnail", "DwmRegisterThumbnail", "Dwmapi.dll");
external(INT, "DwmUpdateThumbnailProperties", "DwmUpdateThumbnailProperties", "Dwmapi.dll");
win w1=window ("Program Manager", "Progman", -1); // окно, с которого нужно получить изображение
win w2=window ("Program Manager", "Progman", -1); // ещё окно, для примера тоже самое, можно другое
win w3=window ("Program Manager", "Progman", -1); // ещё окно
win w4=window ("Program Manager", "Progman", -1); // ещё окно
int ThumbnailId;
char DWM_THUMBNAIL_PROPERTIES[40];
int width=3; // толщина линий рамки
// массивы для линий рамки
new int visual_X[1920][width];
new int visual_Y[width][1080];
new int visual_X2[1920][width];
new int visual_Y2[width][1080];
initialarray(#visual_X[0][0], 255); // цвет рамки, красный
initialarray(#visual_Y[0][0], 255);
initialarray(#visual_X2[0][0], 65279); // цвет рамки, жёлтый
initialarray(#visual_Y2[0][0], 65279);
// координаты миниатюр
int rect[4][4];
rect[0][0]=10; rect[0][1]=10; rect[0][2]=250; rect[0][3]=140;
rect[1][0]=10; rect[1][1]=150; rect[1][2]=250; rect[1][3]=290;
rect[2][0]=260; rect[2][1]=10; rect[2][2]=510; rect[2][3]=140;
rect[3][0]=260; rect[3][1]=150; rect[3][2]=510; rect[3][3]=290;
win w_dialog;
int mouseX, mouseY;
int handle_dialog;
createdialog(0);
showdialog(0, "Диалог", 0, 0, 530, 330, 1, 1);
enabletimer(0);
loop()sleep(10);
function getmessage(0, WM_CREATE)
{
w_dialog=formatiw(gethwnd(0));
handle_dialog=gethwnd(0);
initialarray(#DWM_THUMBNAIL_PROPERTIES[0], 0);
writeaddress(// флаги
DWM_TNP_SOURCECLIENTAREAONLY // выводить клиентскую область, иначе всё окно
| DWM_TNP_VISIBLE // миниатюра видима
| DWM_TNP_RECTDESTINATION // какого размера выводить изображение
, address(#DWM_THUMBNAIL_PROPERTIES[0]));
DWM_THUMBNAIL_PROPERTIES[37]=1;
DWM_THUMBNAIL_PROPERTIES[38]=1;
Dwm(formatwi(w1), 0); // регистрация миниатюры первого окна и номер visuakwindow
Dwm(formatwi(w2), 1);
Dwm(formatwi(w3), 2);
Dwm(formatwi(w4), 3);
}
function Dwm(int handle, int visual)
{
writeaddress(rect[visual][0], address(#DWM_THUMBNAIL_PROPERTIES[4]));
writeaddress(rect[visual][1], address(#DWM_THUMBNAIL_PROPERTIES[8]));
writeaddress(rect[visual][2], address(#DWM_THUMBNAIL_PROPERTIES[12]));
writeaddress(rect[visual][3], address(#DWM_THUMBNAIL_PROPERTIES[16]));
if(DwmRegisterThumbnail(handle_dialog, handle, address(#ThumbnailId))==0)
DwmUpdateThumbnailProperties(ThumbnailId, address(#DWM_THUMBNAIL_PROPERTIES[0]));
visual_window(visual, 0); // рисование рамки вокруг окна, 0 - красная, 1 - жёлтая
}
CREATE_TIMER(0, 50)//Номер таймера, выполнение таймера через мсек.
{
if(formatwi(getwindow())==handle_dialog)
{
getmouse(mouseX, mouseY, w_dialog);
for(int i=0; i<sizearray(rect); i++) // проверка над какой миниатюрой находится курсор
{
if(mouseX > rect[i][0] && mouseX < rect[i][2] && mouseY > rect[i][1] && mouseY < rect[i][3])visual_window(i, 1); // жёлтая рамка
else visual_window(i, 0); // красная
}
}
}
function visual_window(int visual, int yellow)
{
if(yellow) // если жёлтая рамка
{
visualwindow(w_dialog, visual*4, 0, 0, rect[visual][2]-rect[visual][0]+width*2, width, rect[visual][0]-width, rect[visual][1]-width, 100, #visual_X2[0][0]);
visualwindow(w_dialog, visual*4+1, 0, 0, width, rect[visual][3]-rect[visual][1], rect[visual][0]-width, rect[visual][1], 100, #visual_Y2[0][0]);
visualwindow(w_dialog, visual*4+2, 0, 0, rect[visual][2]-rect[visual][0]+width*2, width, rect[visual][0]-width, rect[visual][3], 100, #visual_X2[0][0]);
visualwindow(w_dialog, visual*4+3, 0, 0, width, rect[visual][3]-rect[visual][1], rect[visual][2], rect[visual][1], 100, #visual_Y2[0][0]);
}
else // иначе красная
{
visualwindow(w_dialog, visual*4, 0, 0, rect[visual][2]-rect[visual][0]+width*2, width, rect[visual][0]-width, rect[visual][1]-width, 100, #visual_X[0][0]);
visualwindow(w_dialog, visual*4+1, 0, 0, width, rect[visual][3]-rect[visual][1], rect[visual][0]-width, rect[visual][1], 100, #visual_Y[0][0]);
visualwindow(w_dialog, visual*4+2, 0, 0, rect[visual][2]-rect[visual][0]+width*2, width, rect[visual][0]-width, rect[visual][3], 100, #visual_X[0][0]);
visualwindow(w_dialog, visual*4+3, 0, 0, width, rect[visual][3]-rect[visual][1], rect[visual][2], rect[visual][1], 100, #visual_Y[0][0]);
}
} |
|
|
Budni |
Отправлено: 06 Ноября, 2019 - 17:55:10
|
Специалист
Покинул форум
Сообщений всего: 419
Дата рег-ции: Март 2018
Репутация: 2
|
Как сделать так
код (Отобразить)int x, y;
a: getmouse(x, y);
visualwindow(0, x-20, y-20, x+20, y+20, 10, 10 , 900, -1);
sleep(10);
goto a;
С помощью вашего кода? |
|
|
Zireael |
Отправлено: 07 Ноября, 2019 - 10:48:07
|
Эксперт
Покинул форум
Сообщений всего: 4465
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Вывод изображения по курсором на диалог с указанного окна (Отобразить)CODE:#define DWM_TNP_RECTDESTINATION 1
#define DWM_TNP_RECTSOURCE 2
#define DWM_TNP_OPACITY 4
#define DWM_TNP_VISIBLE 8
#define DWM_TNP_SOURCECLIENTAREAONLY 16
external(INT, "DwmRegisterThumbnail", "DwmRegisterThumbnail", "Dwmapi.dll");
external(INT, "DwmUpdateThumbnailProperties", "DwmUpdateThumbnailProperties", "Dwmapi.dll");
external(INT, "DwmUpdateThumbnailProperties", "DwmUpdateThumbnailProperties", "Dwmapi.dll");
win w=window ("Program Manager", "Progman", -1); // окно, с которого нужно получить изображение (главное окно, не контрол)
int ThumbnailId, mouse_x, mouse_y;
int rect[4] = {0, 0, 300, 300} // какого размера вывести изображение на диалог
char transparency_ = 255; // прозрачность от 0 до 255
char DWM_THUMBNAIL_PROPERTIES[39];
createdialog(0);
showdialog(0, "Диалог", 0, 0, 300, 300, 1, 1);
loop()
{
getmouse(mouse_x, mouse_y);
writeaddress(mouse_x-20, address(#DWM_THUMBNAIL_PROPERTIES[20]));
writeaddress(mouse_y-20, address(#DWM_THUMBNAIL_PROPERTIES[24]));
writeaddress(mouse_x+20, address(#DWM_THUMBNAIL_PROPERTIES[28]));
writeaddress(mouse_y+20, address(#DWM_THUMBNAIL_PROPERTIES[32]));
DwmUpdateThumbnailProperties(ThumbnailId, address(#DWM_THUMBNAIL_PROPERTIES[0]));
sleep(30);
}
function getmessage(0, WM_CREATE)
{
writeaddress(// флаги
DWM_TNP_SOURCECLIENTAREAONLY // выводить клиентскую область, иначе всё окно
| DWM_TNP_VISIBLE // миниатюра видима
| DWM_TNP_OPACITY // прозрачность
| DWM_TNP_RECTDESTINATION // какого размера выводить изображение
| DWM_TNP_RECTSOURCE // какого размера получать изображение
, address(#DWM_THUMBNAIL_PROPERTIES[0]));
writeaddress(rect[0], address(#DWM_THUMBNAIL_PROPERTIES[4]));
writeaddress(rect[1], address(#DWM_THUMBNAIL_PROPERTIES[8]));
writeaddress(rect[2], address(#DWM_THUMBNAIL_PROPERTIES[12]));
writeaddress(rect[3], address(#DWM_THUMBNAIL_PROPERTIES[16]));
DWM_THUMBNAIL_PROPERTIES[36]=transparency_;
DWM_THUMBNAIL_PROPERTIES[37]=1;
DWM_THUMBNAIL_PROPERTIES[38]=1;
if(DwmRegisterThumbnail(gethwnd(0), formatwi(w), address(#ThumbnailId))==0)
{
int y=DwmUpdateThumbnailProperties(ThumbnailId, address(#DWM_THUMBNAIL_PROPERTIES[0]));
//messagebox(y);
}
} |
|
|
007wan |
Отправлено: 12 Декабря, 2019 - 12:20:37
|
Эксперт
Покинул форум
Сообщений всего: 1837
Дата рег-ции: Март 2017
Репутация: -2
|
Zireael пишет: Вывод миниатюры окна на диалог (Отобразить)CODE:#define DWM_TNP_RECTDESTINATION 1
#define DWM_TNP_RECTSOURCE 2
#define DWM_TNP_OPACITY 4
#define DWM_TNP_VISIBLE 8
#define DWM_TNP_SOURCECLIENTAREAONLY 16
external(INT, "DwmRegisterThumbnail", "DwmRegisterThumbnail", "Dwmapi.dll");
external(INT, "DwmUpdateThumbnailProperties", "DwmUpdateThumbnailProperties", "Dwmapi.dll");
win w=window ("Program Manager", "Progman", -1); // окно, с которого нужно получить изображение (главное окно, не контрол)
if(w)
{
createdialog(0);
loop()sleep(10);
}
else messagebox("Окно не найдено");
function getmessage(0, WM_CREATE)
{
showdialog(0, "Диалог", 0, 0, w.width/3, w.height/3+30, 1, 1);
int rect[4] = {0, 0, w.width/3, w.height/3} // какого размера вывести изображение на диалог
//int rect_source[4] = {100, 200, 700, 537} // координаты откуда получить изображение (если нужно)
char transparency_ = 255; // прозрачность от 0 до 255
int ThumbnailId;
char DWM_THUMBNAIL_PROPERTIES[40];
writeaddress(// флаги
DWM_TNP_SOURCECLIENTAREAONLY // выводить клиентскую область, иначе всё окно
| DWM_TNP_VISIBLE // миниатюра видима
| DWM_TNP_OPACITY // прозрачность
| DWM_TNP_RECTDESTINATION // какого размера выводить изображение
//| DWM_TNP_RECTSOURCE // какого размера получать изображение
, address(#DWM_THUMBNAIL_PROPERTIES[0]));
writeaddress(rect[0], address(#DWM_THUMBNAIL_PROPERTIES[4]));
writeaddress(rect[1], address(#DWM_THUMBNAIL_PROPERTIES[8]));
writeaddress(rect[2], address(#DWM_THUMBNAIL_PROPERTIES[12]));
writeaddress(rect[3], address(#DWM_THUMBNAIL_PROPERTIES[16]));
//writeaddress(rect_source[0], address(#DWM_THUMBNAIL_PROPERTIES[20])); // если нужно получить изображение части окна
//writeaddress(rect_source[1], address(#DWM_THUMBNAIL_PROPERTIES[24]));
//writeaddress(rect_source[2], address(#DWM_THUMBNAIL_PROPERTIES[28]));
//writeaddress(rect_source[3], address(#DWM_THUMBNAIL_PROPERTIES[32]));
DWM_THUMBNAIL_PROPERTIES[36]=transparency_;
DWM_THUMBNAIL_PROPERTIES[37]=1;
DWM_THUMBNAIL_PROPERTIES[38]=1;
int x=DwmRegisterThumbnail(gethwnd(0), formatwi(w), address(#ThumbnailId));
//messagebox(x);
if(x==0)
{
int y=DwmUpdateThumbnailProperties(ThumbnailId, address(#DWM_THUMBNAIL_PROPERTIES[0]));
//messagebox(y);
}
}
В отличии от visualwindow меньше теряется качество при сжатии. А можно простенкий пример? Просто я не знаю что удалять(флаги и переменные), что бы все работало как надо*
*Суть заключается в следующем: получаем указатель на окно(или контролл), а потом вывести его на диалог с размерами допустим 100х100 в координатах 10х10, и не важно по размерам какое само окно(хоть большое или маленькое), а то еще пока не понял, у меня Шляпа какая-то твориться, когда меняю цифры
CODE:
int rect[4] = {0, 0, w.width/4, w.height/4} // какого размера вывести изображение на диалог
если меняю 0 на 100 и вторую так же, по идеи должен сместить прямоугольник вниз и вправо, а он просто уменьшается.
Да и переменные лишнии не нужны и флаги |
|
|
|