-
Подскажите, пожалуйста. Создаю RichEdit так: Var hRichDll: HINST;
RichWnd : HWND;
begin
hRichDll := LoadLibrary('RICHED20.DLL');
RichWnd := CreateWindowEx (WS_EX_STATICEDGE,'RichEdit20W','',
WS_VISIBLE or WS_VSCROLL or WS_HSCROLL or WS_CHILD or ES_AUTOVSCROLL or ES_WANTRETURN or ES_MULTILINE,
0, 0,100, 100,hWin,0,Hinstance,nil); А вот как получить и засунуть текст в формате RTF в RichEdit? Заранее спасибо.
-
Неиспользование VCL принципиально важно? Просто с VCL все это делается за полминуты.
-
> Юрий Зотов (11.07.2010 17:03:01) [1]
Может и важно, у него же RichEdit 3
-
> Неиспользование VCL принципиально важно? Просто с VCL все > это делается за полминуты.
Да с VCL это делать очень просто, но мне так не нравится. Без VCL гораздо удобнее для меня, но знаний пока маловато.
-
> Без VCL гораздо удобнее для меня, но знаний пока маловато.
???
-
> Nikfel (10.07.10 22:37)
> А вот как получить и засунуть текст в формате RTF в RichEdit?
EM_STREAMIN, msdn.
> Без VCL гораздо удобнее для меня, но знаний пока маловато.
Удобнее, конечно, но одеяло все время падает.
-- Regards, LVT.
-
Открытие и сохранение файла: Program TextOpenSave;
uses
Windows,
Messages,
CommDlg;
Var
HWin, hRichDll: THandle;
RichWND: THandle;
ButtonWND:array[0..1] of THandle;
OldProc: Pointer;
const Capt = 'TextOpenSave';
dllRich = 'RICHED20.DLL';
c_myRichEdit = 'RichEdit20W';
c_myClassRichEdit = 'RichEdit_';
TopRich = 40;
ID_FILE_OPEN = 10;
ID_FILE_SAVE = 11;
EM_STREAMIN = WM_USER + 73;
EM_STREAMOUT = WM_USER + 74;
SF_TEXT = $0001;
SF_RTF = $0002;
type
TEditStreamCallBack = function (dwCookie: Longint; pbBuff: PByte;
cb: Longint; var pcb: Longint): Longint; stdcall;
_editstream = record
dwCookie: Longint;
dwError: Longint;
pfnCallback: TEditStreamCallBack;
end;
TEditStream = _editstream;
EDITSTREAM = _editstream;
Procedure SetDefFont(AWindow: THandle);
Begin
SendMessage(AWindow, WM_SETFONT, GetStockObject(DEFAULT_GUI_FONT), 1);
End;
Function EditWinProc(HWin: THandle; Msg: Cardinal;
WParam, LParam: Integer): Cardinal; Stdcall;
Begin
Case Msg Of
WM_RBUTTONDOWN: messageBox(HWin,'Правая кнопка мыши','Нажата:',0);
End;
Result := CallWindowProc(OldProc,
HWin, Msg, WParam, LParam);
End;
function OpenDlgProc(hdlg: HWND; uiMsg: UINT; WPARAM: wParam; LPARAM: lParam): UINT; stdcall;
var
pPnt: TPoint;
dlgRect, prntRect: TRect;
begin
if uiMsg = WM_INITDIALOG then
begin
GetWindowRect(GetParent(hdlg), dlgRect);
GetWindowRect(GetDesktopWindow, prntRect);
pPnt.X := ((prntRect.Right - prntRect.Left) - (dlgRect.Right - dlgRect.Left)) div 2;
pPnt.Y := ((prntRect.Bottom - prntRect.Top) - (dlgRect.Bottom - dlgRect.Top)) div 2;
SetWindowPos(GetParent(hdlg), HWND_TOPMOST, pPnt.x, pPnt.y, 0, 0, SWP_NOSIZE or SWP_SHOWWINDOW);
end;
Result:= 0;
end;
-
function OpenCallback(dwCookie: DWORD; pbBuff: PChar; cb: LongInt; pcb: pLongInt): DWORD; stdcall;
begin
pcb^ := _lread( HFILE(dwCookie), pbBuff, cb);
if pcb^ < 0 then
pcb^ := 0;
Result := 0;
end;
function SaveCallback(dwCookie: DWORD; pbBuff: PChar; cb: LongInt; pcb: pLongInt): DWORD; stdcall;
begin
pcb^ := _lwrite( HFILE(dwCookie), pbBuff, cb);
if pcb^ < 0 then
pcb^ := 0;
Result := 0;
end;
function AnsiUpperCase(const S: string): string;
var Len: Integer;
begin
Len := Length(S);
SetString(Result, PChar(S), Len);
if Len > 0 then CharUpperBuffA(Pointer(Result), Len);
end;
Function MainWinProc(HWin: THandle; Msg: Cardinal;
WParam, LParam: Integer): Cardinal; Stdcall;
Var
TmpEdit: TWndClassEx;
w,h: Integer;
t:trect;
ps:PAINTSTRUCT;
pen,oldPen:hpen;
ofn:OPENFILENAME;
hFile:Thandle;
ofs: OFSTRUCT;
es: EDITSTREAM;
procedure Line(DC_:HDC;x1,y1,x2,y2:integer); begin
MoveToEx(DC_,x1,y1,nil);
LineTo(DC_,x2,y2);
end;
function getPath_:string;
var s:string;
i:integer;
begin
s:=Paramstr(0);
i:=length(s);
while i>0 do begin
if s[i]='\' then begin
delete(s,i+1,length(s)-i);
result:=s;
break;
end;
dec(i);
end;
end;
Begin
Case Msg Of
WM_CREATE:
Begin
If Not GetClassInfoEx(hRichDll, c_myRichEdit, TmpEdit) Then Halt;
OldProc := TmpEdit.lpfnWndProc;
TmpEdit.cbSize := SizeOf(TWndClassEx);
TmpEdit.lpfnWndProc := @EditWinProc;
TmpEdit.lpszClassName := c_myClassRichEdit;
TmpEdit.hInstance := GetModuleHandle(NIL);
If RegisterClassEx(TmpEdit) = 0 Then Halt;
FillChar(RichWND, SizeOf(RichWND), 0);
RichWND := CreateWindowEx(0, c_myClassRichEdit, '',
WS_CHILD Or WS_VISIBLE Or ES_LEFT or WS_VSCROLL or WS_HSCROLL or ES_AUTOVSCROLL or ES_WANTRETURN or ES_MULTILINE,
10, TopRich, 470, 450, HWin, 0, HInstance, NIL);
ButtonWnd[0]:=CreateWindowEx(0,'Button','Открыть',
BS_PUSHBUTTON or WS_VISIBLE or WS_CHILD, 10, 7, 75, 25, HWin, ID_FILE_OPEN, hInstance, nil );
ButtonWnd[1]:=CreateWindowEx(0,'Button','Сохранить',
BS_PUSHBUTTON or WS_VISIBLE or WS_CHILD, 95, 7, 75, 25, HWin, ID_FILE_SAVE, hInstance, nil );
SetDefFont(RichWND);
SetDefFont(ButtonWnd[0]);
SetDefFont(ButtonWnd[1]);
SendMessage(RichWND, EM_LIMITTEXT, 2099999999, 0); End;
WM_SETFOCUS:begin
SetFocus(RichWND);
end;
-
WM_SIZE:begin
GetClientRect(HWin,t);
MoveWindow(RichWND, 10,TopRich, t.Right-t.Left-20,t.Bottom-t.Top-TopRich-10,true); end;
wm_Paint:begin
GetClientRect(HWin,t);
w:=t.Right-t.Left;
h:=t.Bottom-t.Top;
beginpaint(hWin,ps); Pen:=CreatePen(PS_SOLID, 1, rgb(165,172,178));
oldPen:=SelectObject(ps.hdc,pen);
Line(ps.hdc, 10, TopRich-1, w-10, TopRich-1);
Line(ps.hdc, 10, h-9, w-10, h-9);
Line(ps.hdc, 9, TopRich-1, 9, h-8);
Line(ps.hdc, w-10, TopRich-1, w-10, h-8);
SelectObject(ps.hdc,Oldpen);
DeleteObject(pen);
ReleaseDC(hWin,ps.hdc);
EndPaint(hWin, ps);
end;
WM_COMMAND:
begin
case LoWord(wParam) of
ID_FILE_OPEN:begin
ZeroMemory(@ofn, sizeof(OPENFILENAME));
with ofn do
begin
lStructSize:=sizeof(OPENFILENAME);
lpstrInitialDir:=pchar(getPath_);
lpstrTitle:='Открыть';
nMaxFile:=MAX_PATH;
lpfnHook:=@OpenDlgProc;
lpstrFile:=VirtualAlloc(nil, MAX_PATH, MEM_COMMIT, PAGE_READWRITE);
lpstrFilter:='*.*'+#0+'*.*'#0#0;
Flags:=OFN_EXPLORER or OFN_CREATEPROMPT or OFN_FILEMUSTEXIST or
OFN_HIDEREADONLY or OFN_PATHMUSTEXIST or OFN_ENABLEHOOK;
end;
if GetOpenFileName(ofn) then begin
hFile := OpenFile(ofn.lpstrFile, ofs, OF_READ);
es.dwCookie:=hFile;
es.dwError:=0;
es.pfnCallback:=@OpenCallback;
SetWindowText(RichWND,'');
if AnsiUpperCase(Copy(PChar(@ofn.lpstrFile[ofn.nFileExtension]), 1, 3)) = 'RTF' then
SendMessage(RichWND, EM_STREAMIN, SF_RTF, LongInt(@es))
else
SendMessage(RichWND, EM_STREAMIN, SF_TEXT, LongInt(@es));
_lclose(hFile);
SendMessage(RichWND, EM_SETMODIFY, 0, 0);
end;
VirtualFree(ofn.lpstrFile, 0, MEM_RELEASE);
end;
ID_FILE_SAVE:begin
ZeroMemory(@ofn, sizeof(OPENFILENAME));
with ofn do
begin
lStructSize:=sizeof(OPENFILENAME);
lpstrInitialDir:=pchar(getPath_);
lpstrTitle:='Сохранить';
nMaxFile:=MAX_PATH;
lpfnHook:=@OpenDlgProc;
lpstrFile:=VirtualAlloc(nil, MAX_PATH, MEM_COMMIT, PAGE_READWRITE);
lpstrFilter:='*.*'+#0+'*.*'#0#0;
Flags:=OFN_EXPLORER or OFN_CREATEPROMPT or OFN_FILEMUSTEXIST or
OFN_HIDEREADONLY or OFN_PATHMUSTEXIST or OFN_ENABLEHOOK;
end;
if GetSaveFileName(ofn) then begin
hFile := OpenFile(ofn.lpstrFile, ofs, OF_CREATE);
es.dwCookie:=hFile;
es.dwError:=0;
es.pfnCallback:=@SaveCallback;
if AnsiUpperCase(Copy(PChar(@ofn.lpstrFile[ofn.nFileExtension]), 1, 3)) = 'RTF' then
SendMessage(RichWND, EM_STREAMOUT, SF_RTF, LongInt(@es))
else
SendMessage(RichWND, EM_STREAMOUT, SF_TEXT, LongInt(@es));
_lclose(hFile);
SendMessage(RichWND, EM_SETMODIFY, 0, 0);
end;
VirtualFree(ofn.lpstrFile, 0, MEM_RELEASE);
end;
end;
end;
WM_DESTROY:
Begin
UnregisterClass(c_myClassRichEdit, HInstance);
PostQuitMessage(0);
End;
End;
Result := DefWindowProc(HWin, Msg, WParam, LParam);
End;
Procedure WinMain;
Var
Msg: TMsg;
WndClassEx: TWndClassEx;
Begin
ZeroMemory(@WndClassEx, SizeOf(WndClassEx));
WndClassEx.cbSize := SizeOf(TWndClassEx);
WndClassEx.lpszClassName := 'SuperclassSampleWnd';
WndClassEx.style := CS_VREDRAW Or CS_HREDRAW;
WndClassEx.hInstance := HInstance;
WndClassEx.lpfnWndProc := @MainWinProc;
WndClassEx.hCursor := LoadCursor(0, IDC_ARROW);
WndClassEx.hbrBackground := COLOR_BTNFACE + 1;
WndClassEx.lpszMenuName := nil;
If RegisterClassEx(WndClassEx) = 0 Then
MessageBox(0, 'Невозможно зарегистрировать класс окна',
'Ошибка', MB_OK Or MB_ICONHAND)
Else
Begin
hWin := CreateWindowEx(0, WndClassEx.lpszClassName,
Capt, WS_CLIPSIBLINGS or WS_CLIPCHILDREN or WS_OVERLAPPEDWINDOW And Not WS_BORDER,
Integer(CW_USEDEFAULT), Integer(CW_USEDEFAULT), 500, 500, 0, 0,
HInstance, NIL);
If hWin = 0 Then
MessageBox (0, 'Окно не создалось!',
'Ошибка', MB_OK Or MB_ICONHAND)
Else
Begin
ShowWindow(hWin, SW_SHOWNORMAL);
UpdateWindow(hWin);
While GetMessage(Msg, 0, 0, 0) Do
Begin
if msg.message=WM_KEYDOWN then begin
if msg.wParam=VK_ESCAPE then break; end;
TranslateMessage(Msg);
DispatchMessage(Msg);
End;
DestroyWindow(RichWND);
DestroyWindow(ButtonWnd[0]);
DestroyWindow(ButtonWnd[1]);
Halt(Msg.WParam);
End;
End;
End;
Begin
hRichDll := LoadLibrary(dllRich);
WinMain;
FreeLibrary(hRichDll);
End.
-
> Nikfel (14.07.10 22:14) [6]
> Открытие и сохранение файла:
Т.е., благодарностей не будет?
-- Regards, LVT.
-
Leonid Troyanovsky, спасибо за подсказку. Вроде разобрался с этим, но можно ли как-то перед сохранением зашифровать текст и тогда сохранить, а перед открытием произвести расшифровку и открыть? Как такое реализовать?
-
-
-
|