Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];

Вниз

Запрет ввода некоторых символов в Edit   Найти похожие ветки 

 
Dimitry   (2004-04-06 15:38) [0]

Здравствуйте!
Как запретить вводить некоторые символы в Edit в диалоге.
И как можно ограничить длину текста в Edit (как MaxLength в VCL).


 
Suntechnic ©   (2004-04-06 16:16) [1]

>Dimitry
Как запретить вводить некоторые символы в Edit в диалоге.
Смотря какие. Если надо разрешить вводить только целые числа, то это совсем просто (с помощью установки соотв. стиля). Если логика посложнее, тогда традиционными (как и в VCL) способами.

И как можно ограничить длину текста в Edit (как MaxLength в VCL).
Послать сообщение EM_GETLIMITTEXT


 
Dimitry   (2004-04-06 16:24) [2]

А какие сообщения нужно обрабатывать при вставке из буфера обмена и при вводу символа (чтобы потом этот ввод отменить)?


 
Suntechnic ©   (2004-04-06 18:35) [3]

>Dimitry
А какие сообщения нужно обрабатывать при вставке из буфера обмена
WM_PASTE вестимо.
при вводу символа
Можешь WM_KEYDOWN


 
Dimitry   (2004-04-06 19:30) [4]

Писал вот так:

 case Msg of
   WM_PASTE: MessageBox(0, "", "", 0);
 end;


Но при вставке текста - программа ноль внимания. На WM_KEYDOWN то же самое. Как я думаю это из-за того, что окно создавалось функцией DialogBoxParam. А как быть в таком случае?


 
Suntechnic ©   (2004-04-06 19:34) [5]

>Dimitry
Это ты где писал? Небось в WndProc диалогового окна. Ясное дело что программа ноль внимания. Сообщения ведь шлются в оконную процедуру Edit control-а, а не диалоговому окну.

Про Subclassing слыхал когда-нибудь? Набери в хелпе по Win API. Там по-моему как раз на примере Edit-а показано.


 
Dimitry   (2004-04-06 19:53) [6]


> Про Subclassing слыхал когда-нибудь?

Нет.

> Это ты где писал? Небось в WndProc диалогового окна.

Так и делал. :)
Пойду разбираться...


 
Dimitry   (2004-04-07 13:20) [7]

Suntechnic
Сделал как там в примере. WM_PASTE теперь работает, но Edit перестал реагировать на мышку. Как это можно исправить?


 
Suntechnic ©   (2004-04-07 15:48) [8]

>Dimitry   (07.04.04 13:20)
Сделал как там в примере. WM_PASTE теперь работает, но Edit перестал реагировать на мышку. Как это можно исправить?

Код в студию.


 
SPeller ©   (2004-04-07 15:55) [9]

А я всегда думал что при вставке Ctrl+V окну едита посылается WM_SETTEXT, в котором и можно сделать все изменения текста.


 
Игорь Шевченко ©   (2004-04-07 15:59) [10]


> WM_PASTE теперь работает, но Edit перестал реагировать на
> мышку.


#ifdef offtopic

Диван протащить удалось, но выяснилось странное и необъяснимое обстоятельство: как только я на него сажусь, гаснет свет по всей квартире.

#endif


 
Dimitry   (2004-04-07 16:51) [11]


var
 OldEditProc: Integer;

function EditSubclassProc(Wnd: HWnd; Msg, wParam, lParam: Cardinal): Cardinal; stdcall;
begin
 case Msg of
//    WM_PASTE: messagebox(0,"","",0);
   WM_GETDLGCODE: Result := DLGC_WANTALLKEYS;
 end;
 CallWindowProc(Pointer(OldEditProc), Wnd, Msg, wParam, lParam);
end;

function InputDlgFunc(Wnd: HWnd; Msg: Cardinal; wParam, lParam: Cardinal): Bool; stdcall;
var
 WndEdit: HWnd;
begin
 Result := False;
 case Msg of
   WM_DESTROY:
   begin
     SetWindowLong(GetDlgItem(Wnd, 102), GWL_WNDPROC, OldEditProc);
   end;
   WM_INITDIALOG:
   begin
     WndEdit := GetDlgItem(Wnd, 102);
     OldEditProc := SetWindowLong(WndEdit, GWL_WNDPROC, Integer(@EditSubclassProc));
   end;
 end;
end;

function ShowInputDlg;
begin
 DialogBoxParam(HInstance, PChar(901), Wnd, @InputDlgFunc, 0);
end;


 
RealRascal ©   (2004-04-07 17:08) [12]

а не проще разве обрабатывать событие онкейдаун?
Если символ допустимый, то не делаем ничего. если не допустимы - присваиваем ему #0. И еще надо будет в ончейнж написать, чтобы удаляла недопустимое и обрезала.
у меня лично к winapi выработалось такое отношение, точнее даже сказать сложилось очучение, что оно работает как хочет. то работает - то не работает. седня до обеда работает, после нет. не знаю, может это все надуманно...или из-за неопытности... стараюсь абходится без всяких там сендмессаге и проч.


 
Suntechnic ©   (2004-04-07 18:21) [13]

>Dimitry
А на кой леший тебе сдалось обрабатывать WM_GETDLGCODE?
Дальше... Result у тебя присваевается не тот что нужен.
Должно быть что-то типа

function EditSubclassProc(Wnd: HWnd; Msg, wParam, lParam: Cardinal): Cardinal; stdcall;
begin
case Msg of
   WM_PASTE: messagebox(0,"WM_PASTE","",0);
end;
Result := CallWindowProc(Pointer(OldEditProc), Wnd, Msg, wParam, lParam);
end;


SPeller ©   (07.04.04 15:55) [9]
А я всегда думал что при вставке Ctrl+V окну едита посылается WM_SETTEXT, в котором и можно сделать все изменения текста.

Неправильно думал.


 
Dimitry   (2004-04-07 19:00) [14]

Suntechnic
Еще хочу спросить, там в примере есть UNREFERENCED_PARAMETER(lParam) - что это такое? Это только для си?


 
Suntechnic ©   (2004-04-07 19:15) [15]

>Dimitry   (07.04.04 19:00) [14]
Еще хочу спросить, там в примере есть UNREFERENCED_PARAMETER(lParam) - что это такое? Это только для си?

Не обращай на это внимание. Это не то, что для С, это для VC++ :).

Этот макрос служит для того чтобы убрать предупреждение компилятора о том, что формальный параметр нигде не сипользуется.



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.036 c
3-1083253108
Mister
2004-04-29 19:38
2004.05.23
обработка False


1-1083763502
denis_group
2004-05-05 17:25
2004.05.23
CheckBox ы в StringGrid .


7-1081867216
nv_
2004-04-13 18:40
2004.05.23
ESC последовательности


9-1073499972
ork
2004-01-07 21:26
2004.05.23
Текстовая RPG


1-1083757608
DimonNew
2004-05-05 15:46
2004.05.23
ini файл





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский