Browse Source

Patch from Shinsaku Nakagawa. Fixes two IME problems:

1. The font of IME is not changed when option changed.
   (Option->TextEditor->General->Font)
2. The location of IME is not occasionally correct.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@555 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Markus Palme 21 years ago
parent
commit
fe3e18a8f2
  1. 4
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/Caret.cs
  2. 81
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/Ime.cs

4
src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/Caret.cs

@ -249,10 +249,10 @@ namespace ICSharpCode.TextEditor
if (ime == null) { if (ime == null) {
ime = new Ime(textArea.Handle, textArea.Document.TextEditorProperties.Font); ime = new Ime(textArea.Handle, textArea.Document.TextEditorProperties.Font);
} else { } else {
ime.HWnd = textArea.Handle;
ime.Font = textArea.Document.TextEditorProperties.Font; ime.Font = textArea.Document.TextEditorProperties.Font;
} }
ime.SetIMEWindowLocation(pos.X + 2, ime.SetIMEWindowLocation(pos.X, pos.Y);
pos.Y);
currentPos = pos; currentPos = pos;
} }

81
src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/Ime.cs

@ -18,7 +18,8 @@ namespace ICSharpCode.TextEditor
{ {
public Ime(IntPtr hWnd, Font font) public Ime(IntPtr hWnd, Font font)
{ {
hIMEWnd = ImmGetDefaultIMEWnd(hWnd); this.hWnd = hWnd;
this.hIMEWnd = ImmGetDefaultIMEWnd(hWnd);
this.font = font; this.font = font;
SetIMEWindowFont(font); SetIMEWindowFont(font);
} }
@ -27,24 +28,35 @@ namespace ICSharpCode.TextEditor
public Font Font public Font Font
{ {
get { get {
return font; return font;
} }
set { set {
if (font.Equals(value) == false) { if (font.Equals(value) == false) {
SetIMEWindowFont(value); SetIMEWindowFont(value);
font = value; font = value;
} }
} }
} }
public IntPtr HWnd
{
set {
if (this.hWnd != value) {
this.hWnd = value;
this.hIMEWnd = ImmGetDefaultIMEWnd(value);
SetIMEWindowFont(font);
}
}
}
[ DllImport("imm32.dll") ] [ DllImport("imm32.dll") ]
private static extern IntPtr ImmGetDefaultIMEWnd(IntPtr hWnd); private static extern IntPtr ImmGetDefaultIMEWnd(IntPtr hWnd);
[ DllImport("user32.dll") ] [ DllImport("user32.dll") ]
private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, COMPOSITIONFORM lParam); private static extern int SendMessage(IntPtr hWnd, int msg, int wParam, COMPOSITIONFORM lParam);
[ DllImport("user32.dll") ] [ DllImport("user32.dll") ]
private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, LOGFONT lParam); private static extern int SendMessage(IntPtr hWnd, int msg, int wParam, [In, MarshalAs(UnmanagedType.LPStruct)] LOGFONT lParam);
[ StructLayout(LayoutKind.Sequential) ] [ StructLayout(LayoutKind.Sequential) ]
private class COMPOSITIONFORM private class COMPOSITIONFORM
{ {
@ -52,14 +64,14 @@ namespace ICSharpCode.TextEditor
public POINT ptCurrentPos = null; public POINT ptCurrentPos = null;
public RECT rcArea = null; public RECT rcArea = null;
} }
[ StructLayout(LayoutKind.Sequential) ] [ StructLayout(LayoutKind.Sequential) ]
private class POINT private class POINT
{ {
public int x = 0; public int x = 0;
public int y = 0; public int y = 0;
} }
[ StructLayout(LayoutKind.Sequential) ] [ StructLayout(LayoutKind.Sequential) ]
private class RECT private class RECT
{ {
@ -68,15 +80,15 @@ namespace ICSharpCode.TextEditor
public int right = 0; public int right = 0;
public int bottom = 0; public int bottom = 0;
} }
private const int WM_IME_CONTROL = 0x0283; private const int WM_IME_CONTROL = 0x0283;
private const int IMC_SETCOMPOSITIONFONT = 0x000a;
private const int IMC_SETCOMPOSITIONWINDOW = 0x000c; private const int IMC_SETCOMPOSITIONWINDOW = 0x000c;
private IntPtr hIMEWnd; private IntPtr hIMEWnd;
private IntPtr hWnd;
private const int CFS_POINT = 0x0002; private const int CFS_POINT = 0x0002;
[ StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto) ] [ StructLayout(LayoutKind.Sequential) ]
private class LOGFONT private class LOGFONT
{ {
public int lfHeight = 0; public int lfHeight = 0;
@ -94,43 +106,40 @@ namespace ICSharpCode.TextEditor
public byte lfPitchAndFamily = 0; public byte lfPitchAndFamily = 0;
[ MarshalAs(UnmanagedType.ByValTStr, SizeConst=32) ] public string lfFaceName = null; [ MarshalAs(UnmanagedType.ByValTStr, SizeConst=32) ] public string lfFaceName = null;
} }
private const int IMC_SETCOMPOSITIONFONT = 0x000a;
const byte FF_MODERN = 48;
const byte FIXED_PITCH = 1;
private void SetIMEWindowFont(Font f) private void SetIMEWindowFont(Font f)
{ {
LOGFONT lf = new LOGFONT(); LOGFONT lf = new LOGFONT();
f.ToLogFont(lf); f.ToLogFont(lf);
lf.lfPitchAndFamily = FIXED_PITCH | FF_MODERN; lf.lfFaceName = f.Name; // This is very important! "Font.ToLogFont" Method sets invalid value to LOGFONT.lfFaceName
SendMessage( SendMessage(
hIMEWnd, hIMEWnd,
WM_IME_CONTROL, WM_IME_CONTROL,
new IntPtr(IMC_SETCOMPOSITIONFONT), IMC_SETCOMPOSITIONFONT,
lf lf
); );
} }
public void SetIMEWindowLocation(int x, int y) public void SetIMEWindowLocation(int x, int y)
{ {
POINT p = new POINT(); POINT p = new POINT();
p.x = x; p.x = x;
p.y = y; p.y = y;
COMPOSITIONFORM lParam = new COMPOSITIONFORM(); COMPOSITIONFORM lParam = new COMPOSITIONFORM();
lParam.dwStyle = CFS_POINT; lParam.dwStyle = CFS_POINT;
lParam.ptCurrentPos = p; lParam.ptCurrentPos = p;
lParam.rcArea = new RECT(); lParam.rcArea = new RECT();
SendMessage( SendMessage(
hIMEWnd, hIMEWnd,
WM_IME_CONTROL, WM_IME_CONTROL,
new IntPtr(IMC_SETCOMPOSITIONWINDOW), IMC_SETCOMPOSITIONWINDOW,
lParam lParam
); );
} }
} }
} }

Loading…
Cancel
Save