007wan |
Отправлено: 14 Августа, 2019 - 20:45:34
|
Эксперт
Покинул форум
Сообщений всего: 1837
Дата рег-ции: Март 2017
Репутация: -2
|
Помогите сделать,прелоадер по середине диалога без рамки диалога с фоном диалога , но прелоадер имеет линейный тип и от 0 до 100 значение. Имеет фон пустой и тусклый в местах, где нету линии прелоадера,а сама линия яркая и градиентовая., текст от прелоадера внизу влевом углу загрузки,а проценты вверху права, пожалуйста. Представления имею с чего начать,а рисовать не умею.
Преловдер это по суть линия и прибавляются к ней пиксели или растяжка изображения вправа. Если можно, то через external.
(Добавление)
Извиняюсь. С телефона пишу заошибки |
|
|
Zireael |
Отправлено: 15 Августа, 2019 - 02:03:19
|
Эксперт
Покинул форум
Сообщений всего: 4467
Дата рег-ции: Нояб. 2017
Репутация: 585
|
CODE:#define WS_CHILD 1073741824
#define WS_VISIBLE 268435456
external(INT, "CreateWindow", "CreateWindowExA", "User32.dll" );
external(INT, "SetWindowText", "SetWindowTextA", "User32.dll");
int image[200][20], image2[200][20];
initialarray(#image[0][0], 65280); // зелёный
initialarray(#image2[0][0], 255); // красный
win dialog;
int static, percent;
createdialog(0);
showdialog(0, "Диалог",100, 100, 300, 100, 1, 1);
for(int i=0; i<sizearray(image); i++)
{
visualwindow(dialog, 0, 0, 0, i, sizearray(image[]), 10, 10, 100, #image[0][0]);
visualwindow(dialog, 1, 0, 0, sizearray(image2)-i, sizearray(image2[]), 10+i, 10, 100, #image2[0][0]);
percent=i/2;
SetWindowText(static, format(percent));
sleep(5);
}
function getmessage(0, WM_CREATE)
{
dialog=formatiw(gethwnd(0));
static=CreateWindow(0, "STATIC", "", WS_CHILD | WS_VISIBLE, 100, 30, 50, 20, gethwnd(0), 0, 0, 0); // текст
} |
|
|
007wan |
Отправлено: 15 Августа, 2019 - 11:27:06
|
Эксперт
Покинул форум
Сообщений всего: 1837
Дата рег-ции: Март 2017
Репутация: -2
|
Zireael пишет: CODE:#define WS_CHILD 1073741824
#define WS_VISIBLE 268435456
external(INT, "CreateWindow", "CreateWindowExA", "User32.dll" );
external(INT, "SetWindowText", "SetWindowTextA", "User32.dll");
int image[200][20], image2[200][20];
initialarray(#image[0][0], 65280); // зелёный
initialarray(#image2[0][0], 255); // красный
win dialog;
int static, percent;
createdialog(0);
showdialog(0, "Диалог",100, 100, 300, 100, 1, 1);
for(int i=0; i<sizearray(image); i++)
{
visualwindow(dialog, 0, 0, 0, i, sizearray(image[]), 10, 10, 100, #image[0][0]);
visualwindow(dialog, 1, 0, 0, sizearray(image2)-i, sizearray(image2[]), 10+i, 10, 100, #image2[0][0]);
percent=i/2;
SetWindowText(static, format(percent));
sleep(5);
}
function getmessage(0, WM_CREATE)
{
dialog=formatiw(gethwnd(0));
static=CreateWindow(0, "STATIC", "", WS_CHILD | WS_VISIBLE, 100, 30, 50, 20, gethwnd(0), 0, 0, 0); // текст
}
Как переделать его, что бы не было for,а что бы был принцип такой:
-Вставляем строчку кода куда угодно, например "SetPreloader(50)"
Это передает в функцию и получается ползунок на 50% и так можно много раз 10, 20, 30, хоть 100 и снова 10 откатить прелоадер
(Добавление)
CODE:
function SetStatusBar(int a)
{
for(int i=a; i<sizearray(image); i++)
{
visualwindow(dialog, 0, 0, 0, i, sizearray(image[]), 10, 70, 100, #image[0][0]);
visualwindow(dialog, 1, 0, 0, sizearray(image2)-i, sizearray(image2[]), 10+i, 70, 100, #image2[0][0]);
percent=i/2;
SetWindowText(static, format(percent)+"%");
sleep(5);
}
}
SetStatusBar(50);
//sleep(5000);
Куда добавить?
(Добавление)
Вот сделал.
CODE:function SetStatusBar(int a)
{
visualwindow(dialog, 0, 0, 0, a, sizearray(image[]), 10, 70, 100, #image[0][0]);
visualwindow(dialog, 1, 0, 0, sizearray(image2)-a, sizearray(image2[]), 10+a, 70, 100, #image2[0][0]);
percent=a/2;
SetWindowText(static, format(percent)+"%");
sleep(5);
}
SetStatusBar(50);
sleep(5000);
SetStatusBar(100);
sleep(5000);
SetStatusBar(150);
sleep(5000);
SetStatusBar(200);
(Добавление)
А как сделать тоже самое только без диалога, но с фоном диалога и что бы фон этого загрузчика появился не резко, а плавно.
Код (Отобразить)CODE:#define WS_CHILD 1073741824
#define WS_VISIBLE 268435456
external(INT, "CreateWindow", "CreateWindowExA", "User32.dll" );
external(INT, "SetWindowText", "SetWindowTextA", "User32.dll");
int image[200][12], image2[200][12];
initialarray(#image[0][0], 65280); // зелёный
initialarray(#image2[0][0], 6400); // красный
win dialog;
int static, percent, static1, static3;
createdialog(0);
showdialog(0, "Диалог",100, 100, 265, 200, 1, 1);
function getmessage(0, WM_CREATE)
{
dialog=formatiw(gethwnd(0));
static1=CreateWindow(0, "STATIC", "Название программы", WS_CHILD | WS_VISIBLE, 92, 30, 100, 20, gethwnd(0), 0, 0, 0); // текст
static=CreateWindow(0, "STATIC", "", WS_CHILD | WS_VISIBLE, 215, 67, 50, 20, gethwnd(0), 0, 0, 0); // текст
static3=CreateWindow(0, "STATIC", "Что делаем", WS_CHILD | WS_VISIBLE, 10, 87, 300, 20, gethwnd(0), 0, 0, 0); // текст
}
function SetStatusBar(int a)
{
visualwindow(dialog, 0, 0, 0, a, sizearray(image[]), 10, 70, 100, #image[0][0]);
visualwindow(dialog, 1, 0, 0, sizearray(image2)-a, sizearray(image2[]), 10+a, 70, 100, #image2[0][0]);
percent=a/2;
SetWindowText(static, format(percent)+"%");
sleep(5);
}
SetStatusBar(50);
sleep(5000);
SetStatusBar(100);
sleep(5000);
SetStatusBar(150);
sleep(5000);
SetStatusBar(200);
sleep(5000);
SetStatusBar(50);
loop()
{
sleep(100);
}
(Добавление)
Вот например при установке хрома, мазилы появляется прямоугольник перед запуском, а потом сама установка.
(Добавление)
Дальше я попробую добавить градиент на полосу загрузки активной и статической тусклой части, потом фон диалога и я отдам код обратно, может кому-то такое нужно будет. |
|
|
Zireael |
Отправлено: 16 Августа, 2019 - 02:11:02
|
Эксперт
Покинул форум
Сообщений всего: 4467
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: Как создать градиентовую линию
CODE:#define GRADIENT_FILL_RECT_H 0
external(INT, "GetDC", "GetDC", "User32.dll");
external(INT, "GradientFill", "GradientFill", "Msimg32.dll" );
int hdc=GetDC(0);
char TRIVERTEX[32]; // структура TRIVERTEX
int coord[4]={200, 300, 500, 330} // координаты
int color[2]={65280, 255} // цвета (зелёный, красный)
int rect[2]={0, 1}
fill_structure(#TRIVERTEX[0], #coord[0], #color[0]); // заполнение структуры TRIVERTEX
loop()
{
GradientFill(hdc, address(#TRIVERTEX[0]), 2, address(#rect[0]), 1, GRADIENT_FILL_RECT_H); // рисование
sleep(10);
}
function fill_structure(char #Vertex, int #pos, int #c)
{
codhex(pos[0], #Vertex[0]);
codhex(pos[1], #Vertex[4]);
codhex(rvalue(c[0]) * 256, #Vertex[8]);
codhex(gvalue(c[0]) * 256, #Vertex[10]);
codhex(bvalue(c[0]) * 256, #Vertex[12]);
codhex(pos[2], #Vertex[16]);
codhex(pos[3], #Vertex[20]);
codhex(rvalue(c[1]) * 256, #Vertex[24]);
codhex(gvalue(c[1]) * 256, #Vertex[26]);
codhex(bvalue(c[1]) * 256, #Vertex[28]);
}
(Добавление)
CODE:#define GRADIENT_FILL_RECT_H 0
external(INT, "GetDC", "GetDC", "User32.dll");
external(INT, "ReleaseDC", "ReleaseDC", "User32.dll");
external(INT, "GradientFill", "GradientFill", "Msimg32.dll" );
int hdc=GetDC(0);
char TRIVERTEX[64]; // структура TRIVERTEX
int coord[8]={200, 300, 700, 330, 200, 300, 700, 330} // координаты
int color[4]={180, 255, 0, 100} // цвета
int rect[4]={0, 1, 2, 3}
for(int i=0; i<=coord[2]-coord[0]; i=i+(coord[2]-coord[0])/10)
{
coord[4]=coord[0]+i;
fill_structure(#TRIVERTEX[0], #coord[0], #color[0]);
GradientFill(hdc, address(#TRIVERTEX[0]), 4, address(#rect[0]), 2, GRADIENT_FILL_RECT_H); // рисование
sleep(350);
}
ReleaseDC(0, hdc);
function fill_structure(char #Vertex, int #pos, int #c)
{
for(int i=0; i<2; i++)
{
codhex(pos[i*4], #Vertex[i*32]);
codhex(pos[i*4+1], #Vertex[i*32+4]);
codhex(rvalue(c[i*2]) * 256, #Vertex[i*32+8]);
codhex(gvalue(c[i*2]) * 256, #Vertex[i*32+10]);
codhex(bvalue(c[i*2]) * 256, #Vertex[i*32+12]);
codhex(pos[i*4+2], #Vertex[i*32+16]);
codhex(pos[i*4+3], #Vertex[i*32+20]);
codhex(rvalue(c[i*2+1]) * 256, #Vertex[i*32+24]);
codhex(gvalue(c[i*2+1]) * 256, #Vertex[i*32+26]);
codhex(bvalue(c[i*2+1]) * 256, #Vertex[i*32+28]);
}
} |
|
|
007wan |
Отправлено: 16 Августа, 2019 - 08:14:09
|
Эксперт
Покинул форум
Сообщений всего: 1837
Дата рег-ции: Март 2017
Репутация: -2
|
А как сделать вертикальный градиаент, т.е вверху один цвет, а внизу другой и Для линии загрузки, которая двигается в право яркий цвет, а так, которая стоит на месте тусклый и серый.(нУ последнее я могу сам))
(Добавление)
Похожу GRADIENT_FILL_RECT_V
(Добавление)
Спасибо
(Добавление)
Zireael , CODE:int coord[8]={200, 300, 700, 330, 200, 300, 700, 330} // êîîðäèíàòû
А где тут Икс игрек и высота и ширина? А то я методом прибавления и отнятия не смог вычислить, у меня прячмоугольник какой-то странный становится.
(Добавление)
А как уменьшить количество пикселей при переходе ползунка вправо на 1 %, что бы обеспечить плавность его работы не скачки резко, и что бы не повлияло это на размеры(высота и ширина)
CODE:#define GRADIENT_FILL_RECT_H 0
#define GRADIENT_FILL_RECT_V 1
external(INT, "GetDC", "GetDC", "User32.dll");
external(INT, "ReleaseDC", "ReleaseDC", "User32.dll");
external(INT, "GradientFill", "GradientFill", "Msimg32.dll" );
int hdc=GetDC(0);
char TRIVERTEX[64]; // структура TRIVERTEX
int coord[8]={200, 300, 700, 330, 200, 300, 700, 330} // координаты
int color[4]={3329330, 0, 9470064, 65539} // цвета
int rect[4]={0, 1, 2, 3}
for(int i=0; i<=coord[2]-coord[0]; i=i+(coord[2]-coord[0])/100)
{
textout(0, 0, 0, format(i/5), 1);
coord[4]=coord[0]+i;
fill_structure(#TRIVERTEX[0], #coord[0], #color[0]);
GradientFill(hdc, address(#TRIVERTEX[0]), 4, address(#rect[0]), 2, GRADIENT_FILL_RECT_V); // рисование
sleep(350);
}
ReleaseDC(0, hdc);
function fill_structure(char #Vertex, int #pos, int #c)
{
for(int i=0; i<2; i++)
{
codhex(pos[i*4], #Vertex[i*32]);
codhex(pos[i*4+1], #Vertex[i*32+4]);
codhex(rvalue(c[i*2]) * 256, #Vertex[i*32+8]);
codhex(gvalue(c[i*2]) * 256, #Vertex[i*32+10]);
codhex(bvalue(c[i*2]) * 256, #Vertex[i*32+12]);
codhex(pos[i*4+2], #Vertex[i*32+16]);
codhex(pos[i*4+3], #Vertex[i*32+20]);
codhex(rvalue(c[i*2+1]) * 256, #Vertex[i*32+24]);
codhex(gvalue(c[i*2+1]) * 256, #Vertex[i*32+26]);
codhex(bvalue(c[i*2+1]) * 256, #Vertex[i*32+28]);
}
}
(Отредактировано автором: 16 Августа, 2019 - 08:18:55) |
|
|
Zireael |
Отправлено: 16 Августа, 2019 - 10:29:44
|
Эксперт
Покинул форум
Сообщений всего: 4467
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: int coord[8]={200, 300, 700, 330, 200, 300, 700, 330}
А где тут Икс игрек и высота и ширина?
200, 300 - левый верхний угол прямоугольника.
700, 330 - правый нижний. |
|
|
007wan |
Отправлено: 17 Августа, 2019 - 11:14:03
|
Эксперт
Покинул форум
Сообщений всего: 1837
Дата рег-ции: Март 2017
Репутация: -2
|
У меня есть пару идей как это реализовать:
Первый: Использовать снимок экрана в прямоугольной области как размер прямоугольника статус бара(который белый прямоугольник), после снимка экрана в центре экрана небольшого прямоугольника, загружает его в Кибор и в папку с программой, далее меняет постепенно фон картинки в белый, но есть изъян: В момент изменения цвета и вывод картинки с меняющимся фоном может поменяться фон рабочего стола или открыта программа какая-то, что сделает картинку фоном рабчоего стола и оттенком белого цвета и будет не очень.
Второй: Тоже самое, но начальное будет визуальное окно, которое будет отображать рабочий стол или всё, что в центре прямоугольника меняется, а поверх накладывать изображение с прозрачностью.
Третий: вывести изображение и начальная прозрачность его будет 100%, а потом потепенно прибавляться.
Хочу заметить, что я не видел в win api функций для смены прозрачности элементом(прямоугольников, квадратов, линий...).
(Добавление)
Мне нужно именно использовать прозрачность как поноценную функцию, а не просто "продырявить" прямоугольник, мне нужно регулировать его состояние, например, поставить прозрачность 50% для Rectangle
(Добавление)
Нашел это, но не уверен, что знаю как использовать:
GdiTransparentBlt
(Добавление)
Что я использую не так?
CODE:GdiTransparentBlt(DC, Display_Width/2-130, Display_Height/2-100, 300, 130, DC, Display_Width/2-130, Display_Height/2-100, 300, 130, 6908265);
|
|
|
|