C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: ImmSetCompositionFontでフォントを設定


(過去ログ 16 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■5789 / inTopicNo.1)  ImmSetCompositionFontでフォントを設定
  
□投稿者/ 倉田 有大 (68回)-(2007/07/23(Mon) 20:38:03)

分類:[C#] 

ImmSetCompositionFontでフォントを設定したいのですが、

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public class LOGFONT
{
public const int LF_FACESIZE = 32;
public int lfHeight;
public int lfWidth;
public int lfEscapement;
public int lfOrientation;
public int lfWeight;
public byte lfItalic;
public byte lfUnderline;
public byte lfStrikeOut;
public byte lfCharSet;
public byte lfOutPrecision;
public byte lfClipPrecision;
public byte lfQuality;
public byte lfPitchAndFamily;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = LF_FACESIZE)]
public string lfFaceName;
}

LOGFONT logFont = new LOGFONT();
this.Font.ToLogFont(logFont);
ImmSetCompositionFont(hIMC, ref logFont);

なぜか、めちゃくちゃな記号のようなものがimmのフォントに設定されてしまいます。

logFont の取得した中は、こうでした。

lfCharSet 128 byte
lfFaceName "MS UI Gothic" string
lfHeight -12 int
lfWeight 400 int

ぐぐっても、ぐぐっても、ひっかかりません。C#では、サンプルが少なすぎます。
どこが間違ってるのかお分かりの方おられましたなら、よろしくお願いします<__>
引用返信 編集キー/
■5790 / inTopicNo.2)  Re[1]: ImmSetCompositionFontでフォントを設定
□投稿者/ 魔界の仮面弁士 (354回)-(2007/07/23(Mon) 20:54:56)
No5789 (倉田 有大 さん) に返信
> ImmSetCompositionFontでフォントを設定したいのですが、

その API の定義は、
  BOOL ImmSetCompositionFont(HIMC hIMC, LPLOGFONT lplf);
となっています。
第 2 引数は LPLOGFONT すなわち LOGFONT 構造体へのポインタです。


にも関わらず、
>         public class LOGFONT
参照型(クラス)を、
> ImmSetCompositionFont(hIMC, ref logFont);
参照渡し(ref)していますよね。


要するに「参照型を参照渡しする」のではなく、
そこでは「値型を参照渡しする」か、
もしくは「参照型を値渡しする」必要がある…ということです。

引用返信 編集キー/
■5792 / inTopicNo.3)  Re[2]: ImmSetCompositionFontでフォントを設定
□投稿者/ 倉田 有大 (69回)-(2007/07/23(Mon) 22:02:16)
魔界の仮面弁士 さんありがとうございます。

ref宣言を取れば動きました。<__>
LPLOGFONTをstruct宣言しても、動くかなとおもったのですが、
this.Font.ToLogFont(logFont);
ここで、取得してくれなくなっちゃいますね。objectは参照型だからあたりまえか。

>>ImmSetCompositionFontでフォントを設定したいのですが、
>
> その API の定義は、
> BOOL ImmSetCompositionFont(HIMC hIMC, LPLOGFONT lplf);
> となっています。
> 第 2 引数は LPLOGFONT すなわち LOGFONT 構造体へのポインタです。
>
>
> にも関わらず、
>> public class LOGFONT
> 参照型(クラス)を、
>>ImmSetCompositionFont(hIMC, ref logFont);
> 参照渡し(ref)していますよね。
>
>
> 要するに「参照型を参照渡しする」のではなく、
> そこでは「値型を参照渡しする」か、
> もしくは「参照型を値渡しする」必要がある…ということです。

あああ、ここらあたりが、わかりませんでした^^;
昔のC++時代のポインターの参照とかポインターのポインターとかを思い出しちゃいますね^^;
解決済み
引用返信 編集キー/
■5799 / inTopicNo.4)  Re[3]: ImmSetCompositionFontでフォントを設定
□投稿者/ 魔界の仮面弁士 (356回)-(2007/07/23(Mon) 23:42:39)
No5792 (倉田 有大 さん) に返信
> this.Font.ToLogFont(logFont);
> ここで、取得してくれなくなっちゃいますね。

struct の場合は、
    object obj = logFont;
    this.Font.ToLogFont(obj);
    logFont = (LOGFONT)obj;
のようにすれば取得できるかと思います。
(VB の場合は、Class にしないと取得できませんけど)


で、LOGFONT が class でも struct でも取得したいのであれば、
  #pragma warning disable 183
  if (logFont is ValueType)
で判定とか。

解決済み
引用返信 編集キー/
■5825 / inTopicNo.5)  Re[4]: ImmSetCompositionFontでフォントを設定
□投稿者/ 倉田 有大 (70回)-(2007/07/24(Tue) 13:04:40)
No5799 (魔界の仮面弁士 さん) に返信
> ■No5792 (倉田 有大 さん) に返信
>>this.Font.ToLogFont(logFont);
>>ここで、取得してくれなくなっちゃいますね。
>
> struct の場合は、
> object obj = logFont;
> this.Font.ToLogFont(obj);
> logFont = (LOGFONT)obj;
> のようにすれば取得できるかと思います。
> (VB の場合は、Class にしないと取得できませんけど)

なるほど、これは勉強になります。
VBは無理なんですか。
解決済み
引用返信 編集キー/
■5827 / inTopicNo.6)  Re[5]: ImmSetCompositionFontでフォントを設定
□投稿者/ 魔界の仮面弁士 (359回)-(2007/07/24(Tue) 14:15:11)
2007/07/24(Tue) 19:38:13 編集(投稿者)
No5825 (倉田 有大 さん) に返信
>>(VB の場合は、Class にしないと取得できませんけど)
> なるほど、これは勉強になります。
ボックス化された値型の取り扱いの違いから、VB とC# とでは異なる結果となります。

============================
public struct CSStruct
{
    public int Field;
}

static void Main()
{
    CSStruct a = new CSStruct();
    object b = a;
    object c = b;

    bool ret1 = object.ReferenceEquals(a, b);   // false
    bool ret2 = object.ReferenceEquals(c, b);   // true;
}
============================
Public Structure VBStruct
   Public Field As Integer
End Structure

Shared Sub Main()
   Dim a As New VBStruct()
   Dim b As Object = a
   Dim c As Object = b

   Dim ret1 As Boolean = Object.ReferenceEquals(a, b)  'False
   Dim ret2 As Boolean = Object.ReferenceEquals(c, b)  'False
End Sub
============================

IL を読むと、VB では RuntimeHelpers.GetObjectValue の呼び出しが逐次発生していることを確認できます。


> VBは無理なんですか。
同じ手順では無理、ということです。VB で Structure LOGFONT であっても、たとえば
Byte 配列等に Font.ToLogFont させてから、IntPtr 経由で PtrToStructure などすれば取れます。
# もっと簡単に取得する方法もあるのかな……?

まぁ、Class LOGFONT にしておいた方が無難ですけれどね。

解決済み
引用返信 編集キー/
■5906 / inTopicNo.7)  Re[6]: ImmSetCompositionFontでフォントを設定
□投稿者/ 倉田 有大 (75回)-(2007/07/25(Wed) 20:59:08)
詳しい説明ありがとうございます。
ILなんて、私にはよめませんが^^;
ReferenceEqualsについても調べたほうがよさそうですね。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -