Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.144.93.73] |
|
Сообщ.
#1
,
|
|
|
Здравствуйте.
Мне както сделать так чтобы програму можно-бы скомпилоровать для 8 битной (ANSI) и 16 битной (UNICODE) кодировок. Сам точно незнаю что тут точно имееться ввиду (условие такое) Вот такой код program A1; uses WinProcs, WinTypes; var cyClient, cxCaps, cyChar, cyDesc : Integer; const iNumTypes = 5; show: array [0 .. iNumTypes] of record li : LongInt; sz : PChar; end = ( (li:HS_BDIAGONAL; sz:'HS_BDIAGONAL'), (li:HS_CROSS; sz:'HS_CROSS'), (li:HS_DIAGCROSS; sz:'HS_DIAGCROSS'), (li:HS_FDIAGONAL; sz:'HS_FDIAGONAL'), (li:HS_HORIZONTAL; sz:'HS_HORIZONTAL'), (li:HS_VERTICAL; sz:'HS_VERTICAL') ); function WndProc(myWnd : HWND; Msg : Word; myWParam : Word; myLParam: LongInt) : LongInt; export; var Ps: TPaintStruct; NewBrush: HBRUSH; fm: TTextMetric; brsh: HBRUSH; i, h, w: Integer; rect: TRect; {hhres: LongBool;} myDC : HDC; begin WndProc := 0; case Msg of WM_CREATE: begin myDC := GetDC(myWnd); GetTextMetrics(myDC, fm); cxCaps := 20; cyChar := fm.tmHeight + 100; cyDesc := fm.tmDescent; ReleaseDC(myWnd, myDC); end; WM_PAINT: begin myDC := BeginPaint(myWnd, Ps); for i := 0 to iNumTypes do begin brsh := CreateHatchBrush(show[i].li, 0); rect.top := 20 + (cyChar div 4) + (i mod 3)*(cyChar); rect.left := (i div 3)*250 + 10; rect.bottom := rect.top + cyChar; rect.right:= rect.left + 120; SelectObject(myDC, brsh); DrawText(myDC, show[i].sz, -1, rect, DT_RIGHT); h := rect.left + 130; w:= 10 + (i mod 3)*(cyChar); Rectangle(myDC, h + 10, w, h + cyChar - 10, w + cyChar -20 ); DeleteObject(brsh); end; EndPaint(myWnd, Ps); end; WM_CLOSE: begin DestroyWindow(myWnd); end; WM_DESTROY: begin PostQuitMessage(0); end; else WndProc := DefWindowProc(myWnd, msg, myWParam, myLParam); end; end; const szClientClass = 'Patterns'; flFrameFlags = WS_CAPTION or WS_SYSMENU or WS_SIZEBOX or WS_MINIMIZEBOX or WS_MAXIMIZEBOX; var wc : TWndClass; MainWnd : HWND; Msg : TMsg; begin wc.style := 0; wc.lpfnWndProc := @WndProc; wc.cbClsExtra := 0; wc.cbWndExtra := 0; wc.hInstance := hInstance; wc.hIcon := LoadIcon(0, IDI_APPLICATION); wc.hCursor := LoadCursor(0, IDC_ARROW); wc.hbrBackground := COLOR_WINDOW + 1; wc.lpszMenuName := nil; wc.lpszClassName := szClientClass; if not RegisterClass(wc) then begin MessageBox(0, 'RegisterClass Failed!', 'Error!', MB_ICONEXCLAMATION or MB_OK); Exit; end; MainWnd := CreateWindow(szClientClass, szClientClass, flFrameFlags, CW_USEDEFAULT, CW_USEDEFAULT, 580, 360, 0, 0, 0, nil); if MainWnd = 0 then begin MessageBox(0, 'CreateWindow Failed!', 'Error!', MB_ICONEXCLAMATION or MB_OK); Exit; end; ShowWindow(MainWnd, SW_SHOW); UpdateWindow(MainWnd); while GetMessage(Msg, 0, 0, 0) do begin TranslateMessage(Msg); DispatchMessage(Msg); end; DestroyWindow(MainWnd); end. сам компилятор http://depositfiles.com/files/69425hg42 сами бибилиотеки WinCrt, WinProcs, WinTypes в калоге есть. Отсуда http://pascal.sources.ru/museum/bp7_13.zip Можете кто знает чтото по этому поводу? |
Сообщ.
#2
,
|
|
|
P.S.
Другими словами мне нужно както оформить, что-бы программу можно было скомпилировать для 8 битной (ANSI) и 16 битной (UNICODE) кодировок. Добавлено С этим делом мне уже прояснилось. |
Сообщ.
#3
,
|
|
|
Кстати можете ктонибудь подсказать как тут лучше вот такой косок кода оформить на pascal
#define CreateWindowA(lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)\ CreateWindowExA(0L, lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam) #define CreateWindowW(lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)\ CreateWindowExW(0L, lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam) #ifdef UNICODE #define CreateWindow CreateWindowW #else #define CreateWindow CreateWindowA #endif т.е. что-бы потом можно было указать директиву компилятору UNICODE. Т.е. иметь возможность переключаться компилируя. Добавлено Сам кусок взял отсуда http://msdn.microsoft.com/en-us/library/ms...v=VS.85%29.aspx |
Сообщ.
#4
,
|
|
|
Цитата ccode10 @ Вот так?что-бы потом можно было указать директиву компилятору UNICODE. Т.е. иметь возможность переключаться компилируя. {$ifdef UNICODE} function CreateWindowEx(dwExStyle: integer; lpClassName: PWideChar; lpWindowName: PWideChar; dwStyle: integer; X, Y, nWidth, nHeight: Integer; hWndParent: HWND; hMenu: HMENU; hInstance: HINST; lpParam: Pointer): HWND; stdcall; {$else} function CreateWindowEx(dwExStyle: integer; lpClassName: PAnsiChar; lpWindowName: PAnsiChar; dwStyle: integer; X, Y, nWidth, nHeight: Integer; hWndParent: HWND; hMenu: HMENU; hInstance: HINST; lpParam: Pointer): HWND; stdcall; {$endif} implementation {$ifdef UNICODE} function CreateWindowEx; external 'USER32' name 'CreateWindowExW'; {$else} function CreateWindowEx; external 'USER32' name 'CreateWindowExA'; {$endif} {$ifdef UNICODE} function CreateWindowEx(dwExStyle: integer; lpClassName: PWideChar; lpWindowName: PWideChar; dwStyle: integer; X, Y, nWidth, nHeight: Integer; hWndParent: HWND; hMenu: HMENU; hInstance: HINST; lpParam: Pointer): HWND; stdcall; external 'USER32' name 'CreateWindowExW'; {$else} function CreateWindowEx(dwExStyle: integer; lpClassName: PAnsiChar; lpWindowName: PAnsiChar; dwStyle: integer; X, Y, nWidth, nHeight: Integer; hWndParent: HWND; hMenu: HMENU; hInstance: HINST; lpParam: Pointer): HWND; stdcall; external 'USER32' name 'CreateWindowExA'; {$endif} |
Сообщ.
#5
,
|
|
|
volvo877, сейчас делаю.
У меня вопрос такой возник. ВОт в CreateWindowEx я вижу какие параметры идут как ANSI или UNICODE соотвественно. А вот какие у этой функции параметры DefWindowProc? Например если я например использую DefWindowProcW, то где тут участвует UNICODE? Т.е. это в самой функции окна? Описание http://msdn.microsoft.com/en-us/library/ms...28VS.85%29.aspx |
Сообщ.
#6
,
|
|
|
В прототипах нет разницы, но если у тебя приложение Юникодное, то ты должен работать с DefWindowProcW, а не с DefWindowProcA. То есть для таких функций, у которых параметры совпадают, можешь делать:
function DefWindowProc(Wnd: HWnd; Msg : UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; {$ifdef UNICODE} external 'USER32' name 'DefWindowProcW'; {$else} external 'USER32' name 'DefWindowProcA'; {$endif} |
Сообщ.
#7
,
|
|
|
Вот так шас получилось
program b2; uses U_Patterns; var cyClient, cxCaps, cyChar, cyDesc : Integer; const iNumTypes = 5; show: array [0..iNumTypes] of record li : LongInt; {$ifdef UNICODE} sz : PWideChar; {$else} sz : PAnsiChar; {$endif} end = ( (li:HS_BDIAGONAL; sz:'HS_BDIAGONAL'), (li:HS_CROSS; sz:'HS_CROSS'), (li:HS_DIAGCROSS; sz:'HS_DIAGCROSS'), (li:HS_FDIAGONAL; sz:'HS_FDIAGONAL'), (li:HS_HORIZONTAL; sz:'HS_HORIZONTAL'), (li:HS_VERTICAL; sz:'HS_VERTICAL') ); function WndProc(myWnd: hwnd; msg : UINT; mywparam : WPARAM; mylparam: LPARAM): LRESULT; stdcall; export; var Ps: TPaintStruct; NewBrush: HBRUSH; fm: TTextMetric; brsh: HBRUSH; i, h, w: Integer; rect: TRect; myDC: HDC; begin WndProc := 0; case Msg of WM_CREATE: begin myDC := GetDC(myWnd); GetTextMetrics(myDC, fm); cxCaps := 20; cyChar := fm.tmHeight + 100; cyDesc := fm.tmDescent; ReleaseDC(myWnd, myDC); end; WM_PAINT: begin myDC := BeginPaint(myWnd, Ps); for i := 0 to iNumTypes do begin brsh := CreateHatchBrush(show[i].li, 0); rect.top := 20 + (cyChar div 4) + (i mod 3) * (cyChar); rect.left := (i div 3) * 250 + 10; rect.bottom := rect.top + cyChar; rect.right := rect.left + 120; SelectObject(myDC, brsh); DrawText(myDC, show[i].sz, -1, rect, DT_RIGHT); h := rect.left + 130; w := 10 + (i mod 3) * (cyChar); Rectangle(myDC, h + 10, w, h + cyChar - 10, w + cyChar - 20); DeleteObject(brsh); end; EndPaint(myWnd, Ps); end; WM_CLOSE: begin DestroyWindow(myWnd); end; WM_DESTROY: begin PostQuitMessage(0); end; else WndProc := DefWindowProc(myWnd, Msg, myWParam, myLParam); end; end; const szClientClass = 'Patterns'; flFrameFlags = WS_CAPTION or WS_SYSMENU or WS_SIZEBOX or WS_MINIMIZEBOX or WS_MAXIMIZEBOX; var wc: TWndClassEx; MainWnd: HWND; Msg: TMsg; begin wc.cbSize := sizeof(TWndClassEx); wc.style := 0; wc.lpfnWndProc := @WndProc; wc.cbClsExtra := 0; wc.cbWndExtra := 0; wc.hInstance := hInstance; wc.hIcon := LoadIcon(0, IDI_APPLICATION); wc.hCursor := LoadCursor(0, IDC_ARROW); wc.hbrBackground := COLOR_WINDOW + 1; wc.lpszMenuName := nil; wc.lpszClassName := szClientClass; // wc.hIconSm := LoadIcon(0, IDI_APPLICATION); if RegisterClassEx(wc) = 0 then begin MessageBox(0, 'RegisterClass Failed!', 'Error!', MB_ICONEXCLAMATION or MB_OK); Exit; end; MainWnd := CreateWindowEx(0, szClientClass, szClientClass, flFrameFlags, CW_USEDEFAULT, CW_USEDEFAULT, 580, 400, 0, 0, hinstance, nil); if MainWnd = 0 then begin MessageBox(0, 'CreateWindow Failed!', 'Error!', MB_ICONEXCLAMATION or MB_OK); Exit; end; ShowWindow(MainWnd, CmdShow{SW_SHOW}); UpdateWindow(MainWnd); while GetMessage(Msg, 0, 0, 0) do begin TranslateMessage(Msg); DispatchMessage(Msg); end; DestroyWindow(MainWnd); end. U_Patterns.pas unit U_Patterns; interface type {$ifdef UNICODE} MakeIntResource = PWideChar; {$else} MakeIntResource = PAnsiChar; {$endif} const hs_Horizontal = 0; { ----- } hs_Vertical = 1; { ||||| } hs_FDiagonal = 2; { ///// } hs_BDiagonal = 3; { \\\\\ } hs_Cross = 4; { +++++ } hs_DiagCross = 5; { xxxxx } WM_CREATE = $0001; WM_PAINT = $000F; WM_CLOSE = $0010; WM_DESTROY = $0002; DT_RIGHT = $0002; WS_CAPTION = $00C00000; WS_SYSMENU = $00080000; WS_THICKFRAME = $00040000; WS_SIZEBOX = WS_THICKFRAME; WS_MINIMIZEBOX = $00020000; WS_MAXIMIZEBOX = $00010000; IDI_APPLICATION = MakeIntResource(32512); IDC_ARROW = MakeIntResource(32512); COLOR_WINDOW = 5; MB_ICONEXCLAMATION = $0030; MB_OK = $0000; CW_USEDEFAULT = Integer($8000); type Bool = WordBool; { Windows compatible boolean } THandle = Integer; { Global memory handle } TFarProc = Pointer; { Procedure address } HWnd = THandle; HDC = THandle; HBrush = THandle; HIcon = THandle; HCursor = THandle; HMenu = THandle; UINT = Integer; HINST = THandle; LRESULT = LongInt; WPARAM = LongInt; LPARAM = LongInt; PRect = ^TRect; TRect = packed record left: Integer; top: Integer; right: Integer; bottom: Integer; end; PPaintStruct = ^TPaintStruct; TPaintStruct = packed record hdc: HDC; fErase: Bool; rcPaint: TRect; fRestore: Bool; fIncUpdate: Bool; (* rgbReserved: array[0..15] of Byte; *) rgbReserved: array[0..31] of Byte; end; PTextMetric = ^TTextMetric; TTextMetric = packed record tmHeight: Longint; tmAscent: Longint; tmDescent: Longint; tmInternalLeading: Longint; tmExternalLeading: Longint; tmAveCharWidth: Longint; tmMaxCharWidth: Longint; tmWeight: Longint; tmOverhang: Longint; tmDigitizedAspectX: Longint; tmDigitizedAspectY: Longint; tmFirstChar: Char; tmLastChar: Char; tmDefaultChar: Char; tmBreakChar: Char; tmItalic: Byte; tmUnderlined: Byte; tmStruckOut: Byte; tmPitchAndFamily: Byte; tmCharSet: Byte; end; TColorRef = LongInt; TWndClassExA = packed record cbSize: UINT; style: UINT; lpfnWndProc: TFarProc; cbClsExtra: Integer; cbWndExtra: Integer; hInstance: HINST; hIcon: HICON; hCursor: HCURSOR; hbrBackground: HBRUSH; lpszMenuName: PChar; lpszClassName: PChar; hIconSm: HICON; end; TWndClassEx = TWndClassExA; PPoint = ^TPoint; TPoint = packed record x: Integer; y: Integer; end; PMsg = ^TMsg; TMsg = packed record (* hwnd: HWnd; message: Word; wParam: Word; lParam: LongInt; time: Longint; pt: TPoint; *) hwnd: HWND; message: UINT; wParam: WPARAM; lParam: LPARAM; time: Integer; pt: TPoint; end; function BeginPaint(Wnd: HWnd; var Paint: TPaintStruct): HDC; stdcall; function CreateHatchBrush(Index: Integer; Color: TColorRef): HBrush; stdcall; function DeleteObject(Handle: THandle): Bool; stdcall; function DestroyWindow(Wnd: HWnd): Bool; stdcall; procedure EndPaint(Wnd: HWnd; const Paint: TPaintStruct); stdcall; function GetDC(Wnd: HWnd): HDC; stdcall; procedure PostQuitMessage(ExitCode: Integer); stdcall; function Rectangle(DC: HDC; X1, Y1, X2, Y2: Integer): Bool; stdcall; function ReleaseDC(Wnd: HWnd; DC: HDC): Integer; stdcall; function SelectObject(DC: HDC; hObject: THandle): THandle; stdcall; function ShowWindow(Wnd: HWnd; CmdShow: Integer): Bool; stdcall; function TranslateMessage(const Msg: TMsg): Bool; stdcall; function UpdateWindow(Wnd: HWnd) : bool; stdcall; {$ifdef UNICODE} function CreateWindowEx(dwExStyle: integer; lpClassName: PWideChar; lpWindowName: PWideChar; dwStyle: integer; X, Y, nWidth, nHeight: Integer; hWndParent: HWND; hMenu: HMENU; hInstance: HINST; lpParam: Pointer): HWND; stdcall; external 'USER32' name 'CreateWindowExW'; function DefWindowProc(Wnd: HWnd; Msg : UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; external 'USER32' name 'DefWindowProcW'; function DispatchMessage(const Msg: TMsg): LongInt; stdcall; external 'USER32' name 'DispatchMessageW'; function DrawText(DC: HDC; Str: PWideChar; Count: Integer; var Rect: TRect; Format: Word): Integer; stdcall; external 'USER32' name 'DrawTextW'; function GetMessage(var Msg: TMsg; Wnd: HWnd; MsgFilterMin, MsgFilterMax: integer): Bool; stdcall; external 'USER32' name 'GetMessageW'; function GetTextMetrics(DC: HDC; var Metrics: TTextMetric): Bool; stdcall; external 'GDI32' name 'GetTextMetricsW'; function LoadCursor(Instance: THandle; CursorName: PWideChar): HCursor; stdcall; external 'USER32' name 'LoadCursorW'; function LoadIcon(Instance: THandle; IconName: PWideChar): HIcon; stdcall; external 'USER32' name 'LoadIconW'; function MessageBox(WndParent: HWnd; Txt, Caption: PWideChar; TextType: Word): Integer; stdcall; external 'USER32' name 'MessageBoxW'; function RegisterClassEx(const WndClass : TWndClassEx) : word; stdcall; external 'USER32' name 'RegisterClassExW'; {$else} function CreateWindowEx(dwExStyle: integer; lpClassName: PAnsiChar; lpWindowName: PAnsiChar; dwStyle: integer; X, Y, nWidth, nHeight: Integer; hWndParent: HWND; hMenu: HMENU; hInstance: HINST; lpParam: Pointer): HWND; stdcall; external 'USER32' name 'CreateWindowExA'; function DefWindowProc(Wnd: HWnd; Msg : UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; external 'USER32' name 'DefWindowProcA'; function DispatchMessage(const Msg: TMsg): LongInt; stdcall; external 'USER32' name 'DispatchMessageA'; function DrawText(DC: HDC; Str: PAnsiChar; Count: Integer; var Rect: TRect; Format: Word): Integer; stdcall; external 'USER32' name 'DrawTextA'; function GetMessage(var Msg: TMsg; Wnd: HWnd; MsgFilterMin, MsgFilterMax: integer): Bool; stdcall; external 'USER32' name 'GetMessageA'; function GetTextMetrics(DC: HDC; var Metrics: TTextMetric): Bool; stdcall; external 'GDI32' name 'GetTextMetricsA'; function LoadCursor(Instance: THandle; CursorName: PAnsiChar): HCursor; stdcall; external 'USER32' name 'LoadCursorA'; function LoadIcon(Instance: THandle; IconName: PAnsiChar): HIcon; stdcall; external 'USER32' name 'LoadIconA'; function MessageBox(WndParent: HWnd; Txt, Caption: PAnsiChar; TextType: Word): Integer; stdcall; external 'USER32' name 'MessageBoxA'; function RegisterClassEx(const WndClass : TWndClassEx) : word; stdcall; external 'USER32' name 'RegisterClassExA'; {$endif} implementation function BeginPaint; external 'USER32' name 'BeginPaint'; function DeleteObject; external 'GDI32' name 'DeleteObject'; function DestroyWindow; external 'USER32' name 'DestroyWindow'; procedure EndPaint; external 'USER32' name 'EndPaint'; function GetDC; external 'USER32' name 'GetDC'; function ReleaseDC; external 'USER32' name 'ReleaseDC'; procedure PostQuitMessage; external 'USER32' name 'PostQuitMessage'; function Rectangle; external 'GDI32' name 'Rectangle'; function SelectObject; external 'GDI32' name 'SelectObject'; function ShowWindow; external 'USER32' name 'ShowWindow'; function TranslateMessage; external 'USER32' name 'TranslateMessage'; function UpdateWindow; external 'USER32' name 'UpdateWindow'; function CreateHatchBrush; external 'GDI32' name 'CreateHatchBrush'; end. компилирую Цитата dcc32 -b -UC:\BD20min\LIB -DUNICODE b2.pas запускаю и вижу Цитата CreateWindow Failed! Добавлено А как толком этот уникод задаёться? Добавлено Потомучто если я делаю эти два файла в UTF-8 кодировке, то Цитата C:\BD20min\BIN>dcc32 -b -UC:\BD20min\LIB -DUNICODE b2.pas Delphi for Win32 Version 9.0 Copyright © 1983,96 Borland International b2.pas(1) Error: Illegal character in input file: 'п' ($EF) U_Patterns.pas(1) Error: Illegal character in input file: 'п' ($EF) U_Patterns.pas(212) b2.pas(6) Fatal: Could not compile used unit 'U_Patterns.pas' |
Сообщ.
#8
,
|
|
|
В TWndClassEx кто будет менять строковые параметры в зависимости от UNICODE?
PTWndClassEx = ^TWndClassEx; TWndClassEx = packed record cbSize: UINT; style: UINT; lpfnWndProc: TFarProc; cbClsExtra: Integer; cbWndExtra: Integer; hInstance: HINST; hIcon: HICON; hCursor: HCURSOR; hbrBackground: HBRUSH; lpszMenuName: {$ifdef UNICODE} PWideChar {$else} PChar {$endif}; lpszClassName: {$ifdef UNICODE} PWideChar {$else} PChar {$endif}; hIconSm: HICON; end; |
Сообщ.
#9
,
|
|
|
работает ...
так, а теперь как мне если я делаю так szClientClass = 'Пробуем так'; то UTF-8 without BOM UTF-8 Цитата b2.pas(1) Error: Illegal character in input file: 'п' ($EF) U_Patterns.pas(212) |
Сообщ.
#10
,
|
|
|
Не так просто... Дело всё в том, что перед тем, как использовать Юникод-функции, строку надо перевести из кодировки Win1251 (у тебя же она установлена в системе для ANSI-приложений?) в этот самый Юникод. Я вот тут набросал программку, которая корректно компилируется и работает и с -DUNICODE, и без, вот так показывается в версии UNICODE:
Прикреплённый файлuni.PNG (7,71 Кбайт, скачиваний: 559) Все исходники - в Win1251, никаких "UTF-8 without BOM" и тому подобных. Разбирайся что я добавил, экспериментируй... Исходникиsource_uc.zip (3,99 Кбайт, скачиваний: 216) |
Сообщ.
#11
,
|
|
|
Цитата volvo877 @ Все исходники - в Win1251, никаких "UTF-8 without BOM" и тому подобных. тоесть выходит что сам файл нельзя подовать компилятору в UTF-8 кодировке? Добавлено другими словами он не поддерживает файлы с UTF-8 кодировкой вообще? Добавлено Цитата ccode10 @ Не так просто... Тут слушай уже какой-то высшый пилотаж (ну спасибо реально, то работает) |
Сообщ.
#12
,
|
|
|
Цитата ccode10 @ В этой версии Дельфи - нет, начиная с D2006 - можно компилировать файлы в любой кодировке, есть ключик --codepage:, задающий кодировку файлов исходника... тоесть выходит что сам файл нельзя подовать компилятору в UTF-8 кодировке? |
Сообщ.
#13
,
|
|
|
Это самое, я писал тут это последнее.
Но у меня ещё сплыло что нужно сделать WM_SIZE: begin cyClient:= LOWORD(LParam); end; а с LOWORD Цитата Error: Declaration expected but 'INLINE' found Сделал новую тему тут (извини что так много спрашиваю) |