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

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

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

Re[4]: コンボボックスの表示テキスト位置を設定したい


(過去ログ 93 を表示中)

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

■55792 / inTopicNo.1)  コンボボックスの表示テキスト位置を設定したい
  
□投稿者/ ホエホエ (29回)-(2010/12/14(Tue) 11:05:22)

分類:[.NET 全般] 

いつもお世話になっております、ホエホエです。

タイトルにもありますが、コンボボックスの表示テキストを
中央、右寄り表示したいのですが、テキストボックスのように
TextAlignプロパティがないためできません。

調べるとドロップダウンメニューに関してはコンボボックスクラスの
派生クラスのDrawItemイベントで独自描画すれば良いようですが、
コンボボックス自体のテキスト文字はどうすればできるのでしょうか?

OnPaintメソッドをオーバーライドしても実行されないようでして…
できればテキストに空白文字を入れる…と言うやり方以外で
対処したいのですが。


ちなみに環境は
WindowsXP SP3
VisualStudio2003 or 2008
です。

ご存知の方、教えてください。
引用返信 編集キー/
■55793 / inTopicNo.2)  Re[1]: コンボボックスの表示テキスト位置を設定したい
□投稿者/ マサヤ (188回)-(2010/12/14(Tue) 11:35:04)
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=42769&forum=7
これが参考になるのでは?
引用返信 編集キー/
■55795 / inTopicNo.3)  Re[2]: コンボボックスの表示テキスト位置を設定したい
□投稿者/ マサヤ (189回)-(2010/12/14(Tue) 11:38:55)
右寄せの場合ではここなど参考になります。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=26864&forum=7

引用返信 編集キー/
■55801 / inTopicNo.4)  Re[3]: コンボボックスの表示テキスト位置を設定したい
□投稿者/ ホエホエ (30回)-(2010/12/14(Tue) 15:14:35)
マサヤさん>
ご返信ありがとうございます。

どちらも拝見させていただきましたが、空白文字にて対処する方法ですね。
やはりこの方法しかないんでしょうか…
引用返信 編集キー/
■55803 / inTopicNo.5)  Re[4]: コンボボックスの表示テキスト位置を設定したい
□投稿者/ shu (286回)-(2010/12/14(Tue) 15:42:25)
No55801 (ホエホエ さん) に返信

DropDownStyleがDropDownListならDrawItemイベントで出来るかと思います。
DropDownでは出来ないかと思うので自由入力をしたいなら別途テキストボックスを用意しては
どうでしょう?
引用返信 編集キー/
■55804 / inTopicNo.6)  Re[5]: コンボボックスの表示テキスト位置を設定したい
□投稿者/ マサヤ (190回)-(2010/12/14(Tue) 16:17:34)
というとこれでしょうか?
http://www.java2s.com/Code/CSharpAPI/System.Windows.Forms/ComboBoxDrawItem.htm
引用返信 編集キー/
■55805 / inTopicNo.7)  Re[1]: コンボボックスの表示テキスト位置を設定したい
□投稿者/ 魔界の仮面弁士 (1983回)-(2010/12/14(Tue) 16:28:37)
No55792 (ホエホエ さん) に返信
> タイトルにもありますが、コンボボックスの表示テキストを
> 中央、右寄り表示したいのですが、テキストボックスのように
> TextAlignプロパティがないためできません。

これでどうでしょうか。VB2008 + 32bit版XPで検証しています。
(Win2000 以下や、64bit動作の場合はこれでは駄目かも)

Imports System.Runtime.InteropServices

Public Class Form1
    <StructLayout(LayoutKind.Sequential)> Private Class ComboBoxInfo
        Public Size As Integer
        Public RectItem As Rectangle
        Public RectButton As Rectangle
        Public ButtonState As Integer
        Public ComboBoxHandle As IntPtr
        Public EditBoxHandle As IntPtr
        Public ListBoxHandle As IntPtr
        Public Sub New()
            Me.Size = Marshal.SizeOf(Me)
        End Sub
    End Class
    Private Declare Function GetComboBoxInfo Lib "USER32" _
        (ByVal hwndCombo As IntPtr, ByVal cbi As ComboBoxInfo) _
        As <MarshalAs(UnmanagedType.Bool)> Boolean
    Private Declare Auto Function SetWindowLong Lib "USER32" _
        (ByVal hWnd As IntPtr, ByVal nIndex As Integer, _
         ByVal dwNewLong As Integer) As Integer
    Private Declare Auto Function GetWindowLong Lib "USER32" _
        (ByVal hWnd As System.IntPtr, ByVal nIndex As Integer) As Integer
    Private Const GWL_STYLE As Integer = -16
    Private Const ES_RIGHT As Integer = 2

    Private Sub SetRightAlign(ByVal combo As ComboBox)
        Dim ci As New ComboBoxInfo()
        If Not GetComboBoxInfo(combo.Handle, ci) Then Return
        If ci.EditBoxHandle = IntPtr.Zero Then Return
        Dim style As Integer = GetWindowLong(ci.EditBoxHandle, GWL_STYLE)
        SetWindowLong(ci.EditBoxHandle, GWL_STYLE, style Or ES_RIGHT)
    End Sub


    Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
        SetRightAlign(ComboBox1)
    End Sub
End Class

引用返信 編集キー/
■55806 / inTopicNo.8)  Re[2]: コンボボックスの表示テキスト位置を設定したい
□投稿者/ マサヤ (191回)-(2010/12/14(Tue) 18:03:17)
C#だとこれであってますか?
[StructLayout(LayoutKind.Sequential)]
        private class comboBoxInfo
        {
            public int Size;
            public Rectangle RectItem;
            public Rectangle RectButton;
            public int ButtonState;
            public IntPtr ComboBoxHandle;
            public IntPtr EditBoxHandle;
            public IntPtr ListBoxHandle;
            public void New()
            {
                this.Size = Marshal.SizeOf(this);
            }
        }
        [DllImport("user32.dll")]
        private extern static bool GetComboBoxInfo(IntPtr hwindCombo, comboBoxInfo cbi);
        [DllImport("user32.dll")]
        private extern static int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
        [DllImport("user32.dll")]
        private extern static int GetWindowLong(IntPtr hWnd, int nIndex);
        private const int GWL_STYLE = -16;
        private const int ES_RIGHT = -8;

        private void SetRightAlign(ComboBox combo)
        {
            comboBoxInfo ci = new comboBoxInfo();
            if(!GetComboBoxInfo(combo.Handle, ci))
            {
                return;
            }
            if (ci.EditBoxHandle == IntPtr.Zero)
            {
                return;
            }
            int style = GetWindowLong(ci.EditBoxHandle, GWL_STYLE);
            SetWindowLong(ci.EditBoxHandle, GWL_STYLE, style); 
        }

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            SetRightAlign(comboBox1);
        }

引用返信 編集キー/
■55807 / inTopicNo.9)  Re[3]: コンボボックスの表示テキスト位置を設定したい
□投稿者/ shu (287回)-(2010/12/14(Tue) 18:14:40)
No55806 (マサヤ さん) に返信

VB.NETのNewはコンストラクタです。
引用返信 編集キー/
■55808 / inTopicNo.10)  Re[3]: コンボボックスの表示テキスト位置を設定したい
□投稿者/ 魔界の仮面弁士 (1984回)-(2010/12/14(Tue) 18:31:43)
2010/12/15(Wed) 17:20:02 編集(投稿者)
No55806 (マサヤ さん) に返信
> C#だとこれであってますか?
これでは求める結果にならないと思います。元質問者は言語を指定していないので、
VB でも C# でも F# でも JScript でも、言語自体の縛りは無さそうですけれども。


>>    <StructLayout(LayoutKind.Sequential)> Private Class ComboBoxInfo
> [StructLayout(LayoutKind.Sequential)]
>         private class comboBoxInfo
間違いではありませんが、クラス名は大文字で始めるのが慣習です。


>>         Public Sub New()
>             public void New()
コンストラクタの記述が間違っています。
C# の場合は「public comboBoxInfo()」ですね。


>>    Private Const ES_RIGHT As Integer = 2
>        private const int ES_RIGHT = -8;
定数値が変わってしまっています。ES_RIGHT は 0x0002 です。


>>        Dim style As Integer = GetWindowLong(ci.EditBoxHandle, GWL_STYLE)
>>        SetWindowLong(ci.EditBoxHandle, GWL_STYLE, style Or ES_RIGHT)
>             int style = GetWindowLong(ci.EditBoxHandle, GWL_STYLE);
>             SetWindowLong(ci.EditBoxHandle, GWL_STYLE, style); 
肝心の ES_RIGHT が指定されていません。このコードで最も重要な箇所なのに…。

引用返信 編集キー/
■55809 / inTopicNo.11)  Re[2]: コンボボックスの表示テキスト位置を設定したい
□投稿者/ 魔界の仮面弁士 (1985回)-(2010/12/14(Tue) 18:39:38)
No55805 (魔界の仮面弁士 さん) に追記
>> VisualStudio2003 or 2008
> これでどうでしょうか。VB2008 + 32bit版XPで検証しています。
2003 の場合は、これではコンパイルが通らない可能性があります。

2005 未満のバージョンで実行する場合は、
> If ci.EditBoxHandle = IntPtr.Zero Then Return
の = 演算子の代わりに、Equals メソッドを利用してみてください。。

If IntPtr.Zero.Equals(ci.EditBoxHandle) Then Return
引用返信 編集キー/
■55817 / inTopicNo.12)  Re[3]: コンボボックスの表示テキスト位置を設定したい
□投稿者/ マサヤ (192回)-(2010/12/15(Wed) 09:35:11)
>shuさん
>魔界の仮面弁士さん
他人の質問で恐縮ですが勉強させていただき、ありがとうございます。
修正いたしました。

[StructLayout(LayoutKind.Sequential)]
        private class ComboBoxInfo
        {
            public int Size;
            public Rectangle RectItem;
            public Rectangle RectButton;
            public int ButtonState;
            public IntPtr ComboBoxHandle;
            public IntPtr EditBoxHandle;
            public IntPtr ListBoxHandle;
            public ComboBoxInfo()
            {
                this.Size = Marshal.SizeOf(this);
            }
        }
        [DllImport("user32.dll")]
        private extern static bool GetComboBoxInfo(IntPtr hwindCombo, ComboBoxInfo cbi);
        [DllImport("user32.dll")]
        private extern static int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
        [DllImport("user32.dll")]
        private extern static int GetWindowLong(IntPtr hWnd, int nIndex);
        private const int GWL_STYLE = -16;
        private const int ES_RIGHT = 0x0002;

        private void SetRightAlign(ComboBox combo)
        {
            ComboBoxInfo ci = new ComboBoxInfo();
            if(!GetComboBoxInfo(combo.Handle, ci))
            {
                return;
            }
            if (ci.EditBoxHandle == IntPtr.Zero)
            {
                return;
            }
            int style = GetWindowLong(ci.EditBoxHandle, GWL_STYLE);
            SetWindowLong(ci.EditBoxHandle, GWL_STYLE, style | ES_RIGHT); 
        }

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            SetRightAlign(comboBox1);
        }

引用返信 編集キー/
■55872 / inTopicNo.13)  Re[4]: コンボボックスの表示テキスト位置を設定したい
□投稿者/ ホエホエ (31回)-(2010/12/16(Thu) 15:41:21)
魔界の仮面弁士さん>
マサヤさん>
ご返信ありがとうございます!!

ご両名のサンプルを参考に作成してできました!!
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -