Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.11.24;
Скачать: CL | DM;

Вниз

RichEdit 2.0   Найти похожие ветки 

 
Sfagnum ©   (2003-09-26 13:50) [0]

Как с помощью 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);

подскажите, направте...


 
MBo ©   (2003-09-26 14:00) [1]

а библиотеку RICHED20.DLL загружаешь?


 
Sfagnum ©   (2003-09-26 14:04) [2]

мдяяя.... нет :)


 
Sfagnum ©   (2003-09-26 14:57) [3]

загрузил. вроде...
не идёт вот весь текст
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.


 
nikkie ©   (2003-09-26 15:12) [4]

в дебагере посмотри какой получается REWnd. насколько я вижу, ты ему при создании не указываешь parent - поэтому и не создается он.

и еще - логичнее создавать сразу со силем WS_VISIBLE, а не вызывать потом ShowWindow (да еще с параметром CmdShow). а показывать основное окно после того, как созданы все его дети.


 
Sfagnum ©   (2003-09-26 15:25) [5]

Между строками 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 ...
чо не так ?


 
Sfagnum ©   (2003-09-26 15:56) [6]

заменил "RICHEDIT_CLASS" на "RichEdit20A" и всё пошло !?!?!?


 
clickmaker ©   (2003-09-26 15:59) [7]

Что говорит GetLastError ?


 
Sfagnum ©   (2003-09-26 16:40) [8]

The parametr is incorrect - как всегда информативно


 
Sfagnum ©   (2003-09-26 18:00) [9]

У меня ещё несеолько вопросов назрело:

1. Не все показанные сообщения/стили в MSDN"е распознаються в Дельфях, я так понимаю, что их надо объявить через константы, где посмотреть эти значения. Проблемы возникли например со следующим стилем: ES_DISABLENOSCROLL

2. В редакторе Delphi при двойном щелчке на слово содержащее символ "_" выделяеться всё слово, а в RichEdit 2.0 только до этого символа например:
В редаакторе: ES_DISABLENOSCROLL
В RichEdit: ES_ DISABLENOSCROLL
если что-нить встроенное чтобы выделять как в первом случае?

Заранее спасибо


 
clickmaker ©   (2003-09-26 18:16) [10]

ES_DISABLENOSCROLL = $00002000


 
Sfagnum ©   (2003-09-26 18:30) [11]

2 clickmaker
Спасибо, а если не секрет где посмотрел и как это узнать?


 
clickmaker ©   (2003-09-26 18:34) [12]

Delphi6\Source\Rtl\Win\RichEdit.pas


 
Sfagnum ©   (2003-09-29 13:18) [13]

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


 
Sfagnum ©   (2003-09-29 16:41) [14]

Неужели придёться хук юзать?!?!?!?


 
clickmaker ©   (2003-09-30 13:17) [15]

Ну насчет хука - это ты погорячился...

EM_SETEVENTMASK + WM_NOTIFY c извещением EN_MSGFILTER от RichEdit должны помочь


 
nikkie ©   (2003-09-30 15:36) [16]

общая техника в такой ситуации - subclassing. пишешь еще одну REWndProc и
REWndProcOld := SetWindowLong(ReHwnd, GWL_WNDPROC, REWndProc)
в REWndProc не забываешь вызвать REWndProcOld.

конкретно для RichEdit можно, конечно, и EM_SETEVENTMASK.


 
Sfagnum ©   (2003-09-30 18:56) [17]

>Ну насчет хука - это ты погорячился...
эт от тишины... :)

2 clickmaker
потихоньку подплываю к этой мысли, на просторах msdn"а...

2 nikkie
А можно ссылочку на более подродное описание этой техники... желательно с примерами...

Извени за наглую просьбу.


 
nikkie ©   (2003-09-30 21:11) [18]

мог бы и сам на гугле поиск сделать
http://community.borland.com/article/0,1410,16487,00.html


 
Sfagnum ©   (2003-10-01 12:31) [19]

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 лишнии


 
Sfagnum ©   (2003-10-01 17:22) [20]

пошёл по пути 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 не пойму в чём трабла...


 
clickmaker ©   (2003-10-01 17:46) [21]

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-02 10:37) [22]

Я наверно что-то плохо понимаю, разве я не так сделал?
но ради экспиремента Result"у присвоил -1 эффект тот же...

Оттуда же

WM_NOTIFY Message

Return Value

The return value is ignored except for notification messages that specify otherwise.

А переписываеться ли возвращаемое значение или игнорируеться?



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

Текущий архив: 2003.11.24;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.017 c
3-78822
yuri
2003-11-04 17:24
2003.11.24
БД


1-78920
Rradion
2003-11-12 14:33
2003.11.24
Алгоритм Бинарного Поиска - помогите плиз...


3-78808
MORA
2003-11-06 08:27
2003.11.24
UDF


1-78976
Aleksandr
2003-11-14 13:02
2003.11.24
Как вернуть дочернее окно в начало координат клиентской области?


3-78766
smu
2003-11-03 14:19
2003.11.24
Для чего нужно свойство Datasource компонента IBQuery?