Zireael |
Отправлено: 02 Ноября, 2019 - 19:37:37
|
Эксперт
Покинул форум
Сообщений всего: 4466
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Нарисованный Tab (Отобразить)CODE:#define WS_VISIBLE 268435456
#define WS_CHILD 1073741824
#define WS_BORDER 8388608
#define PS_SOLID 0
#define PS_NULL 5
#define SRCCOPY 13369376
#define TRANSPARENT 1
#define DT_CENTER 1
#define RUSSIAN_CHARSET 204
external(INT, "CreateWindow", "CreateWindowExA", "User32.dll");
external(INT, "GetDC", "GetDC", "User32.dll");
external(INT, "CreatePen", "CreatePen", "Gdi32.dll");
external(INT, "CreateSolidBrush", "CreateSolidBrush", "Gdi32.dll");
external(INT, "SelectObject", "SelectObject", "Gdi32.dll");
external(INT, "RoundRect", "RoundRect", "Gdi32.dll");
external(INT, "Rectangle", "Rectangle", "Gdi32.dll");
external(INT, "PtInRect", "PtInRect", "User32.dll");
external(INT, "BitBlt", "BitBlt", "Gdi32.dll");
external(INT, "CreateCompatibleDC", "CreateCompatibleDC", "Gdi32.dll");
external(INT, "CreateCompatibleBitmap", "CreateCompatibleBitmap", "Gdi32.dll");
external(INT, "DrawText", "DrawTextA", "User32.dll");
external(INT, "SetTextColor", "SetTextColor", "Gdi32.dll");
external(INT, "SetBkMode", "SetBkMode", "Gdi32.dll");
external(INT, "CreateFont", "CreateFontA", "Gdi32.dll" );
int h_font, old_font; // шрифт
int mouseX, mouse_Y; // координаты мыши
int hdc, hdc_mem, hdc_bitmap;
int pen, brush1, brush2, brush_fon, old_pen, old_brush;
pen=CreatePen(PS_NULL, 0, 0);
brush_fon=CreateSolidBrush(16769446); // цвет фона
brush1=CreateSolidBrush(16017042); // фон таба и активной вкладки
brush2=CreateSolidBrush(255); // цвет неактивной вкладки
int current_tab=1; // текущая вкладка
int rect_tab[3][4]; // 3 вкладки
rect_tab[0][0]=20; rect_tab[0][1]=10; rect_tab[0][2]=100; rect_tab[0][3]=40;
rect_tab[1][0]=105; rect_tab[1][1]=10; rect_tab[1][2]=185; rect_tab[1][3]=40;
rect_tab[2][0]=190; rect_tab[2][1]=10; rect_tab[2][2]=270; rect_tab[2][3]=40;
string text_tab[3]={"Вкладка1", "Вкладка2", "Вкладка3"} // текст вкладок
// размер изображения
int image_width=400;
int image_height=300;
createdialog(0);
showdialog(0, "Dialog", 200, 200, 600, 500, 1, 1);
enabletimer(0);
loop()sleep(10);
function getmessage(0, WM_CREATE)
{
hdc=GetDC(gethwnd(0));
hdc_mem=CreateCompatibleDC(hdc);
hdc_bitmap=CreateCompatibleBitmap(hdc, image_width, image_height);
SelectObject(hdc_mem, hdc_bitmap);
SetBkMode(hdc_mem, TRANSPARENT);
h_font = CreateFont(-14, 0, 0, 0, 500, 0, 0, 0, RUSSIAN_CHARSET, 0, 0, 0, 0, "Comic Sans MS"); // создать шрифт
}
function getmessage(0, WM_MOVE)
{
pause(100);
}
CREATE_TIMER(0, 30)
{
if(getkeystate(1))
{
while(getkeystate(1))sleep(10);
for(int tab_=0; tab_<sizearray(rect_tab); tab_++)
{
getmouse(mouseX, mouse_Y, formatiw(gethwnd(0)));
if(PtInRect(address(#rect_tab[tab_][0]), mouseX, mouse_Y)){current_tab=tab_; break;}
}
}
paint();
}
function paint()
{
old_pen=SelectObject(hdc_mem, pen);
// фон
old_brush=SelectObject(hdc_mem, brush_fon);
Rectangle(hdc_mem, 0, 0, image_width+1, image_height+1);
SelectObject(hdc_mem, old_brush);
// вкладки
for(int i=0; i<sizearray(rect_tab); i++)
{
if(i==current_tab)old_brush=SelectObject(hdc_mem, brush1); // если активная вкладка выбрать эту кисть
else old_brush=SelectObject(hdc_mem, brush2); // иначе эту
RoundRect(hdc_mem, rect_tab[i][0], rect_tab[i][1], rect_tab[i][2], rect_tab[i][3], 10, 10);
SelectObject(hdc_mem, old_brush);
SetTextColor(hdc_mem, 65279); // цвет текста
//TextOut(hdc_mem, rect_tab[i][0]+5, rect_tab[i][1]+3, text_tab[i], size(text_tab[i]));
old_font=SelectObject(hdc_mem, h_font);
DrawText(hdc_mem, text_tab[i], size(text_tab[i]), address(#rect_tab[i][0]), DT_CENTER);
SelectObject(hdc_mem, old_font);
}
// таб
old_brush=SelectObject(hdc_mem, brush1);
RoundRect(hdc_mem, 5, 30, 350, 250, 10, 10);
SelectObject(hdc_mem, old_brush);
SelectObject(hdc_mem, old_pen);
BitBlt(hdc, 0, 0, image_width, image_height, hdc_mem, 0, 0, SRCCOPY); // вывод на диалог
} |
|
|
007wan |
Отправлено: 03 Ноября, 2019 - 07:54:57
|
Эксперт
Покинул форум
Сообщений всего: 1837
Дата рег-ции: Март 2017
Репутация: -2
|
Zireael пишет: Нарисованный Tab (Отобразить)CODE:#define WS_VISIBLE 268435456
#define WS_CHILD 1073741824
#define WS_BORDER 8388608
#define PS_SOLID 0
#define PS_NULL 5
#define SRCCOPY 13369376
#define TRANSPARENT 1
#define DT_CENTER 1
#define RUSSIAN_CHARSET 204
external(INT, "CreateWindow", "CreateWindowExA", "User32.dll");
external(INT, "GetDC", "GetDC", "User32.dll");
external(INT, "CreatePen", "CreatePen", "Gdi32.dll");
external(INT, "CreateSolidBrush", "CreateSolidBrush", "Gdi32.dll");
external(INT, "SelectObject", "SelectObject", "Gdi32.dll");
external(INT, "RoundRect", "RoundRect", "Gdi32.dll");
external(INT, "Rectangle", "Rectangle", "Gdi32.dll");
external(INT, "PtInRect", "PtInRect", "User32.dll");
external(INT, "BitBlt", "BitBlt", "Gdi32.dll");
external(INT, "CreateCompatibleDC", "CreateCompatibleDC", "Gdi32.dll");
external(INT, "CreateCompatibleBitmap", "CreateCompatibleBitmap", "Gdi32.dll");
external(INT, "DrawText", "DrawTextA", "User32.dll");
external(INT, "SetTextColor", "SetTextColor", "Gdi32.dll");
external(INT, "SetBkMode", "SetBkMode", "Gdi32.dll");
external(INT, "CreateFont", "CreateFontA", "Gdi32.dll" );
int h_font, old_font; // шрифт
int mouseX, mouse_Y; // координаты мыши
int hdc, hdc_mem, hdc_bitmap;
int pen, brush1, brush2, brush_fon, old_pen, old_brush;
pen=CreatePen(PS_NULL, 0, 0);
brush_fon=CreateSolidBrush(16769446); // цвет фона
brush1=CreateSolidBrush(16017042); // фон таба и активной вкладки
brush2=CreateSolidBrush(255); // цвет неактивной вкладки
int current_tab=1; // текущая вкладка
int rect_tab[3][4]; // 3 вкладки
rect_tab[0][0]=20; rect_tab[0][1]=10; rect_tab[0][2]=100; rect_tab[0][3]=40;
rect_tab[1][0]=105; rect_tab[1][1]=10; rect_tab[1][2]=185; rect_tab[1][3]=40;
rect_tab[2][0]=190; rect_tab[2][1]=10; rect_tab[2][2]=270; rect_tab[2][3]=40;
string text_tab[3]={"Вкладка1", "Вкладка2", "Вкладка3"} // текст вкладок
// размер изображения
int image_width=400;
int image_height=300;
createdialog(0);
showdialog(0, "Dialog", 200, 200, 600, 500, 1, 1);
enabletimer(0);
loop()sleep(10);
function getmessage(0, WM_CREATE)
{
hdc=GetDC(gethwnd(0));
hdc_mem=CreateCompatibleDC(hdc);
hdc_bitmap=CreateCompatibleBitmap(hdc, image_width, image_height);
SelectObject(hdc_mem, hdc_bitmap);
SetBkMode(hdc_mem, TRANSPARENT);
h_font = CreateFont(-14, 0, 0, 0, 500, 0, 0, 0, RUSSIAN_CHARSET, 0, 0, 0, 0, "Comic Sans MS"); // создать шрифт
}
function getmessage(0, WM_MOVE)
{
pause(100);
}
CREATE_TIMER(0, 30)
{
if(getkeystate(1))
{
while(getkeystate(1))sleep(10);
for(int tab_=0; tab_<sizearray(rect_tab); tab_++)
{
getmouse(mouseX, mouse_Y, formatiw(gethwnd(0)));
if(PtInRect(address(#rect_tab[tab_][0]), mouseX, mouse_Y)){current_tab=tab_; break;}
}
}
paint();
}
function paint()
{
old_pen=SelectObject(hdc_mem, pen);
// фон
old_brush=SelectObject(hdc_mem, brush_fon);
Rectangle(hdc_mem, 0, 0, image_width+1, image_height+1);
SelectObject(hdc_mem, old_brush);
// вкладки
for(int i=0; i<sizearray(rect_tab); i++)
{
if(i==current_tab)old_brush=SelectObject(hdc_mem, brush1); // если активная вкладка выбрать эту кисть
else old_brush=SelectObject(hdc_mem, brush2); // иначе эту
RoundRect(hdc_mem, rect_tab[i][0], rect_tab[i][1], rect_tab[i][2], rect_tab[i][3], 10, 10);
SelectObject(hdc_mem, old_brush);
SetTextColor(hdc_mem, 65279); // цвет текста
//TextOut(hdc_mem, rect_tab[i][0]+5, rect_tab[i][1]+3, text_tab[i], size(text_tab[i]));
old_font=SelectObject(hdc_mem, h_font);
DrawText(hdc_mem, text_tab[i], size(text_tab[i]), address(#rect_tab[i][0]), DT_CENTER);
SelectObject(hdc_mem, old_font);
}
// таб
old_brush=SelectObject(hdc_mem, brush1);
RoundRect(hdc_mem, 5, 30, 350, 250, 10, 10);
SelectObject(hdc_mem, old_brush);
SelectObject(hdc_mem, old_pen);
BitBlt(hdc, 0, 0, image_width, image_height, hdc_mem, 0, 0, SRCCOPY); // вывод на диалог
}
Вау, спасибо большое. Теперь можно чуть по другому сделать?
Примерно так:
Нажмите для увеличения
(Добавление)
Еще можно сделать некоторый апгрейд, пожалуйста: Контроллы нарисованные через CreateWindow исчезают, а когда на них нажимаешь, то они промелькают, может нужно после создания контролла на нарисованном табе сделать прозрачное отверстие(где-то был код)? |
|
|
Zireael |
Отправлено: 03 Ноября, 2019 - 09:55:53
|
Эксперт
Покинул форум
Сообщений всего: 4466
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: где координаты всего таба?
Цитата: // таб
old_brush=SelectObject(hdc_mem, brush1);
RoundRect(hdc_mem, 5, 30, 350, 250, 10, 10);
Цитата: вкладок
Цитата: rect_tab[0][0]=20; rect_tab[0][1]=10; rect_tab[0][2]=100; rect_tab[0][3]=40;
Цитата: где сам прямоугольник главный
Цитата: int image_width=400;
int image_height=300;
Цитата: Хочу переместить чуть ниже
Смотря что перемещать. Если сам таб относительно выводимого изображения, то
Цитата: RoundRect(hdc_mem, 5, 30, 350, 250, 10, 10);
если вывод изображения на диалог, то
Цитата: BitBlt(hdc, 0, 0, image_width, image_height, hdc_mem, 0, 0, SRCCOPY); |
|
|
007wan |
Отправлено: 03 Ноября, 2019 - 10:34:57
|
Эксперт
Покинул форум
Сообщений всего: 1837
Дата рег-ции: Март 2017
Репутация: -2
|
Zireael , Извините, как сделать зависимость: количество символов = ширина вкладки+Учитывая иконки вкладки слева перед текстом(если можно пример).
Изначально у меня такая идея:
При запуске кода будет ВСЕГДА одна вкладка, называется она "Пустая вкладка"(ёё не закрыть, нету крестика справа вверху вкладки), потом идут какие-то контроллы, которые видно(Часть таба прозрачная).
Есть меню сверху с кнопками "Файл--->Создать процесс", нажимая это создается новая вкладка и она становится активной, а все остальные - нету. на ней уже другие контроллы итд(всего пока будет 3 вкладки, потом посомтрю) при переключении будут меняться контроллы и соответвественно будет прозрачность таба меняться.
Мжно пж такое, для меня это сложно, умоляЮ)
(Добавление)
Подробная идея:
При запуске кода будет создаваться одна вкладка "Пустая вкладка"(ёё текст можно будет в дальнейшем изменить, как и иконку, но раз это пустая вкладка - значит иконки нету) количество букв в слове любом при создании вкладки повлияет на ширину вкладки и повлияет на расположении вкладок промежуточных(то есть они переместятся, т.к ширина другой изменилась).
Что в пустой ЛЮБОЙ вкладки: ListBox с названиями имён(слов), при выборе которых создаются контроллы, а сам Listbox
- удаляется именно для "Пустой активной вкладки", как и выбранная строчка в Listbox, выбранная строчка в Listbox , например, "Вкладка 1" это имя назначается вкладке той, которая сейчас активна и в которой была выбрана строчка в Listbox и создаются контроллы(для каждой вкладки разные, а именно в зависимости: какую строчку в Listbox выбрали, то и такие будут контроллы. Максимально из Listbox можно выбрать 1 строчку, не больше(тоесть не должны повторяться вкладки)
Далее будет меню сверху: "Файл--->Создать процесс", при нажатии создается пустая вкладка.(Отредактировано автором: 03 Ноября, 2019 - 10:44:32) |
|
|
Zireael |
Отправлено: 03 Ноября, 2019 - 10:48:06
|
Эксперт
Покинул форум
Сообщений всего: 4466
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Первый пост:
Цитата: Только текст и сами вкладки и механизм переключение
Цитата: как сделать зависимость: количество символов = ширина вкладки+Учитывая иконки вкладки слева перед текстом
GetTextExtentPoint32A - вычисляет ширину и высоту указанной строки текста. |
|
|
|