summaryrefslogtreecommitdiff
path: root/packages/ptc/src/win32/base/win32window.inc
diff options
context:
space:
mode:
authormarco <marco@3ad0048d-3df7-0310-abae-a5850022a9f2>2017-06-21 07:07:03 +0000
committermarco <marco@3ad0048d-3df7-0310-abae-a5850022a9f2>2017-06-21 07:07:03 +0000
commit499966b53d5b2e811b18569a1e0c5c66f7301e83 (patch)
tree7c68c70e43b42b3c6ea86df956fe4e09cd0a7cb8 /packages/ptc/src/win32/base/win32window.inc
parent35944ee1860ae65f8cd8d3dc0f56c1ba208bcc3e (diff)
downloadfpc-499966b53d5b2e811b18569a1e0c5c66f7301e83.tar.gz
--- Merging r34598 into '.':
U compiler/COPYING.txt U packages/gtk2/src/glib/gparamspecs.inc U packages/gtk2/src/gtk+/gdk/gdki18n.inc U packages/gtk2/src/gtk+/gdk/gdkprivate.inc U packages/gtk2/src/gtk+/gtk/gtkhsv.inc U packages/gtk2/src/gtk+/gtk/gtkkeyhash.inc U packages/gtk2/src/gtkext/gtkstatusiconh.inc U packages/sdl/LGPL U packages/googleapi/src/googlediscoverytopas.pp U packages/googleapi/src/googlebase.pp U packages/hermes/src/hermes_palette.inc U packages/hermes/src/hermconf.inc U packages/hermes/src/factconv.inc U packages/hermes/src/p_32.inc U packages/hermes/src/p_24.inc U packages/hermes/src/p_16.inc U packages/hermes/src/p_cnv.inc U packages/hermes/src/p_g.inc U packages/hermes/src/hermes_utility.inc U packages/hermes/src/p_ga.inc U packages/hermes/src/p_gca.inc U packages/hermes/src/p_gac.inc U packages/hermes/src/p_muhmu.inc U packages/hermes/src/p_cpy.inc U packages/hermes/src/hermdef.inc U packages/hermes/src/hermes_converter.inc U packages/hermes/src/hermes_factory.inc U packages/hermes/src/p_gcc.inc U packages/hermes/src/hermes_list.inc U packages/hermes/src/hermes_clearer.inc U packages/hermes/src/headp.inc U packages/hermes/src/i386/mmxp2_32.inc U packages/hermes/src/i386/x86_main.inc U packages/hermes/src/i386/x86p_32.inc U packages/hermes/src/i386/headi386.inc U packages/hermes/src/i386/x86p_16.inc U packages/hermes/src/i386/x86p_s32.inc U packages/hermes/src/i386/x86p_cpy.inc U packages/hermes/src/i386/mmx_clr.inc U packages/hermes/src/i386/x8616lut.inc U packages/hermes/src/i386/headmmx.inc U packages/hermes/src/i386/x86pscpy.inc U packages/hermes/src/i386/mmx_main.inc U packages/hermes/src/i386/mmxp_32.inc U packages/hermes/src/i386/x86_clr.inc U packages/hermes/src/i386/x86p_i8.inc U packages/hermes/src/hermes_dither.inc U packages/hermes/src/x86_64/x86_64_i8.inc U packages/hermes/src/d_32.inc U packages/hermes/src/hermes_debug.inc U packages/hermes/src/hermes.pp U packages/hermes/src/hermes_format.inc U packages/hermes/src/p_clr.inc U packages/hermes/src/p_i8.inc U packages/fcl-db/src/sqlite/customsqliteds.pas U packages/fcl-db/src/sqlite/sqliteds.pas U packages/fcl-db/src/sqlite/sqlite3ds.pas U packages/fcl-db/src/sqldb/sqlite/sqlite3backup.pas U packages/fcl-db/src/sqldb/postgres/pqeventmonitor.pp U packages/fcl-db/src/sqldb/interbase/fbeventmonitor.pp U packages/fcl-db/src/sqldb/interbase/fbadmin.pp U packages/matroska/src/matroska.pas U packages/ptc/src/win32/directx/win32directxcheck.inc U packages/ptc/src/win32/directx/win32directxtranslate.inc U packages/ptc/src/win32/directx/win32directxhook.inc U packages/ptc/src/win32/directx/win32directxprimary.inc U packages/ptc/src/win32/directx/win32directxhookd.inc U packages/ptc/src/win32/directx/win32directxlibrary.inc U packages/ptc/src/win32/directx/win32directxdisplay.inc U packages/ptc/src/win32/directx/win32directxconsoled.inc U packages/ptc/src/win32/directx/win32directxprimaryd.inc U packages/ptc/src/win32/directx/win32directxlibraryd.inc U packages/ptc/src/win32/directx/win32directxdisplayd.inc U packages/ptc/src/win32/directx/win32directxconsolei.inc U packages/ptc/src/win32/gdi/win32gdiconsolei.inc U packages/ptc/src/win32/gdi/win32modesetterd.inc U packages/ptc/src/win32/gdi/win32openglwindowd.inc U packages/ptc/src/win32/gdi/win32dibd.inc U packages/ptc/src/win32/gdi/win32modesetteri.inc U packages/ptc/src/win32/gdi/win32openglwindowi.inc U packages/ptc/src/win32/gdi/win32dibi.inc U packages/ptc/src/win32/gdi/win32gdihookd.inc U packages/ptc/src/win32/gdi/win32gdiconsoled.inc U packages/ptc/src/win32/gdi/win32gdihooki.inc U packages/ptc/src/win32/base/win32hook.inc U packages/ptc/src/win32/base/win32kbd.inc U packages/ptc/src/win32/base/win32mousei.inc U packages/ptc/src/win32/base/win32hookd.inc U packages/ptc/src/win32/base/win32kbdd.inc U packages/ptc/src/win32/base/win32resized.inc U packages/ptc/src/win32/base/win32window.inc U packages/ptc/src/win32/base/win32resizei.inc U packages/ptc/src/win32/base/win32windowd.inc U packages/ptc/src/win32/base/win32cursor.inc U packages/ptc/src/win32/base/win32event.inc U packages/ptc/src/win32/base/win32cursord.inc U packages/ptc/src/win32/base/win32eventd.inc U packages/ptc/src/win32/base/win32cursormoded.inc U packages/ptc/src/win32/base/win32monitor.inc U packages/ptc/src/win32/base/win32monitord.inc U packages/ptc/src/win32/base/win32moused.inc U packages/ptc/src/cocoa/cocoaconsolei.inc U packages/ptc/src/cocoa/cocoaconsoled.inc U packages/ptc/src/ptc.pp U packages/ptc/src/dos/textfx2/textfx2consoled.inc U packages/ptc/src/dos/textfx2/textfx2consolei.inc U packages/ptc/src/dos/base/mousei.inc U packages/ptc/src/dos/base/kbdd.inc U packages/ptc/src/dos/base/mouse33h.pp U packages/ptc/src/dos/base/moused.inc U packages/ptc/src/dos/base/kbd.inc U packages/ptc/src/dos/cga/cga.pp U packages/ptc/src/dos/cga/cgaconsoled.inc U packages/ptc/src/dos/cga/cgaconsolei.inc U packages/ptc/src/dos/vga/vgaconsolei.inc U packages/ptc/src/dos/vga/vga.pp U packages/ptc/src/dos/vga/vgaconsoled.inc U packages/ptc/src/dos/timeunit/timeunit.pp U packages/ptc/src/dos/vesa/vesaconsolei.inc U packages/ptc/src/dos/vesa/vesa.pp U packages/ptc/src/dos/vesa/vesaconsoled.inc U packages/ptc/src/wince/gapi/wincegapiconsolei.inc U packages/ptc/src/wince/gapi/wincegapiconsoled.inc U packages/ptc/src/wince/gdi/wincebitmapinfoi.inc U packages/ptc/src/wince/gdi/wincegdiconsoled.inc U packages/ptc/src/wince/gdi/wincebitmapinfod.inc U packages/ptc/src/wince/gdi/wincegdiconsolei.inc U packages/ptc/src/wince/base/wincekeyboardi.inc U packages/ptc/src/wince/base/wincewindowd.inc U packages/ptc/src/wince/base/wincemoused.inc U packages/ptc/src/wince/base/wincewindowi.inc U packages/ptc/src/wince/base/wincemousei.inc U packages/ptc/src/wince/base/wincekeyboardd.inc U packages/ptc/src/ptcwrapper/ptcwrapper.pp U packages/ptc/src/ptcwrapper/ptceventqueue.pp U packages/ptc/src/core/closeeventd.inc U packages/ptc/src/core/consolei.inc U packages/ptc/src/core/resizeeventi.inc U packages/ptc/src/core/closeeventi.inc U packages/ptc/src/core/eventd.inc U packages/ptc/src/core/moded.inc U packages/ptc/src/core/eventi.inc U packages/ptc/src/core/modei.inc U packages/ptc/src/core/openglattributesd.inc U packages/ptc/src/core/clipperd.inc U packages/ptc/src/core/openglattributesi.inc U packages/ptc/src/core/clipperi.inc U packages/ptc/src/core/aread.inc U packages/ptc/src/core/copyd.inc U packages/ptc/src/core/log.inc U packages/ptc/src/core/areai.inc U packages/ptc/src/core/colord.inc U packages/ptc/src/core/copyi.inc U packages/ptc/src/core/timerd.inc U packages/ptc/src/core/basesurfaced.inc U packages/ptc/src/core/colori.inc U packages/ptc/src/core/timeri.inc U packages/ptc/src/core/cleard.inc U packages/ptc/src/core/surfaced.inc U packages/ptc/src/core/basesurfacei.inc U packages/ptc/src/core/formatd.inc U packages/ptc/src/core/errord.inc U packages/ptc/src/core/mouseeventd.inc U packages/ptc/src/core/keyeventd.inc U packages/ptc/src/core/cleari.inc U packages/ptc/src/core/surfacei.inc U packages/ptc/src/core/baseconsoled.inc U packages/ptc/src/core/formati.inc U packages/ptc/src/core/paletted.inc U packages/ptc/src/core/errori.inc U packages/ptc/src/core/keyeventi.inc U packages/ptc/src/core/mouseeventi.inc U packages/ptc/src/core/baseconsolei.inc U packages/ptc/src/core/consoled.inc U packages/ptc/src/core/palettei.inc U packages/ptc/src/core/resizeeventd.inc U packages/ptc/src/x11/x11glxfbconfigd.inc U packages/ptc/src/x11/x11windowdisplayd.inc U packages/ptc/src/x11/x11glxfbconfigi.inc U packages/ptc/src/x11/x11unikey.inc U packages/ptc/src/x11/x11windowdisplayi.inc U packages/ptc/src/x11/x11consoled.inc U packages/ptc/src/x11/x11dga1displayd.inc U packages/ptc/src/x11/x11dga2displayd.inc U packages/ptc/src/x11/x11displayd.inc U packages/ptc/src/x11/x11consolei.inc U packages/ptc/src/x11/x11dga1displayi.inc U packages/ptc/src/x11/x11modesd.inc U packages/ptc/src/x11/x11dga2displayi.inc U packages/ptc/src/x11/x11check.inc U packages/ptc/src/x11/x11displayi.inc U packages/ptc/src/x11/x11modesi.inc U packages/ptc/src/x11/x11imaged.inc U packages/ptc/src/x11/x11imagei.inc U packages/ptc/src/c_api/capi_copyd.inc U packages/ptc/src/c_api/capi_color.inc U packages/ptc/src/c_api/capi_timer.inc U packages/ptc/src/c_api/capi_colord.inc U packages/ptc/src/c_api/capi_mode.inc U packages/ptc/src/c_api/capi_timerd.inc U packages/ptc/src/c_api/capi_clear.inc U packages/ptc/src/c_api/capi_except.inc U packages/ptc/src/c_api/capi_format.inc U packages/ptc/src/c_api/capi_key.inc U packages/ptc/src/c_api/capi_moded.inc U packages/ptc/src/c_api/capi_surface.inc U packages/ptc/src/c_api/capi_error.inc U packages/ptc/src/c_api/capi_cleard.inc U packages/ptc/src/c_api/capi_surfaced.inc U packages/ptc/src/c_api/capi_keyd.inc U packages/ptc/src/c_api/capi_formatd.inc U packages/ptc/src/c_api/capi_exceptd.inc U packages/ptc/src/c_api/capi_errord.inc U packages/ptc/src/c_api/capi_palette.inc U packages/ptc/src/c_api/capi_clipper.inc U packages/ptc/src/c_api/capi_paletted.inc U packages/ptc/src/c_api/capi_clipperd.inc U packages/ptc/src/c_api/capi_console.inc U packages/ptc/src/c_api/capi_consoled.inc U packages/ptc/src/c_api/capi_index.inc U packages/ptc/src/c_api/capi_area.inc U packages/ptc/src/c_api/capi_copy.inc U packages/ptc/src/c_api/capi_aread.inc U packages/ptc/docs/lgpl.txt U packages/fcl-base/src/csvdocument.pp U packages/fcl-base/src/csvreadwrite.pp U packages/winunits-base/src/eventsink.pp U packages/winunits-base/src/typelib.pas U packages/mysql/src/mysql4_com.pp U packages/mysql/src/mysql.inc U packages/mysql/src/mysql4_comdyn.pp U packages/mysql/src/mysql4dyn.pp U packages/chm/src/paslzxcomp.pas U packages/aspell/LICENSE U packages/os2units/src/dive.pas U packages/bfd/src/bfd.pas U utils/instantfpc/instantfpc.pas U utils/fpdoc/COPYING.txt U utils/fpdoc/README.txt U utils/fppkg/lnet/LICENSE.ADDON U utils/fppkg/lnet/lmimetypes.pp U utils/fppkg/lnet/lhttputil.pp U utils/fppkg/lnet/lprocess.pp U utils/fppkg/lnet/lhttp.pp U utils/fppkg/lnet/ltimer.pp U utils/fppkg/lnet/lfastcgi.pp U utils/fppkg/lnet/lspawnfcgi.pp U utils/fppkg/lnet/lsmtp.pp U utils/fppkg/lnet/lnet.pp U utils/fppkg/lnet/lmimestreams.pp U utils/fppkg/lnet/lmimewrapper.pp U utils/fppkg/lnet/lcommon.pp U utils/fppkg/lnet/LICENSE U utils/fppkg/lnet/lftp.pp U utils/fppkg/lnet/ltelnet.pp U utils/fppkg/lnet/lstrbuffer.pp U utils/fppkg/lnet/lwebserver.pp U utils/fppkg/lnet/levents.pp U utils/fppkg/lnet/lcontrolstack.pp U rtl/sparc/setjumph.inc U rtl/win/wininc/struct.inc U rtl/win/wininc/unifun.inc U rtl/win/wininc/ascdef.inc U rtl/win/wininc/messages.inc U rtl/win/wininc/base.inc U rtl/win/wininc/unidef.inc U rtl/win/wininc/func.inc U rtl/win/wininc/errors.inc U rtl/win/wininc/defines.inc U rtl/win/wininc/ascfun.inc U rtl/linux/powerpc/cprt0.as U rtl/linux/arm/ucprt0.as U rtl/linux/powerpc64/cprt0.as U rtl/linux/powerpc64/gprt0.as U rtl/linux/mips/cprt0.as U rtl/os2/moncalls.pas U rtl/os2/viocalls.pas U rtl/os2/pmgpi.pas U rtl/os2/moucalls.pas U rtl/os2/kbdcalls.pas U rtl/inc/flt_conv.inc U rtl/inc/flt_core.inc U rtl/wince/wininc/struct.inc U rtl/wince/wininc/messages.inc U rtl/wince/wininc/base.inc U rtl/wince/wininc/errors.inc U rtl/wince/wininc/defines.inc U rtl/java/jsystem.inc U rtl/COPYING.txt U tests/test/units/sysutils/twstrcmp.pp U tests/test/units/sysutils/tstrcmp.pp U tests/test/units/sysutils/tastrcmp.pp U tests/utils/avx/avxtestgenerator.pp U tests/utils/avx/baselist.pas U tests/utils/avx/asmtestgenerator.pas U tests/utils/avx/options.pas --- Recording mergeinfo for merge of r34598 into '.': U . --- Merging r35481 into '.': U packages/graph/src/inc/gtext.inc --- Recording mergeinfo for merge of r35481 into '.': G . --- Merging r36507 into '.': G packages/ptc/src/dos/timeunit/timeunit.pp D packages/ptc/src/dos/base/go32fix.pp G packages/ptc/src/core/keyeventd.inc G packages/ptc/src/core/mouseeventd.inc G packages/ptc/src/core/baseconsoled.inc G packages/ptc/src/core/errori.inc G packages/ptc/src/core/baseconsolei.inc G packages/ptc/src/core/consolei.inc U packages/ptc/src/ptcpas.cfg A packages/ptc/src/ptclaz.lpr G packages/ptc/src/x11/x11consolei.inc G packages/ptc/src/x11/x11dga1displayi.inc G packages/ptc/src/x11/x11dga2displayi.inc G packages/ptc/src/x11/x11displayi.inc U packages/ptc/src/x11/x11extensions.inc G packages/ptc/src/x11/x11windowdisplayd.inc G packages/ptc/src/x11/x11unikey.inc G packages/ptc/src/x11/x11windowdisplayi.inc G packages/ptc/src/x11/x11consoled.inc G packages/ptc/src/x11/x11dga1displayd.inc G packages/ptc/src/x11/x11dga2displayd.inc G packages/ptc/src/x11/x11displayd.inc A packages/ptc/src/ptclaz.lpi G packages/ptc/src/win32/base/win32moused.inc G packages/ptc/src/win32/base/win32kbd.inc G packages/ptc/src/win32/base/win32hook.inc G packages/ptc/src/win32/base/win32mousei.inc G packages/ptc/src/win32/base/win32kbdd.inc G packages/ptc/src/win32/base/win32window.inc G packages/ptc/src/win32/base/win32windowd.inc U packages/ptc/src/win32/directx/p_ddraw.pp G packages/ptc/src/win32/directx/win32directxhook.inc A packages/ptc/src/win32/directx/p_dinput.pp G packages/ptc/src/win32/directx/win32directxdisplay.inc G packages/ptc/src/win32/directx/win32directxconsoled.inc G packages/ptc/src/win32/directx/win32directxconsolei.inc G packages/ptc/src/win32/gdi/win32gdiconsoled.inc G packages/ptc/src/win32/gdi/win32gdiconsolei.inc G packages/ptc/src/win32/gdi/win32openglwindowd.inc G packages/ptc/src/win32/gdi/win32openglwindowi.inc G packages/ptc/src/ptc.pp U packages/ptc/docs/INSTALL.txt U packages/ptc/docs/CHANGES.txt U packages/ptc/docs/README.txt U packages/ptc/examples/keyboard3.pp U packages/ptc/fpmake.pp A packages/ptc/tests/event.pp U packages/graph/src/ptcgraph/ptcgraph.pp --- Recording mergeinfo for merge of r36507 into '.': G . --- Merging r36508 into '.': G packages/ptc/fpmake.pp --- Recording mergeinfo for merge of r36508 into '.': G . --- Merging r36509 into '.': U packages/ptc/src/dos/textfx2/textfx2.pp G packages/ptc/src/dos/base/mouse33h.pp G packages/ptc/src/dos/cga/cga.pp G packages/ptc/src/dos/vga/vga.pp G packages/ptc/src/dos/vesa/vesa.pp --- Recording mergeinfo for merge of r36509 into '.': G . --- Merging r36555 into '.': U packages/graph/src/ptcgraph/ptccrt.pp G packages/ptc/src/core/keyeventd.inc G packages/ptc/src/x11/x11displayi.inc G packages/ptc/src/win32/base/win32kbd.inc G packages/ptc/docs/CHANGES.txt A packages/ptc/tests/crtkeys A packages/ptc/tests/crtkeys/crtkeys_go32v2.txt A packages/ptc/tests/crtkeys/crtkeys.pas A packages/ptc/tests/crtkeys/crtkeys_tp7.txt A packages/ptc/tests/crtkeys/ptccrtkeys.pas A packages/ptc/tests/crtkeys/crtkeys_fpwincrt.txt --- Recording mergeinfo for merge of r36555 into '.': G . --- Merging r36556 into '.': G packages/graph/src/ptcgraph/ptccrt.pp G packages/ptc/src/win32/base/win32kbd.inc --- Recording mergeinfo for merge of r36556 into '.': G . # revisions: 34598,35481,36507,36508,36509,36555,36556 git-svn-id: https://svn.freepascal.org/svn/fpc/branches/fixes_3_0@36558 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'packages/ptc/src/win32/base/win32window.inc')
-rw-r--r--packages/ptc/src/win32/base/win32window.inc214
1 files changed, 161 insertions, 53 deletions
diff --git a/packages/ptc/src/win32/base/win32window.inc b/packages/ptc/src/win32/base/win32window.inc
index 2dc6401841..b65aabdb4b 100644
--- a/packages/ptc/src/win32/base/win32window.inc
+++ b/packages/ptc/src/win32/base/win32window.inc
@@ -1,6 +1,6 @@
{
Free Pascal port of the OpenPTC C++ library.
- Copyright (C) 2001-2003, 2006, 2007, 2009-2012 Nikolay Nikolov (nickysn@users.sourceforge.net)
+ Copyright (C) 2001-2003, 2006, 2007, 2009-2012, 2016, 2017 Nikolay Nikolov (nickysn@users.sourceforge.net)
Original C++ version by Glenn Fiedler (ptc@gaffer.org)
This library is free software; you can redistribute it and/or
@@ -27,7 +27,7 @@
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
}
{$ifdef VER2_6}
@@ -46,6 +46,8 @@ begin
defaults;
FWindow := window;
FManaged := False;
+ FIsUnicode := IsWindowUnicode(window);
+ LOG('IsUnicode', IsUnicode);
end;
function WndProcSingleThreaded(hWnd: HWND; message: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; forward;
@@ -59,33 +61,73 @@ var
rectangle: RECT;
display_width, display_height: Integer;
wc: WNDCLASSEXA;
+ wcw: WNDCLASSEXW;
+ WinVer: OSVERSIONINFO;
+ AWndClassW, ATitleW: WideString;
begin
LOG('creating managed window');
Defaults;
FMultithreaded := AMultithreaded;
try
+ FillChar(WinVer, SizeOf(WinVer), 0);
+ WinVer.dwOSVersionInfoSize := SizeOf(WinVer);
+ if not GetVersionEx(WinVer) then
+ raise TPTCError.Create('GetVersionEx failed');
+ { Win32s on Windows 3.1 and Win32 on Windows 95/98/ME don't support unicode }
+ FIsUnicode := (WinVer.dwPlatformId <> VER_PLATFORM_WIN32s) and
+ (WinVer.dwPlatformId <> VER_PLATFORM_WIN32_WINDOWS);
+ LOG('IsUnicode', IsUnicode);
+
FInterceptClose := AInterceptClose;
program_instance := GetModuleHandle(nil);
{ library_instance := program_instance;}
- wc.cbSize := SizeOf(wc);
- wc.hInstance := program_instance;
- wc.lpszClassName := PChar(AWndClass);
- wc.style := AClassStyle;
- wc.hIcon := 0{LoadIcon(library_instance, 'IDI_PTC_ICON')};
- wc.hIconSm := 0;
- wc.lpszMenuName := nil;
- wc.cbClsExtra := 0;
- wc.cbWndExtra := 0;
- wc.hbrBackground := 0;{(HBRUSH) GetStockObject(BLACK_BRUSH)}
- if AMultithreaded then
- wc.lpfnWndProc := @WndProcMultiThreaded
- else
- wc.lpfnWndProc := @WndProcSingleThreaded;
- if ACursor then
- wc.hCursor := LoadCursor(0, IDC_ARROW)
+ if IsUnicode then
+ begin
+ AWndClassW := AWndClass;
+ ATitleW := ATitle;
+
+ wcw.cbSize := SizeOf(wcw);
+ wcw.hInstance := program_instance;
+ wcw.lpszClassName := PWideChar(AWndClassW);
+ wcw.style := AClassStyle;
+ wcw.hIcon := 0{LoadIcon(library_instance, 'IDI_PTC_ICON')};
+ wcw.hIconSm := 0;
+ wcw.lpszMenuName := nil;
+ wcw.cbClsExtra := 0;
+ wcw.cbWndExtra := 0;
+ wcw.hbrBackground := 0;{(HBRUSH) GetStockObject(BLACK_BRUSH)}
+ if AMultithreaded then
+ wcw.lpfnWndProc := @WndProcMultiThreaded
+ else
+ wcw.lpfnWndProc := @WndProcSingleThreaded;
+ if ACursor then
+ wcw.hCursor := LoadCursorW(0, PWideChar(IDC_ARROW))
+ else
+ wcw.hCursor := 0;
+ RegisterClassExW(wcw);
+ end
else
- wc.hCursor := 0;
- RegisterClassExA(wc);
+ begin
+ wc.cbSize := SizeOf(wc);
+ wc.hInstance := program_instance;
+ wc.lpszClassName := PChar(AWndClass);
+ wc.style := AClassStyle;
+ wc.hIcon := 0{LoadIcon(library_instance, 'IDI_PTC_ICON')};
+ wc.hIconSm := 0;
+ wc.lpszMenuName := nil;
+ wc.cbClsExtra := 0;
+ wc.cbWndExtra := 0;
+ wc.hbrBackground := 0;{(HBRUSH) GetStockObject(BLACK_BRUSH)}
+ if AMultithreaded then
+ wc.lpfnWndProc := @WndProcMultiThreaded
+ else
+ wc.lpfnWndProc := @WndProcSingleThreaded;
+ if ACursor then
+ wc.hCursor := LoadCursorA(0, IDC_ARROW)
+ else
+ wc.hCursor := 0;
+ RegisterClassExA(wc);
+ end;
with rectangle do
begin
left := 0;
@@ -117,7 +159,10 @@ begin
end
else
begin
- FWindow := CreateWindowExA(FExtra, PChar(FName), PChar(FTitle), FStyle, FX, FY, FWidth, FHeight, 0, 0, 0, Self);
+ if IsUnicode then
+ FWindow := CreateWindowExW(FExtra, PWideChar(AWndClassW), PWideChar(ATitleW), FStyle, FX, FY, FWidth, FHeight, 0, 0, 0, Self)
+ else
+ FWindow := CreateWindowExA(FExtra, PChar(FName), PChar(FTitle), FStyle, FX, FY, FWidth, FHeight, 0, 0, 0, Self);
if not IsWindow(FWindow) then
raise TPTCError.Create('could not create window');
ShowWindow(FWindow, FShow);
@@ -140,16 +185,20 @@ end;
procedure TWin32Window.Cursor(AFlag: Boolean);
begin
if AFlag then
- begin
-// SetClassLong(FWindow, GCL_HCURSOR, LoadCursor(0, IDC_ARROW));
- SetClassLongPtr(FWindow, GCLP_HCURSOR, LoadCursor(0, IDC_ARROW));
- end
+ if IsUnicode then
+ SetClassLongPtrW(FWindow, GCLP_HCURSOR, LoadCursorW(0, PWideChar(IDC_ARROW)))
+ else
+ SetClassLongPtrA(FWindow, GCLP_HCURSOR, LoadCursorA(0, IDC_ARROW))
else
- begin
-// SetClassLong(FWindow, GCL_HCURSOR, 0);
- SetClassLongPtr(FWindow, GCLP_HCURSOR, 0);
- end;
- SendMessage(FWindow, WM_SETCURSOR, 0, 0);
+ if IsUnicode then
+ SetClassLongPtrW(FWindow, GCLP_HCURSOR, 0)
+ else
+ SetClassLongPtrA(FWindow, GCLP_HCURSOR, 0);
+
+ if IsUnicode then
+ SendMessageW(FWindow, WM_SETCURSOR, 0, 0)
+ else
+ SendMessageA(FWindow, WM_SETCURSOR, 0, 0);
end;
procedure TWin32Window.ConfineCursor(AFlag: Boolean);
@@ -216,18 +265,43 @@ begin
{ updated to pump all window messages, and not just for our FWindow;
this fixes keyboard layout switching and maybe other bugs and side effects...
Seems like Windows wants everything pumped :) }
+
+ { TranslateMessage isn't called, because it's incompatible with the
+ ToAscii/ToUnicode functions, which we use for translating keys to
+ characters. Both ToAscii/ToUnicode and TranslateMessage modify the kernel
+ key state, in such a way, which assumes that only one of these functions
+ is called per key event, so when both are called, they kill the dead key
+ support (because the dead key pressed state is toggled twice or something
+ like that). TODO: maybe we should call TranslateMessage for windows, which
+ aren't managed by us? }
if AWaitForMessage then
begin
- GetMessage(message, {FWindow}0, 0, 0);
- TranslateMessage(message);
- DispatchMessage(message);
- end
- else
- while PeekMessage(message, {FWindow}0, 0, 0, PM_REMOVE) do
+ if IsUnicode then
begin
- TranslateMessage(message);
- DispatchMessage(message);
+ GetMessageW(message, {FWindow}0, 0, 0);
+ //TranslateMessage(message);
+ DispatchMessageW(message);
+ end
+ else
+ begin
+ GetMessageA(message, {FWindow}0, 0, 0);
+ //TranslateMessage(message);
+ DispatchMessageA(message);
end;
+ end
+ else
+ if IsUnicode then
+ while PeekMessageW(message, {FWindow}0, 0, 0, PM_REMOVE) do
+ begin
+ //TranslateMessage(message);
+ DispatchMessageW(message);
+ end
+ else
+ while PeekMessageA(message, {FWindow}0, 0, 0, PM_REMOVE) do
+ begin
+ //TranslateMessage(message);
+ DispatchMessageA(message);
+ end;
end
else
Sleep(0);
@@ -251,7 +325,10 @@ begin
begin
pCreate := PCREATESTRUCT(lParam);
WindowObject := TWin32Window(pCreate^.lpCreateParams);
- SetWindowLongPtr(hWnd, GWLP_USERDATA, LONG_PTR(WindowObject));
+ if IsWindowUnicode(hWnd) then
+ SetWindowLongPtrW(hWnd, GWLP_USERDATA, LONG_PTR(WindowObject))
+ else
+ SetWindowLongPtrA(hWnd, GWLP_USERDATA, LONG_PTR(WindowObject));
Result := WindowObject.WMCreate(hWnd, message, wParam, lParam);
end;
WM_DESTROY:
@@ -259,22 +336,35 @@ begin
WindowObject := TWin32Window(GetWindowLongPtr(hWnd, GWLP_USERDATA));
Result := WindowObject.WMDestroy(hWnd, message, wParam, lParam);
end;
+ WM_MOUSEMOVE,
+ WM_LBUTTONDOWN, WM_LBUTTONUP, WM_LBUTTONDBLCLK,
+ WM_MBUTTONDOWN, WM_MBUTTONUP, WM_MBUTTONDBLCLK,
+ WM_RBUTTONDOWN, WM_RBUTTONUP, WM_RBUTTONDBLCLK,
+ WM_XBUTTONDOWN, WM_XBUTTONUP, WM_XBUTTONDBLCLK,
+ WM_MOUSEWHEEL, WM_MOUSEHWHEEL:
+ Result := 0;
WM_SYSCOMMAND:
begin
{ this fixes the pausing of the application when the Alt or F10 key is pressed }
if wParam = SC_KEYMENU then
- Result := 0
- else
- Result := DefWindowProcA(hWnd, message, wParam, lParam);
+ Result := 0
+ else
+ if IsWindowUnicode(hWnd) then
+ Result := DefWindowProcW(hWnd, message, wParam, lParam)
+ else
+ Result := DefWindowProcA(hWnd, message, wParam, lParam);
end;
WM_SETCURSOR: begin
if (LOWORD(lParam) = HTCLIENT) and (GetClassLongPtr(hWnd, GCLP_HCURSOR) = 0) then
begin
SetCursor(0);
- Result := 1;
+ Result := 1;
end
else
- Result := DefWindowProcA(hWnd, message, wParam, lParam);
+ if IsWindowUnicode(hWnd) then
+ Result := DefWindowProcW(hWnd, message, wParam, lParam)
+ else
+ Result := DefWindowProcA(hWnd, message, wParam, lParam);
end;
WM_CLOSE: begin
LOG('TWin32Window WM_CLOSE');
@@ -285,7 +375,10 @@ begin
Halt(0);
end;
else
- Result := DefWindowProcA(hWnd, message, wParam, lParam);
+ if IsWindowUnicode(hWnd) then
+ Result := DefWindowProcW(hWnd, message, wParam, lParam)
+ else
+ Result := DefWindowProcA(hWnd, message, wParam, lParam);
end;
end;
@@ -297,18 +390,24 @@ begin
begin
{ this fixes the pausing of the application when the Alt or F10 key is pressed }
if wParam = SC_KEYMENU then
- Result := 0
- else
- Result := DefWindowProcA(hWnd, message, wParam, lParam);
+ Result := 0
+ else
+ if IsWindowUnicode(hWnd) then
+ Result := DefWindowProcW(hWnd, message, wParam, lParam)
+ else
+ Result := DefWindowProcA(hWnd, message, wParam, lParam);
end;
WM_SETCURSOR: begin
if (LOWORD(lParam) = HTCLIENT) and (GetClassLongPtr(hWnd, GCLP_HCURSOR) = 0) then
begin
SetCursor(0);
- Result := 1;
+ Result := 1;
end
else
- Result := DefWindowProcA(hWnd, message, wParam, lParam);
+ if IsWindowUnicode(hWnd) then
+ Result := DefWindowProcW(hWnd, message, wParam, lParam)
+ else
+ Result := DefWindowProcA(hWnd, message, wParam, lParam);
end;
WM_DESTROY: begin
LOG('TWin32Window WM_DESTROY');
@@ -319,7 +418,10 @@ begin
Halt(0);
end;
else
- Result := DefWindowProcA(hWnd, message, wParam, lParam);
+ if IsWindowUnicode(hWnd) then
+ Result := DefWindowProcW(hWnd, message, wParam, lParam)
+ else
+ Result := DefWindowProcA(hWnd, message, wParam, lParam);
end;
end;
@@ -406,10 +508,16 @@ end;
function TWin32Window.WMCreate(hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
begin
- Result := DefWindowProcA(hWnd, uMsg, wParam, lParam);
+ if IsUnicode then
+ Result := DefWindowProcW(hWnd, uMsg, wParam, lParam)
+ else
+ Result := DefWindowProcA(hWnd, uMsg, wParam, lParam);
end;
function TWin32Window.WMDestroy(hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
begin
- Result := DefWindowProcA(hWnd, uMsg, wParam, lParam);
+ if IsUnicode then
+ Result := DefWindowProcW(hWnd, uMsg, wParam, lParam)
+ else
+ Result := DefWindowProcA(hWnd, uMsg, wParam, lParam);
end;