コンボボックスのボタンを押しても、アイテムリストが開かない問題の解決策

このQ&Aのポイント
  • コンボボックスのボタンを押しても、アイテムリストが開かない問題が発生しています。数個のコンボボックスを作成していますが、最初の3個のボックスは問題なくリストが開きます。
  • しかし、後続のコンボボックスではアイテムリストが開かないという現象が発生しています。
  • この問題の解決策を教えてください。
回答を見る
  • ベストアンサー

コンボボックスのボタンを押しても、アイテムリストが開きません。

コンボボックスのボタンを押しても、アイテムリストが開きません。 h_ComboBox = CreateWindowEx(0, TEXT("COMBOBOX"), TEXT(""),WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST,16, 90, 500, 24,hWnd, (HMENU)IDC_COMBOBOX, h_Inst, NULL); SendMessage(h_ComboBox, CB_ADDSTRING, 0, (LPARAM)"試験1"); SendMessage(h_ComboBox, CB_ADDSTRING, 0, (LPARAM)"試験2"); SendMessage(h_ComboBox, CB_ADDSTRING, 0, (LPARAM)"試験3"); SendMessage(h_ComboBox, CB_SETCURSEL, 0, 0); このようなボックスを数個作っていますが、最初の3個のボックスはリストが開くのですが後が開きません。 解決策を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

 こんにちは。  高さの指定が間違っているのではないでしょうか。  h_ComboBox = CreateWindowEx(0, TEXT("COMBOBOX"), TEXT(""),WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST,16, 90, 500, 24/*ココ*/,hWnd, (HMENU)IDC_COMBOBOX, h_Inst, NULL);  ↓  h_ComboBox = CreateWindowEx(0, TEXT("COMBOBOX"), TEXT(""),WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST,16, 90, 500, 90+24/*この様にする*/,hWnd, (HMENU)IDC_COMBOBOX, h_Inst, NULL);

7777777v
質問者

お礼

高さはアイテム窓自体の高さではなく、アイテムの数だけ必要なのですね。 解決しました、ありがとうございました。

関連するQ&A

  • Win32APIで作るコンボボックスの高さの調整

    作成中のアプリもだいぶ必要機能を網羅出来て来て よーし、もうちょっとだ!ってとこに来て コンボボックスのドロップダウンが「ほとんど表示されてない」事に気付きました。 なんでやのんということで調べてみると どうやらCreateWindowExとかリソースとかで指定する「高さ」が コンボボックスでCBS_DROPDOWNLISTスタイル込みの場合 ドロップダウンを表示させたときのドロップダウンリストの高さを含むように 予約領域先に作っておかなければいけない、とのこと えー、クリックすると表示になる割に 「内部的に別々で自動的に高さ計算」 とかになってるんじゃないのー? ということで またしてもMicrosoftちゃんにしてやられたって気分ですが しょうがないのでちゃっちゃとクラス化してみました。 (ていうか、なんで他のコントロールはほとんど独自クラスにしてあるのに、コンボボックスはクラス化してなかったんだろうと、小一時間(ry)) なお、現状ではMFCは使えません(w | orz) あ、たぶん TcsLiteral → const TCHAR* const szt → size_t 以外のtypedefやdefineは見れば元が何なのか分かる(か、分かんなくても問題ないはず) と思うので省略しまふ(お) ヘッダ #pragma once class myComboBox { HWND wnd; szt num; public: myComboBox( HWND hw, int x, int y, int cx ); ~myComboBox(); BOOL Enable( BOOL b ) const { return EnableWindow( wnd, b ); } Void Select( Dword i ) const { SendMessage( wnd, CB_SETCURSEL, (WPARAM)i, 0 ); } Int GetIndex() const { return (Int)SendMessage( wnd, CB_GETCURSEL, 0, 0 ); } Void Setup() const; Void AddString( TcsLiteral s ){ SendMessage( wnd, CB_ADDSTRING , 0 , (LPARAM)s ); ++num; } Void AddStrings( TcsLiteral* const s, const szt num_ ){ for ( szt i = 0; i < num_; ++i ) SendMessage( wnd, CB_ADDSTRING , 0 , (LPARAM)s[i] ); num += num_; } }; ソース #include "StdAfx.h" #include "myComboBox.h" #include "FontLibrary.h" myComboBox::myComboBox( HWND hw, int x, int y, int cx ) : num(0) { wnd = CreateWindowEx(0, _T("COMBOBOX"), null , WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST , x, y , cx, 0, hw, null, HINST::me, null); } myComboBox::~myComboBox(){ DestroyWindow( wnd ); } Void myComboBox::Setup() const { RECT rc; GetClientRect( wnd, &rc ); int cy = (int)SendMessage( wnd, CB_GETITEMHEIGHT, -1, 0 ); cy += (int)SendMessage( wnd, CB_GETITEMHEIGHT, 0, 0 ) * num; cy += GetSystemMetrics(SM_CYEDGE) * 2; cy += GetSystemMetrics(SM_CYEDGE) * 2; SetWindowPos( wnd, null, 0, 0, rc.right, cy, SWP_NOMOVE|SWP_NOZORDER ); SendMessage( wnd, CB_SETCURSEL, 0 , 0 ); SendMessage( wnd, WM_SETFONT, (WPARAM)FontLibrary::Default, True ); } 使い方の例はこんな感じです。 wnd = CreateWindowEx( ~ ・ ・ ・ combo_measden = new myComboBox( wnd, 50, 200, 60 ); TcsLiteral c[] = { _T("1"), _T("2"), _T("4"), _T("8"), _T("16"), _T("32") }; combo_measden->AddStrings( c, sizeof c / sizeof(c[0]) ); combo_measden->Setup(); 解放時 /* Windows的には「HWNDの、子ウインドウ」のみについて言えば親ウインドウのDestroyのときに同時に自動解放してくれるようですが、どっちみちcombo_measdenポインタはdeleteかけないといけないので */ delete combo_measden; DestryWindow( wnd ); で、今回何が知りたいのかというと このSetup関数の中の int cy = (int)SendMessage( wnd, CB_GETITEMHEIGHT, -1, 0 ); cy += (int)SendMessage( wnd, CB_GETITEMHEIGHT, 0, 0 ) * num; cy += GetSystemMetrics(SM_CYEDGE) * 2; cy += GetSystemMetrics(SM_CYEDGE) * 2; SetWindowPos( wnd, null, 0, 0, rc.right, cy, SWP_NOMOVE|SWP_NOZORDER ); この調整部分です。 こんでXP以降のWindowsは全部OKですかね? XPはクラシックでもXP用のVisualスタイルでもおkっぽいですが。 その他の突っ込みどころもあれば募集致します。

  • コンボボックスの開いたリストを閉じるには

    コンボボックスのリストを開くのはComboBox1.DropDownでできますが、閉じるのはどういう風にやればいいでしょうか。 今ユーザーフォームで Private Sub Combobox1_Change() ComboBox1.Clear v = ComboBox1.Text For i = 1 To 300 c = Worksheets("Sheet1").Cells(i, "A") If v = Left(c, Len(v)) And Len(v) > 0 Then ComboBox1.AddItem c End If Next i ComboBox1.DropDown End Sub と言う風にしていますが、リストを開きっぱなしだと変な表示になってしまい、マウスクリックで一旦閉じてから開かないと変な表示になってしまうのです。 そこで一旦リストをマクロで閉じさせてから再び開きたいのですが、どうすればいいでしょうか。

  • エディットボックス内でキー押されたときのメッセージ

    VC++6.0です。 メインウインドウ内のエディットボックス(一行)で、特定のキー入力を検知したいのですが、どのようにすればよいでしょうか。 mfcは使ってません。 //ウインドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {  switch( message )  {   case WM_CREATE:    //エディットボックスを作成    CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT","",          WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL,          0,0,2000, 20, hWnd, (HMENU)IDC_EDIT, g_hInst, NULL );    break;   case WM_COMMAND:    //エディットボックス内の変更はEN_CHANGEで受け取れるが、    //キーコードは送られてこない    break;  } }

  • コンボボックスのリスト全てをセルに書き出す

    private sub UserForm_Initialize()  me.combobox1.list = get_unique_and_visible_list(range("A2:A17"))  me.combobox2.list = get_unique_and_visible_list(range("B2:B17"))  me.combobox3.list = get_unique_and_visible_list(range("C2:C17"))  me.combobox4.list = get_unique_and_visible_list(range("D2:D17"))  me.combobox5.list = get_unique_and_visible_list(range("E2:E17"))  me.combobox6.list = get_unique_and_visible_list(range("F2:F17"))  me.combobox7.list = get_unique_and_visible_list(range("G2:G17"))  me.combobox8.list = get_unique_and_visible_list(range("H2:H17")) end sub private function Get_Unique_and_Visible_List(byref Target as range) as variant ’指定のセル範囲から可視セルを抽出し一意のリストを返す  dim h as range  dim myDic as object  set mydic = createobject("Scripting.Dictionary")  for each h in target.specialcells(xlcelltypevisible)   mydic(h.value) = 1  next  get_unique_and_visible_list = mydic.keys end function 上記方法で、コンボボックスのデータを取得しております。 取得したコンボボックスのリストを Sheet5のIVセルなどに書き出そうと思います。 この場合、 For i=1 To me.combobox1!="" step 1  Worksheets("Sheet5").Range("IV" & i)=me.combobox1.List( i, 0) Next こういった方法にすれば書き出せるのでしょうか? もっと簡単に書き出す方法がありそうですが、中々思いつかないので… 何か知恵をお菓子頂けると嬉しいです! よろしくお願い致します。

  • テキストボックスのデフォルト設定とコンボボックスの更新について

    テキストボックスのデフォルト設定とコンボボックスの更新について エクセルのVBAで、ユーザーフォームを使用しています。 ユーザーフォームの中にはコンボボックスとテキストボックスとボタンがあります。 コンボボックスには「ABCDEFGHIJKLM」と合計13のリストがあります。 ユーザーフォーム起動時に、コンボボックスには最初のリスト(A)が表示 されていて、「次へ」ボタンと「戻る」ボタンの2つを用意しています。 (1)ユーザーフォーム起動時にテキストボックスに「0」を入れる方法を教えていただけないでしょうか。 コンボボックスで「A」が選択された状態で「次へ」ボタンをおしたら「B」が選ばれる。 「D」が選択された状態で「次へ」ボタンをおしたら「E」が選ばれる。 「M」が選択された状態で「次へ」ボタンをおしたら「A」が選択される。(リストの最初に戻る。) というのは、次のVBAで上手くいきました。 If Combobox1.ListIndex < Combobox1.ListCount - 1 Then Combobox1.Text = Combobox1.List(Combobox1.ListIndex + 1) Else Combobox1.Text = Combobox1.List(0) End If (2)しかし「E」が選択された状態で「戻る」ボタンをおしたら「D」が選ばれる。 「G」が選択された状態で「戻る」ボタンをおしたら「F」が選ばれる。 「A」が選択された状態で「戻る」ボタンをおしたら「M」が選ばれる。(リストの最後に戻る。) といった内容のマクロがうまく組めません。 教えていただけると助かります。

  • ダイアログボックスのボタンコントロールのフォーカスについて

    ダイアログボックスのボタンコントロールのフォーカスについて 教えて下さい。  モーダルダイアログにボタン「OK」を一つ貼り付けて それを「標準のボタン」(BS_DEFPUSHBUTTON)として作成したのですが ダイアログ表示直後は下画像(1)のようになってエンターキーを押しても 反応しません。何度かカーソルキーを押すとようやく(2)のように ボタンに枠線がついてエンターで押せるようになるのですが ダイアログ表示直後に(2)のようにするにはどうするべきでしょうか? ダイアログのコールバック・プロシージャ(WM_INITDIALOG部分でボタン作成) LRESULT CALLBACK SettingWndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp){ switch (msg){ case WM_INITDIALOG: CreateWindowEx(0x00000000,"BUTTON","OK", WS_CHILD |WS_VISIBLE| WS_TABSTOP | BS_DEFPUSHBUTTON, 16,16,80,21,hWnd,(HMENU)IDOK,GetModuleHandle(0),0); return TRUE; } return FALSE; }

  • コンボボックスのクリア方法について教えて下さい(vb6.5)

    コンボボックスのクリア方法について教えて下さい(vb6.5) ComboBox1で選択したものによって、 ComboBox2で表示するものを変えたいと思っています。 ただ、一度ComboBox1で選択した後にComboBox2を開くと、 ComboBox2は前回のものがどんどん足されていきます。 コンボボックスのクリア方法について、 どの様にすればよいかご教示のほど、 宜しくお願い致します。 Private Sub ComboBox1_Change() UserForm1.ComboBox2.RemoveItem (0) If ComboBox1.Text = 1 Then UserForm1.ComboBox2.AddItem "A" UserForm1.ComboBox2.AddItem "B" UserForm1.ComboBox2.AddItem "C" ElseIf ComboBox1.Text = 2 Then UserForm1.ComboBox2.AddItem "D" UserForm1.ComboBox2.AddItem "E" UserForm1.ComboBox2.AddItem "F" Else UserForm1.ComboBox2.AddItem "G" UserForm1.ComboBox2.AddItem "H" UserForm1.ComboBox2.AddItem "I" End If End Sub -------------------------------------- Private Sub UserForm_Initialize() UserForm1.ComboBox1.AddItem "1" UserForm1.ComboBox1.AddItem "2" UserForm1.ComboBox1.AddItem "3" End Sub

  • Excel VBAのコンボボックス

    お世話になります。 コンボボックス1と2と3は選択されますが コンボボックス4には何の表示もされません。 選択して条件設定は4つ以上できないのでしょうか? Dim ITE As Variant Dim flg As Variant Private Sub ComboBox3_Change() 'ComboBox4セット Dim ico As Long ico = 1 With ThisWorkbook.Worksheets("data") KEY = Me.ComboBox1.Text KEY2 = Me.ComboBox2.Text KEY3 = Me.ComboBox3.Text Me.ComboBox4.Clear Do While .Cells(ico, 1) <> "" If .Cells(ico, 1) = KEY And .Cells(ico, 2) = KEY2 And .Cells(ico, 3) = KEY3 Then ITE = .Cells(ico, 4).Value flg = 0 For I = 0 To Me.ComboBox4.ListCount - 1 If ITE = Me.ComboBox4.List(I) Then flg = 1 Next If flg = 0 Then Me.ComboBox4.AddItem ITE End If ico = ico + 1 Loop End With Me.ComboBox4.SetFocus End Sub

  • リストから値を取得する時

    コンボボックスなどで値(a)をとる時、 ・combobox.list = ・combobox.listindex = ・combobox.text = "a" これらの違いがわからないのですがどのように使いわけるのでしょうか?

  • excelのコンボボックスでの階層リスト表示

    (すいません、再投稿します) excelのコンボボックスで、階層にわけてリスト表示させたいのですが、うまくいきません。 数日悩んでまして、どなたか教えてもらえませんか。 シート1:会社名    1列目:会社名  2列目:ID シート2:事業部名   1列目:事業部名 2列目:ID シート3:部門名     1列目:部門名  2列目:ID シート4:担当名     1列目:担当名  2列目:ID ユーザーフォームにそれぞれのコンボボックスを作っています。 ComboBox1:会社名     TextBox1:ID ComboBox2:事業部名    TextBox2:ID ComboBox3:部門名     TextBox3:ID ComboBox4:担当名     TextBox4:ID   たとえば会社名がAのときは、ComboBox2ではAの事業部だけが表示される、というようなかんじです。 同時に隣のIDももってこないといけない為に、苦戦しています。助けてください。。。。 下記記述は3番、まではうまくいくのですが、”4番TextBox2の値代入”がうまくいきません。 -------- Option Explicit Dim シート名 As String Dim 行 As Long Dim 範囲 As String Dim 事業部範囲 As String '-1---ComboBox1------------------- Private Sub ComboBox1_DropButtonClick() シート名 = "会社名" Worksheets(シート名).Activate 'ワークシートをアクティブにする Range("A1").CurrentRegion.Select 'アクティブセル領域を選択する With Selection 行 = .Rows.Count '同上領域の行数を取得する 範囲 = .Cells(1, 1).Address & ":" & .Cells(行, 1).Address '同上領域のアドレスを変数に End With ComboBox1.RowSource = シート名 & "!" & 範囲 'コンボボックスのリストのソースを設定する End Sub '-2----ComboBox1------------------- Private Sub ComboBox1_Click() 'コンボボックス上でクリックされると実行される シート名 = "会社名" 行 = ComboBox1.ListIndex + 1 'コンボボックスで選択された行 + 1 TextBox1.Text = Worksheets(シート名).Cells(行, 2) '対応するセルの値をテキストボックスに End Sub '-3----ComboBox2------------------- Private Sub ComboBox1_Change() ' ComboBox1 が変化した時の処理 シート名 = "事業部名" Dim si As Integer With UserForm1 .ComboBox2.Text = "" si = .ComboBox1.ListIndex ' ComboBox1 の何番目が選択されたかを得る Select Case si Case 0 ' 0番が選択されていたらComboBox2 の内容 Worksheets(シート名).Activate Range("A1:A6").CurrentRegion.Select With Selection 事業部範囲 = .Cells(1, 1).Address & ":" & .Cells(6, 1).Address End With ComboBox2.RowSource = シート名 & "!" & 事業部範囲 Case 1 Worksheets(シート名).Activate Range("A7:A11").CurrentRegion.Select With Selection 事業部範囲 = .Cells(7, 1).Address & ":" & .Cells(11, 1).Address End With ComboBox2.RowSource = シート名 & "!" & 事業部範囲 Case 2 Worksheets(シート名).Activate Range("A12:A15").CurrentRegion.Select With Selection 事業部範囲 = .Cells(12, 1).Address & ":" & .Cells(15, 1).Address End With ComboBox2.RowSource = シート名 & "!" & 事業部範囲 Case 3 Worksheets(シート名).Activate Range("A16:A25").CurrentRegion.Select With Selection 事業部範囲 = .Cells(16, 1).Address & ":" & .Cells(25, 1).Address End With ComboBox2.RowSource = シート名 & "!" & 事業部範囲 End Select End With End Sub '---4--TextBox2に値代入-------------------- Private Sub ComboBox2_Click() Dim si As Integer With UserForm1 .ComboBox2.Text = "" si = .ComboBox2.ListIndex ' ComboBox2 の何番目が選択されたかを得る Select Case si Case 0 ' 0番が選択されていたらComboBox2 の内容 Range("A1:A6") シート名 = "事業部名" Worksheets(シート名).Activate Range("A1:B6").CurrentRegion.Select With Selection 事業部範囲 = .Cells(1, 2).Address & ":" & .Cells(6, 2).Address End With '行 = ComboBox2.ListIndex + 1 TextBox2.Text = Worksheets(シート名).Cells(事業部範囲, 2) Case 1 Case 2 Case 3 End Select End With End Sub '----5-Close-------------------- Private Sub UserForm_Deacti Unload UserForm1 End Sub

専門家に質問してみよう