007wan |
Отправлено: 04 Марта, 2019 - 17:30:42
|
Эксперт
Покинул форум
Сообщений всего: 1837
Дата рег-ции: Март 2017
Репутация: -2
|
Почему все стали переходить к external? это лучше, чем другие функции? Вот недавно видел...В теме писали как написать в файл текст и там использовалось external,А почему не fopen,fwrite итд? чем лучше External?
(Добавление)
Вот почему, например, используют таймер от external, а не CREATETIMER из кибора? чем лучше? Я конечно, все понимаю...новые возможности, методы итд, но в чем разниа?(Отредактировано автором: 04 Марта, 2019 - 17:32:54) |
|
|
Zireael |
Отправлено: 07 Марта, 2019 - 18:57:38
|
Эксперт
Покинул форум
Сообщений всего: 4464
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: А как сравнить текст одной кнопки от другой при нажатии.
string a;
GetWindowText(Button1, a, 255);
CODE:external(INT, "GetWindowText", "GetWindowTextA", "User32.dll");
// окна Button1 и Button2 должны быть созданы
char buffer1[255], buffer2[255];
GetWindowText(Button1, address(#buffer1[0]), sizearray(buffer1));
GetWindowText(Button2, address(#buffer2[0]), sizearray(buffer2));
if(format(#buffer1[0]) == format(#buffer2[0]))
{
messagebox("+++");
} |
|
|
007wan |
Отправлено: 08 Марта, 2019 - 11:38:02
|
Эксперт
Покинул форум
Сообщений всего: 1837
Дата рег-ции: Март 2017
Репутация: -2
|
А возможно ли через external ограничить количество символов в Edit? Только не надо использовать старый метод с IF, я знаю, что получится что-то такое:CODE:Если количество символов в строке превышает более, чем нужно, то удалять последние символы до нужного - Мне этого не надо, мне надо, что бы все железно работало, как вот сдесь: CODE:#define EM_SETPASSWORDCHAR 204
external(INT, "CreateWindow", "CreateWindowExA", "User32.dll" );
external(INT, "GetWindowText", "GetWindowTextA", "User32.dll" );
external(INT, "SetWindowText", "SetWindowTextA", "User32.dll" );
external(INT, "SetFocus", "SetFocus", "User32.dll" );
createdialog(0);
showdialog(0, "Диалог",100, 100, 300, 300, 1, 1);
while(window ("Диалог")==0)sleep(10);
win w=window ("Диалог");
int edit1=CreateWindow(0, "EDIT", "", 8192+8388608+1342177280, 10, 20, 100, 20, formatwi(w), 0, 0, 0); // можно вводить только цифры
int edit2=CreateWindow(0, "EDIT", "", 32+8388608+1342177280, 10, 60, 100, 20, formatwi(w), 0, 0, 0); // заменяет вводимый текст на *
int edit3=CreateWindow(0, "EDIT", "", 4+128+4096+1048576+2097152+8388608+1342177280, 10, 100, 120, 120, formatwi(w), 0, 0, 0); // многострочный текст
int button1=CreateWindow(0, "BUTTON", "Показать текст", 1342177280, 150, 60, 110, 20, formatwi(w), 0, 0, 0); // кнопка
int button2=CreateWindow(0, "BUTTON", "Вывести текст в messagebox", 8192+1342177280, 135, 100, 150, 40, formatwi(w), 0, 0, 0); // кнопка
int static1=CreateWindow(0, "STATIC", "Только цифры", 1342177280, 120, 20, 110, 20, formatwi(w), 0, 0, 0); // статик
char buffer[9999]; // буфер для текста из окна edit
loop()
{
sleep(1);
}
function getmessage(0, WM_COMMAND)
{
if(message.lparam==button1) // если нажата кнопка 'Показать текст'
{
if(GetWindowText(button1, address(#buffer[0]), sizearray(buffer))) // получить текст кнопки
{
if(format(#buffer[0])=="Показать текст") // если она называется 'Показать текст'
{
SetWindowText(button1, "Скрыть текст"); // меняем название кнопки
sendmessage(EM_SETPASSWORDCHAR, 0, 0, formatiw(edit2)); // отключаем замену вводимых символов на *
SetFocus(edit2); // ставим курсор в поле edit2
}
else // иначе
{
SetWindowText(button1, "Показать текст"); // меняем текст кнопки
sendmessage(EM_SETPASSWORDCHAR, 42, 0, formatiw(edit2)); // включаем замену вводимых символов на * (код 42) или любой другой символ
SetFocus(edit2);
}
}
}
if(message.lparam==button2) // если нажата кнопка 'Вывести текст в messagebox'
{
GetWindowText(edit3, address(#buffer[0]), sizearray(buffer)); // получить текст из окна edit3
messagebox(format(#buffer[0])); // показать текст в сообщении
}
} Важен не код, а принцип действия, он не стирает не тот символ при ложном условии, а сразу запрещает ввод, даже как будто кнопка отключена. Так же и тут хочу, что бы он не давал больше вводить. А то, что он будет стирать лишнее при пользователе мне этого не нужно. |
|
|
Zireael |
Отправлено: 08 Марта, 2019 - 11:59:12
|
Эксперт
Покинул форум
Сообщений всего: 4464
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: ограничить количество символов в Edit
Чтобы установить или получить какие-то параметры для edit ему отправляется sendmessage. Список сообщений
CODE:#define WS_CHILD 1073741824
#define WS_VISIBLE 268435456
#define WS_BORDER 8388608
#define EM_LIMITTEXT 197
external(INT, "CreateWindow", "CreateWindowExA", "User32.dll" );
int edit1;
createdialog(0);
showdialog(0, "Диалог",100, 100, 300, 300, 1, 1);
loop()sleep(1);
function getmessage(0, WM_CREATE)
{
edit1=CreateWindow(0, "EDIT", "", WS_CHILD | WS_VISIBLE | WS_BORDER, 10, 20, 100, 20, gethwnd(0), 0, 0, 0);
sendmessage(EM_LIMITTEXT, 6, 0, formatiw(edit1)); // ограничение количества вводимых символов, 2й параметр, 6 символов
} (Отредактировано автором: 08 Марта, 2019 - 12:00:04) |
|
|
Zireael |
Отправлено: 08 Марта, 2019 - 12:23:19
|
Эксперт
Покинул форум
Сообщений всего: 4464
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: почему я ставлю лимит 70 и когда ввожу текст, то у меня не вводится больше где-то 10, не идет дальше
Потому что надо добавить стиль ES_AUTOHSCROLL, тогда текст будет сдвигаться если не помещается.
CODE:#define WS_CHILD 1073741824
#define WS_VISIBLE 268435456
#define WS_BORDER 8388608
#define EM_LIMITTEXT 197
#define ES_AUTOHSCROLL 128
external(INT, "CreateWindow", "CreateWindowExA", "User32.dll" );
int edit1;
createdialog(0);
showdialog(0, "Диалог",100, 100, 300, 300, 1, 1);
loop()sleep(1);
function getmessage(0, WM_CREATE)
{
edit1=CreateWindow(0, "EDIT", "", WS_CHILD | WS_VISIBLE | WS_BORDER | ES_AUTOHSCROLL, 10, 20, 100, 20, gethwnd(0), 0, 0, 0);
sendmessage(EM_LIMITTEXT, 20, 0, formatiw(edit1)); // ограничение количества вводимых символов, 2й параметр, 20 символов
} |
|
|
|