![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
RichEdit 2.0 [D6, Win95/98]
Sfagnum © (2003-09-26 13:50:00)
Как с помощью CreateWindowEx создать RichEdit на форме, в MSDN написано что класс RICHEDIT_CLASS - Designates a Rich Edit 2.0 control, но ниже приведённая строка ни хрена не показывает
wndText := CreateWindowEx(0, "RICHEDIT_CLASS","",WS_VISIBLE or WS_CHILD or WS_TABSTOP or WS_BORDER or ES_MULTILINE , 15, 10, 270, 25,wndMain,0,hInstance,nil);
подскажите, направте...
Sfagnum (2003-10-02 10:37:00) [1]
Я наверно что-то плохо понимаю, разве я не так сделал?
но ради экспиремента Result"у присвоил -1 эффект тот же...
Оттуда же
WM_NOTIFY Message
Return Value
The return value is ignored except for notification messages that specify otherwise.
А переписываеться ли возвращаемое значение или игнорируеться?
clickmaker (2003-10-01 17:46:00) [2]
MSDN:
Return Value
If the control should process the event, the message returns a zero value.
If the control should ignore the event, the message returns a nonzero value
Sfagnum (2003-10-01 17:22:00) [3]
пошёл по пути clickmaker"а от (30.09.03 13:17)
сделал такую обработку
if (msgF^.msg = WM_KEYDOWN) and (msgF^.wParam = VK_TAB) then
if TabPress then Result := DefWindowProc(Wnd,msg,wPar,lPar) else Result := 0
else Result := DefWindowProc(Wnd,msg,wPar,lPar);
Прога проходит черезResult := 0и всё равно добавляет TAB не пойму в чём трабла...
Sfagnum (2003-10-01 12:31:00) [4]
2nikkie
Спасибо
Очередной вопрос...
Как надо задать стиль RichEdit"a, чтобы при пустом окне всё равно были видны полосы прокрутки и чтоб они были активными...
я сейчас использую следующие стили:
WS_VISIBLE or WS_CHILD or WS_BORDER or WS_HSCROLL or WS_VSCROLL or ES_NOHIDESEL or ES_MULTILINE
or ES_AUTOVSCROLL or ES_AUTOHSCROLL or ES_SAVESEL or ES_SUNKEN
причём у меня создалось впечатление, что в присутствии стилейWS_HSCROLL or WS_VSCROLLстилиES_AUTOVSCROLL or ES_AUTOHSCROLLлишнии
nikkie (2003-09-30 21:11:00) [5]
мог бы и сам на гугле поиск сделать
http://community.borland.com/article/0,1410,16487,00.html
Sfagnum (2003-09-30 18:56:00) [6]
>Ну насчет хука - это ты погорячился...
эт от тишины... :)
2 clickmaker
потихоньку подплываю к этой мысли, на просторах msdn"а...
2 nikkie
А можно ссылочку на более подродное описание этой техники... желательно с примерами...
Извени за наглую просьбу.
nikkie (2003-09-30 15:36:00) [7]
общая техника в такой ситуации - subclassing. пишешь еще одну REWndProc и
REWndProcOld := SetWindowLong(ReHwnd, GWL_WNDPROC, REWndProc)
в REWndProc не забываешь вызвать REWndProcOld.
конкретно для RichEdit можно, конечно, и EM_SETEVENTMASK.
clickmaker (2003-09-30 13:17:00) [8]
Ну насчет хука - это ты погорячился...
EM_SETEVENTMASK + WM_NOTIFY c извещением EN_MSGFILTER от RichEdit должны помочь
Sfagnum (2003-09-29 16:41:00) [9]
Неужели придёться хук юзать?!?!?!?
Sfagnum (2003-09-29 13:18:00) [10]
2 clickmaker
Спасибо...
Ещё вопрос...
Как отлавливать нажатие клавиши в RichEdit?
объевляю я всё это безобразие объявляю показываю следующи образом:
with wc do begin
cbSize := sizeof(wc);
style := cs_hredraw or cs_vredraw;
lpfnWndProc := @WindowProc;
cbClsExtra := 0;
cbWndExtra := 0;
hInstance := HInstance;
hIcon := LoadIcon(0,idi_application);
hCursor := LoadCursor(0,idc_arrow);
hbrBackground := COLOR_BTNFACE+1;
lpszMenuName := nil;
lpszClassName := "WinMin : Main";
end;
RegisterClassEx(wc);
MainWnd := CreateWindowEx (0,"WinMin : Main","Win Min",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,0,0,Hinstance,nil);
GetClientRect(MainWnd, R);
REWnd := CreateWindowEx (WS_EX_CLIENTEDGE,"RichEdit20W","",
WS_VISIBLE or WS_CHILD or WS_BORDER or WS_VSCROLL or ES_NOHIDESEL or ES_AUTOVSCROLL
or ES_MULTILINE or ES_DISABLENOSCROLL or ES_SAVESEL or ES_SUNKEN,
R.left, R.top,R.right - R.left, R.bottom - R.top,MainWnd,0,Hinstance,nil);
в ф-ииfunction WindowProc(wnd:HWND; Msg : Integer; wParam:wParam; lParam:lParam):lResult; stdcall;
сообщения WM_KEYDOWN, WM_CHAR от RichEdit не перехватываються...
Где их надо перехватывать или что надо сделать шоб они перехватывались в WindowProc
clickmaker (2003-09-26 18:34:00) [11]
Delphi6\Source\Rtl\Win\RichEdit.pas
Sfagnum (2003-09-26 18:30:00) [12]
2 clickmaker
Спасибо, а если не секрет где посмотрел и как это узнать?
clickmaker (2003-09-26 18:16:00) [13]
ES_DISABLENOSCROLL = $00002000
Sfagnum (2003-09-26 18:00:00) [14]
У меня ещё несеолько вопросов назрело:
1. Не все показанные сообщения/стили в MSDN"е распознаються в Дельфях, я так понимаю, что их надо объявить через константы, где посмотреть эти значения. Проблемы возникли например со следующим стилем: ES_DISABLENOSCROLL
2. В редакторе Delphi при двойном щелчке на слово содержащее символ "_" выделяеться всё слово, а в RichEdit 2.0 только до этого символа например:
В редаакторе: ES_DISABLENOSCROLL
В RichEdit: ES_ DISABLENOSCROLL
если что-нить встроенное чтобы выделять как в первом случае?
Заранее спасибо
Sfagnum (2003-09-26 16:40:00) [15]
The parametr is incorrect- как всегда информативно
clickmaker (2003-09-26 15:59:00) [16]
Что говорит GetLastError ?
Sfagnum (2003-09-26 15:56:00) [17]
заменил "RICHEDIT_CLASS" на "RichEdit20A" и всё пошло !?!?!?
Sfagnum (2003-09-26 15:25:00) [18]
Между строками
RegisterClassEx(wc);иwhile GetMessage(Mesg,0,0,0) do beginпереписал на
MainWnd := CreateWindowEx (0,"WinMin : Main","Win Min",ws_overlappedwindow,cw_UseDefault,cw_UseDefault,cw_UseDefault,cw_UseDefault,0,0,Hinstance,nil);
GetClientRect(MainWnd, R);
REWnd := CreateWindowEx (WS_EX_CLIENTEDGE,"RICHEDIT_CLASS","",WS_VISIBLE or ws_child,R.left, R.top,R.right - R.left, R.bottom - R.top,MainWnd,0,Hinstance,nil);
ShowWindow(MainWnd,SW_SHOW);
REWnd = 0 ...
чо не так ?
nikkie (2003-09-26 15:12:00) [19]
в дебагере посмотри какой получается REWnd. насколько я вижу, ты ему при создании не указываешь parent - поэтому и не создается он.
и еще - логичнее создавать сразу со силем WS_VISIBLE, а не вызывать потом ShowWindow (да еще с параметром CmdShow). а показывать основное окно после того, как созданы все его дети.
Sfagnum (2003-09-26 14:57:00) [20]
загрузил. вроде...
не идёт вот весь текст
program WinMin ;
uses
windows, messages;
var
wc : TWndClassEx;
MainWnd, REWnd : HWND;
Mesg : TMsg;
function WindowProc(wnd:HWND; Msg : Integer; Wparam:Wparam; Lparam:Lparam):Lresult;
stdcall;
Begin
case msg of
wm_destroy:
Begin
postquitmessage(0); exit;
Result:=0;
End
else Result:=DefWindowProc(wnd,msg,wparam,lparam);
end;
End;
var R: tRect;
begin
if LoadLibrary("RICHED20.DLL") = 0 then exit;
with wc do begin
cbSize := sizeof(wc);
style := cs_hredraw or cs_vredraw;
lpfnWndProc := @WindowProc;
cbClsExtra := 0;
cbWndExtra := 0;
hInstance := HInstance;
hIcon := LoadIcon(0,idi_application);
hCursor := LoadCursor(0,idc_arrow);
hbrBackground := COLOR_BTNFACE+1;
lpszMenuName := nil;
lpszClassName := "WinMin : Main";
end;
RegisterClassEx(wc);
MainWnd := CreateWindowEx (0,"WinMin : Main","Win Min",ws_overlappedwindow,cw_UseDefault,cw_UseDefault,cw_UseDefault,cw_UseDefault,0,0,Hinstance,nil);
ShowWindow(MainWnd,CmdShow);
GetClientRect(MainWnd, R);
REWnd := CreateWindowEx (WS_EX_CLIENTEDGE,"RICHEDIT_CLASS","",ws_child,R.left, R.top,R.right - R.left, R.bottom - R.top,0,0,Hinstance,nil);
ShowWindow(REWnd,CmdShow);
while GetMessage(Mesg,0,0,0) do begin
TranslateMessage(Mesg);
DispatchMessage(Mesg);
end;
end.