Zireael |
Отправлено: 29 Сентября, 2019 - 00:41:16
|
Эксперт
Покинул форум
Сообщений всего: 4465
Дата рег-ции: Нояб. 2017
Репутация: 585
|
TreeView (Отобразить)CODE:#define WS_VISIBLE 268435456
#define WS_BORDER 8388608
#define WS_CHILD 1073741824
#define TVM_INSERTITEMA 4352
#define TVM_SETITEMA 4365
#define TVI_LAST 65534
#define TVI_ROOT 65536
#define TVIF_TEXT 1
#define TVIF_CHILDREN 64
#define TVS_HASBUTTONS 1
#define TVS_HASLINES 2
#define TVS_LINESATROOT 4
#define TVS_TRACKSELECT 512
#define TVM_SETBKCOLOR 4381
#define TVM_SETTEXTCOLOR 4382
#define TVM_SETLINECOLOR 4392
#define ICC_TREEVIEW_CLASSES 2
#define TVM_EXPAND 4354
#define TVE_EXPAND 2
#define TVM_GETNEXTITEM 4362
#define TVGN_CARET 9
#define TVM_GETITEMA 4364
#define TVIF_HANDLE 16
#define RUSSIAN_CHARSET 204
external(INT, "CreateWindow", "CreateWindowExA", "User32.dll");
external(INT, "InitCommonControlsEx", "InitCommonControlsEx", "Comctl32.dll");
external(INT, "CreateFont", "CreateFontA", "Gdi32.dll" );
int INITCOMMONCONTROLSEX[2]={8, ICC_TREEVIEW_CLASSES}
InitCommonControlsEx(address(#INITCOMMONCONTROLSEX[0]));
int TreeView, h_font;
int MyComp=0, diskC=0, diskD=0, diskE=0;
int TVITEMEXA[15];
char text[99]={0};
createdialog(0);
showdialog(0, "Dialog", 300, 300, 400, 500, 1, 1);
loop()sleep(10);
function getmessage(0, WM_NOTIFY)
{
initialarray(#TVITEMEXA[0], 0);
TVITEMEXA[0]=TVIF_TEXT | TVIF_HANDLE;
TVITEMEXA[1]=sendmessage(TVM_GETNEXTITEM, TVGN_CARET, 0, formatiw(TreeView)); //получить хендл выбранного итема
TVITEMEXA[4]=address(#text[0]);
TVITEMEXA[5]=sizearray(text);
if(sendmessage(TVM_GETITEMA, 0, address(#TVITEMEXA[0]), formatiw(TreeView)))
{
textbkcolor(16000000, 65279);
textout(0, 500, 400, format(#text[0]), 1); // текст выбранного пункта
}
}
function getmessage(0, WM_CREATE)
{
TreeView=CreateWindow(0, "SysTreeView32", "", TVS_LINESATROOT | TVS_HASBUTTONS | TVS_TRACKSELECT | TVS_HASLINES |
WS_VISIBLE | WS_CHILD | WS_BORDER, 10, 10, 200, 250, gethwnd(0), 0, 0, 0);
// функция INSERTITEM добавляет элемент в дерево. Передаётся:
// хендл дерева
// хендл родительского элемента или 0, тогда элемент добаляется в корень
// позиция вставки
// указатель на переменную, в которую запишется хендл добавленного элемента
// элемент имеет дочерние окна 1 или 0
// текст элемента
INSERTITEM(TreeView, 0, TVI_ROOT, #MyComp, 1, "Мой компьютер");
//messagebox(MyComp);
INSERTITEM(TreeView, MyComp, TVI_LAST, #diskC, 1, "Локальный диск (С:)";
INSERTITEM(TreeView, MyComp, TVI_LAST, #diskD, 1, "Новый том (D:)");
INSERTITEM(TreeView, MyComp, TVI_LAST, #diskE, 1, "CD-дисковод (E:)");
int item;
INSERTITEM(TreeView, diskC, TVI_LAST, #item, 0, "Windows");
INSERTITEM(TreeView, diskC, TVI_LAST, #item, 0, "System32");
INSERTITEM(TreeView, diskD, TVI_LAST, #item, 0, "Games");
INSERTITEM(TreeView, diskD, TVI_LAST, #item, 0, "Music");
INSERTITEM(TreeView, diskE, TVI_LAST, #item, 0, "Папка");
sendmessage(TVM_SETBKCOLOR, 0, 10354313, formatiw(TreeView)); // цвет фона
sendmessage(TVM_SETTEXTCOLOR, 0, 255, formatiw(TreeView)); // цвет текста
sendmessage(TVM_SETLINECOLOR, 0, 16000000, formatiw(TreeView)); // цвет линий
h_font = CreateFont(-14, 0, 0, 0, 500, 0, 0, 0, RUSSIAN_CHARSET, 0, 0, 0, 0, "Comic Sans MS"); // создать шрифт
sendmessage(WM_SETFONT, h_font, 1, formatiw(TreeView)); // установить шрифт
sendmessage(TVM_EXPAND, TVE_EXPAND, MyComp, formatiw(TreeView)); // раскрыть ветку
}
function INSERTITEM(int handle_tree, int hParent, int hInsertAfter, int #hItem, int cChildren, string s)
{
char text[99];
int TVITEMEXA[15], TVINSERTSTRUCTA[3];
initialarray(#TVITEMEXA[0], 0);
TVITEMEXA[0]=TVIF_TEXT | TVIF_CHILDREN;
TVITEMEXA[4]=address(#text[0]);
TVITEMEXA[8]=cChildren;
TVINSERTSTRUCTA[0]=hParent;
TVINSERTSTRUCTA[1]=hInsertAfter;
TVINSERTSTRUCTA[2]=address(#TVITEMEXA[0]);
hItem=sendmessage(TVM_INSERTITEMA, 0, address(#TVINSERTSTRUCTA[0]), formatiw(handle_tree));
strcpy(#text[0], s);
TVITEMEXA[1]=hItem;
TVITEMEXA[5]=size(s);
sendmessage(TVM_SETITEMA, 0, address(#TVITEMEXA[0]), formatiw(handle_tree));
}
Раскрыть ветку (TVM_EXPAND).
Изменить шрифт (WM_SETFONT).
Узнать какой выбран пункт (TVM_GETNEXTITEM + TVM_GETITEMA). |
|
|
007wan |
Отправлено: 29 Сентября, 2019 - 19:36:11
|
Эксперт
Покинул форум
Сообщений всего: 1837
Дата рег-ции: Март 2017
Репутация: -2
|
Не получается сделать с ричем статиком подобное...
(Добавление)
И езе тогда вопросик, раз уж тема пошла об этом, то можно ли ограничить функцию WindowFromPoint? Она получает получает дескриптор окна, получает прямоугольник контролла, можно ли ёё ограничить? ее прямогольник, например, весь контрол 300 х20, а срабатывать эта функция по смене курсора будет где-то при наведении от 150х20, а первые 150 не трогает и не меняет курсор.(Отредактировано автором: 29 Сентября, 2019 - 19:40:49) |
|
|
Zireael |
Отправлено: 29 Сентября, 2019 - 21:57:15
|
Эксперт
Покинул форум
Сообщений всего: 4465
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: Не получается сделать с ричем статиком подобное...
RichEdit (Отобразить)CODE:#define WS_VISIBLE 268435456
#define WS_CHILD 1073741824
#define CFM_COLOR 1073741824
#define SCF_ALL 4
#define EM_SETBKGNDCOLOR 1091
#define EM_SETCHARFORMAT 1092
#define SCF_SELECTION 1
#define EM_EXSETSEL 1079
#define EM_HIDESELECTION 1087
#define RUSSIAN_CHARSET 204
#define CFM_UNDERLINE 4
#define CFE_UNDERLINE 4
#define CFM_CHARSET 134217728
external(INT, "EnableWindow", "EnableWindow", "User32.dll");
external(INT, "SetWindowText", "SetWindowTextA", "User32.dll");
external(INT, "CreateWindow", "CreateWindowExA", "User32.dll");
external(INT, "LoadLibrary", "LoadLibraryA", "Kernel32.dll");
external(INT, "CreateFont", "CreateFontA", "Gdi32.dll" );
LoadLibrary("Msftedit.dll");
char CHARFORMAT[60];
int edit1, edit2, h_font1, h_font2;
createdialog(0);
showdialog(0, "Dialog", 300, 300, 400, 200, 1, 1);
loop()sleep(10);
function SetEditText(int handle, string s)
{
SetWindowText(handle, s);
if(handle==edit1)
{
color_text("Домашняя страница", 255, handle, s, 0); // последний параметр 0 - без подчеркивания
color_text("vk.com", 16000000, handle, s, 1); // 1 - подчеркнутый текст
return;
}
if(handle==edit2)
{
color_text("сайт", 2199256, handle, s, 0);
color_text("vk.com", 12533122, handle, s, 1);
return;
}
}
function getmessage(0, WM_CREATE)
{
edit1=CreateWindow(0, "RICHEDIT50W", "", WS_VISIBLE | WS_CHILD, 10, 10, 300, 25, gethwnd(0), 0, 0, 0);
edit2=CreateWindow(0, "RICHEDIT50W", "", WS_VISIBLE | WS_CHILD, 60, 50, 200, 35, gethwnd(0), 0, 0, 0);
EnableWindow(edit1, 0);
EnableWindow(edit2, 0);
initialarray(#CHARFORMAT[0], 0);
writeaddress(60, address(#CHARFORMAT[0]));
writeaddress(CFE_UNDERLINE, address(#CHARFORMAT[8]));
sendmessage(EM_HIDESELECTION, 1, 0, formatiw(edit1));
h_font1 = CreateFont(-16, 0, 0, 0, 500, 0, 0, 0, RUSSIAN_CHARSET, 0, 0, 0, 0, "Comic Sans MS"); // создать шрифт
sendmessage(WM_SETFONT, h_font1, 1, formatiw(edit1)); // установить шрифт
h_font2 = CreateFont(-20, 0, 0, 0, 400, 0, 0, 0, RUSSIAN_CHARSET, 0, 0, 0, 0, "Times New Roman"); // создать шрифт
sendmessage(WM_SETFONT, h_font2, 1, formatiw(edit2)); // установить шрифт
SetEditText(edit1, "Домашняя страница vk.com");
SetEditText(edit2, "vk.com сайт");
}
function color_text(string text, int color, int handle_edit, string s, int UNDERLINE)
{
if(UNDERLINE)writeaddress(CFM_COLOR | CFM_UNDERLINE, address(#CHARFORMAT[4]));
else writeaddress(CFM_COLOR, address(#CHARFORMAT[4]));
char text_edit[999];
string text_find[999];
int CHARRANGE[2], Pos_start[999], Pos_end[999];
strcpy(#text_edit[0], s);
int count=regexsearch(sizearray(text_find), #text_find[0], format(#text_edit[0]), text);
if(count)
{
regexstart(#Pos_start[0]); regexend(#Pos_end[0]);
writeaddress(color, address(#CHARFORMAT[20]));
for(int i=0; i<count; i++)
{
CHARRANGE[0]=Pos_start[i]; CHARRANGE[1]=Pos_end[i];
sendmessage(EM_EXSETSEL, 0, address(#CHARRANGE[0]), formatiw(handle_edit)); // исправить на handle
sendmessage(EM_SETCHARFORMAT, SCF_SELECTION, address(#CHARFORMAT[0]), formatiw(handle_edit));
}
}
}
Цитата: можно ли ограничить функцию WindowFromPoint? Она получает получает дескриптор окна, получает прямоугольник контролла
WindowFromPoint только хендл получает, размеры контрола получает другая функция. |
|
|
007wan |
Отправлено: 01 Октября, 2019 - 11:01:44
|
Эксперт
Покинул форум
Сообщений всего: 1837
Дата рег-ции: Март 2017
Репутация: -2
|
Zireael пишет: Цитата: Не получается сделать с ричем статиком подобное...
RichEdit (Отобразить)CODE:#define WS_VISIBLE 268435456
#define WS_CHILD 1073741824
#define CFM_COLOR 1073741824
#define SCF_ALL 4
#define EM_SETBKGNDCOLOR 1091
#define EM_SETCHARFORMAT 1092
#define SCF_SELECTION 1
#define EM_EXSETSEL 1079
#define EM_HIDESELECTION 1087
#define RUSSIAN_CHARSET 204
#define CFM_UNDERLINE 4
#define CFE_UNDERLINE 4
#define CFM_CHARSET 134217728
external(INT, "EnableWindow", "EnableWindow", "User32.dll");
external(INT, "SetWindowText", "SetWindowTextA", "User32.dll");
external(INT, "CreateWindow", "CreateWindowExA", "User32.dll");
external(INT, "LoadLibrary", "LoadLibraryA", "Kernel32.dll");
external(INT, "CreateFont", "CreateFontA", "Gdi32.dll" );
LoadLibrary("Msftedit.dll");
char CHARFORMAT[60];
int edit1, edit2, h_font1, h_font2;
createdialog(0);
showdialog(0, "Dialog", 300, 300, 400, 200, 1, 1);
loop()sleep(10);
function SetEditText(int handle, string s)
{
SetWindowText(handle, s);
if(handle==edit1)
{
color_text("Домашняя страница", 255, handle, s, 0); // последний параметр 0 - без подчеркивания
color_text("vk.com", 16000000, handle, s, 1); // 1 - подчеркнутый текст
return;
}
if(handle==edit2)
{
color_text("сайт", 2199256, handle, s, 0);
color_text("vk.com", 12533122, handle, s, 1);
return;
}
}
function getmessage(0, WM_CREATE)
{
edit1=CreateWindow(0, "RICHEDIT50W", "", WS_VISIBLE | WS_CHILD, 10, 10, 300, 25, gethwnd(0), 0, 0, 0);
edit2=CreateWindow(0, "RICHEDIT50W", "", WS_VISIBLE | WS_CHILD, 60, 50, 200, 35, gethwnd(0), 0, 0, 0);
EnableWindow(edit1, 0);
EnableWindow(edit2, 0);
initialarray(#CHARFORMAT[0], 0);
writeaddress(60, address(#CHARFORMAT[0]));
writeaddress(CFE_UNDERLINE, address(#CHARFORMAT[8]));
sendmessage(EM_HIDESELECTION, 1, 0, formatiw(edit1));
h_font1 = CreateFont(-16, 0, 0, 0, 500, 0, 0, 0, RUSSIAN_CHARSET, 0, 0, 0, 0, "Comic Sans MS"); // создать шрифт
sendmessage(WM_SETFONT, h_font1, 1, formatiw(edit1)); // установить шрифт
h_font2 = CreateFont(-20, 0, 0, 0, 400, 0, 0, 0, RUSSIAN_CHARSET, 0, 0, 0, 0, "Times New Roman"); // создать шрифт
sendmessage(WM_SETFONT, h_font2, 1, formatiw(edit2)); // установить шрифт
SetEditText(edit1, "Домашняя страница vk.com");
SetEditText(edit2, "vk.com сайт");
}
function color_text(string text, int color, int handle_edit, string s, int UNDERLINE)
{
if(UNDERLINE)writeaddress(CFM_COLOR | CFM_UNDERLINE, address(#CHARFORMAT[4]));
else writeaddress(CFM_COLOR, address(#CHARFORMAT[4]));
char text_edit[999];
string text_find[999];
int CHARRANGE[2], Pos_start[999], Pos_end[999];
strcpy(#text_edit[0], s);
int count=regexsearch(sizearray(text_find), #text_find[0], format(#text_edit[0]), text);
if(count)
{
regexstart(#Pos_start[0]); regexend(#Pos_end[0]);
writeaddress(color, address(#CHARFORMAT[20]));
for(int i=0; i<count; i++)
{
CHARRANGE[0]=Pos_start[i]; CHARRANGE[1]=Pos_end[i];
sendmessage(EM_EXSETSEL, 0, address(#CHARRANGE[0]), formatiw(handle_edit)); // исправить на handle
sendmessage(EM_SETCHARFORMAT, SCF_SELECTION, address(#CHARFORMAT[0]), formatiw(handle_edit));
}
}
}
Цитата: можно ли ограничить функцию WindowFromPoint? Она получает получает дескриптор окна, получает прямоугольник контролла
WindowFromPoint только хендл получает, размеры контрола получает другая функция. Почему у Рича имеено такой код, который выше он по ширине больше, чем обычный статик, хотя применяю те же шрифты...
(Добавление)
Можно ли указать такой стиль галочки, что бы не было галочки, а бы только текст, не изменяя BUTTON на STATIC |
|
|
007wan |
Отправлено: 01 Октября, 2019 - 13:47:52
|
Эксперт
Покинул форум
Сообщений всего: 1837
Дата рег-ции: Март 2017
Репутация: -2
|
Плиз, дайте TCM_SETCURSEL message костанту
(Добавление)
не переключает вкладку. Использую файл констант TCM_SETCURSEL 4876
(Добавление)
CODE: SendMessage(Object_Tab1, TCM_SETCURSEL, 2, 0); Вкладку переключает, но информацию не обновляет, функция GETCURSEL не получает инфу о переключенной вкладкиCODE:Selected_Tab1 = sendmessage(TCM_GETCURSEL, 0, 0, formatiw(Object_Tab1)); Код (Отобразить)CODE:function Selected_Tabs()
{
getmouse(Mouse_x, Mouse_y);
if(WindowFromPoint(Mouse_x, Mouse_y) == Object_Tab1)
{
if(getkeystate(1) || getkeystate(2) || getkeystate(4))
{
Selected_Tab1 = sendmessage(TCM_GETCURSEL, 0, 0, formatiw(Object_Tab1));
}
}
if (Selected_Tab1 == 0)
{
for (int lz=0; lz<sizearray(Object_Checkbox2); lz++)
{
ShowWindow(Object_Checkbox2[lz], SW_HIDE);
}
for (int eu = 0; eu<sizearray(Object_Static); eu++)
{
ShowWindow(Object_Static[eu], SW_HIDE);
}
for (int lp=0; lp<sizearray(Object_Checkbox); lp++)
{
ShowWindow(Object_Checkbox[lp], SW_SHOW);
}
ShowWindow(Object_Edit1, SW_HIDE);
ShowWindow(Object_Static7, SW_HIDE);
ShowWindow(Object_Static8, SW_HIDE);
Selected_Tab1 = -1;
}
//===================
if (Selected_Tab1 == 1)
{
for (int et = 0; et<sizearray(Object_Static); et++)
{
ShowWindow(Object_Static[et], SW_HIDE);
}
for (int lf=0; lf<sizearray(Object_Checkbox); lf++)
{
ShowWindow(Object_Checkbox[lf], SW_HIDE);
}
for (int lo=0; lo<sizearray(Object_Checkbox2); lo++)
{
ShowWindow(Object_Checkbox2[lo], SW_SHOW);
}
ShowWindow(Object_Static7, SW_HIDE);
ShowWindow(Object_Edit1, SW_HIDE);
ShowWindow(Object_Static8, SW_SHOW);
Selected_Tab1 = -1;
}
//===================
if (Selected_Tab1 == 2)
{
for (int gf=0; gf<sizearray(Object_Checkbox); gf++)
{
ShowWindow(Object_Checkbox[gf], SW_HIDE);
}
for (int jn=0; jn<sizearray(Object_Checkbox2); jn++)
{
ShowWindow(Object_Checkbox2[jn], SW_HIDE);
}
for (int zv = 0; zv<sizearray(Object_Static); zv++)
{
ShowWindow(Object_Static[zv], SW_SHOW);
}
ShowWindow(Object_Static8, SW_HIDE);
ShowWindow(Object_Static7, SW_SHOW);
ShowWindow(Object_Edit1, SW_SHOW);
Selected_Tab1 = -1;
}
}
(Добавление)
Вкладку переключает, но содержимое не показывается, а показывается предыдущее содерждимое, хотя вкладка переключается,, но содержимое не меняется.CODE:SendMessage(Object_Tab1, TCM_SETCURFOCUS, 2, 0);
SendMessage(Object_Tab1, TCM_SETCURSEL, 2, 0); |
|
|
Nikanr |
Отправлено: 01 Октября, 2019 - 20:48:16
|
Специалист
Покинул форум
Сообщений всего: 231
Дата рег-ции: Март 2019
Репутация: 5
|
Еще вопрос по listbox'у: можно сделать как-нибудь что бы он сохранял введенные в него ранее значения? Сейчас он введенные в input значения записывает в массив string, а потом добавляет в listbox, и после закрытия\открытия диалога в WM_CREATE стоит цикл на их добавление
Все работает, но проблема в том, что когда запускается цикл на добавление в WM_CREATE, нагрузка на цп взлетает с 3% до 15% на 2-3 секунды. Ну или по крайней мере можно ли в DLL запихнуть часть кода и снять нагрузку на цп таким образом?
(Добавление)
Скорее всего такая жесть из-за этой функции, а конкретно: динамическое выделение памяти по 20-50 раз максимум в цикле
CODE:function add_list(string s)
{
new char c[size(s)+1];
strcpy(#c[0], s);
sendmessage(LB_ADDSTRING, 0, address(#c[0]), formatiw(dpe[0]));
delete c;
}
(Добавление)
Проблема решена)(Отредактировано автором: 01 Октября, 2019 - 21:01:48) |
|
|
|