• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:コンボボックスの一部のアイテムを選択不可能に)

コンボボックスの一部のアイテムを選択不可能に

このQ&Aのポイント
  • コンボボックスの一部のアイテムが選択不可能な状態となるコンボボックスを作りたいです。
  • リストを閉じずに無反応な状態にしたいです。
  • VC++2005でMFCを使っています。コンボボックスクラスを自作すればできるのかなと思ってますが、具体的な方法がわかりません。

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

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

 こんにちは。  ドロップダウンのリストボックスをサブクラス化して、クリックを許したくない場所で、メッセージを元のプロシージャへ渡すのを止めれば出来ます。  本来はMFCにおけるサブクラス化の手法を利用した方が良いのですが、時間が無いのでwin32ライクに書いています。以下参考程度に。 WNDPROC m_listProcOrg = NULL; //ドロップダウンリストのプロシージャ LRESULT CALLBACK ListProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_LBUTTONDOWN: { LRESULT lItemIndex = ::SendMessage(hWnd, LB_ITEMFROMPOINT, 0, lParam); //アイテムの範囲外なのでブレーク if(lItemIndex == -1) break; //マークが無いのでブレーク BOOL bMark = ::SendMessage(hWnd, LB_GETITEMDATA, lItemIndex, 0); if(bMark == 0) break; } //マークがあった場合ココで打ち止め return 0; case WM_LBUTTONDBLCLK: //ダブルクリック時も打ち止めにしないとマウスの挙動がおかしくなる return 0; } return ::CallWindowProc(m_listProcOrg, hWnd, uMsg, wParam, lParam); } BOOL CTestAppDlg::OnInitDialog() { // TODO: 初期化をここに追加します。 CComboBox* pCombo = static_cast<CComboBox*>(this->GetDlgItem(IDC_COMBO1)); pCombo->AddString(TEXT("---果物---")); pCombo->SetItemData(0, 1);//果物のアイテムデータにマークする pCombo->AddString(TEXT("リンゴ")); pCombo->AddString(TEXT("バナナ")); pCombo->AddString(TEXT("---野菜---")); pCombo->SetItemData(3, 1);//野菜のアイテムデータにマークする pCombo->AddString(TEXT("キャベツ")); pCombo->AddString(TEXT("ニンジン")); //コンボボックスからドロップダウンリストのハンドルを取る COMBOBOXINFO cbi = {sizeof(cbi)}; pCombo->GetComboBoxInfo(&cbi); //ドリップダウンリストをサブクラス化 LONG listProcOrg = ::SetWindowLong(cbi.hwndList, GWL_WNDPROC, reinterpret_cast<LONG>(&::ListProc)); m_listProcOrg = reinterpret_cast<WNDPROC>(listProcOrg); return TRUE; // フォーカスをコントロールに設定した場合を除き、TRUE を返します。 }

kuratmasat
質問者

お礼

返事遅くなり申し訳ありません。 わたし自身C++自体あまりわかっていない状態で、 回答頂けても理解できるかどうか不安でしたが、 ここまで詳細に書いていただけるとは思ってもおらず、 大変参考になりました。 思っていたとおりに動作させることも出来ました。 動作上仕組みがわからない部分もあり 理解する必要はありますが、 これを元に発展させて行けそうです。 どうもありがとうございました。

関連するQ&A

専門家に質問してみよう