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

Вниз

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 вся ветка

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

Наверх





Память: 0.5 MB
Время: 0.012 c
14-79154
Света
2003-10-31 07:35
2003.11.24
Фабрика


7-79211
Armageddon
2003-09-15 17:08
2003.11.24
автоматическое изменение прав доступа


4-79219
kkostik
2003-09-30 15:44
2003.11.24
DLL


3-78835
WellSlava
2003-11-04 11:36
2003.11.24
Сжатие DBF-файлов.


1-78994
Татьяна
2003-11-14 10:58
2003.11.24
Компоненты для Отчетов





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский