コンボボックスの一部のアイテムが
選択不可能な状態となるコンボボックスを作成したいのです。
以下のような感じです。
コンボボックス▼
----果物----
りんご
バナナ
----野菜----
キャベツ
にんじん
コンボボックスの▼部分をクリックすると
リストが出てくるようなイメージです。
この[----果物----]と[----野菜----]の欄は
選択しクリックしてもリストを閉じずに無反応な状態にしたいのです。
WordやExcel2007のフォント選択ダイアログ内の
[テーマのフォント]、[すべてのフォント]部分に近いイメージです。
変更時に来るイベントでどうにかしようとしましたがうまくできず、
コンボボックスクラスを自作すれば出来るのかなと思いますが、
いまいちどうして良いかわからないです。
VC++2005でMFCを使っています(CComboBox)
わかる方がいらっしゃいましたらお教え頂ければ幸いです。
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 を返します。
}
返事遅くなり申し訳ありません。
わたし自身C++自体あまりわかっていない状態で、
回答頂けても理解できるかどうか不安でしたが、
ここまで詳細に書いていただけるとは思ってもおらず、
大変参考になりました。
思っていたとおりに動作させることも出来ました。
動作上仕組みがわからない部分もあり
理解する必要はありますが、
これを元に発展させて行けそうです。
どうもありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) コンボボックス及びリストボックスを5段階連動させる方法をご存知の方ご教授頂きたいです。 Excelで 3 2022/04/03 21:43
- Excel(エクセル) Excel コンボボックス バックカラー 1 2023/02/18 08:06
- SQL Server DBのテーブルの設計ができず困っています。 2 2023/06/29 16:43
- Visual Basic(VBA) VBA ComboBoxについて 2 2022/10/21 12:15
- Visual Basic(VBA) ExcelVBA ドロップボックスで月を選択するとそれ以降のデータが残るようにしたい。 3 2022/12/16 14:53
- Access(アクセス) Accessにインポートした複数のテーブルを表示させる方法が分かりません。 1 2023/01/30 20:22
- Illustrator(イラストレーター) Illustrator アンカーポイント選択について 3 2023/01/30 12:31
- その他(パソコン・スマホ・電化製品) エクセル初心者です。 仕事でエクセルを使っていて、普段は素人でもできる簡単な関数を使ったことがある程 1 2022/05/25 11:17
- その他(セキュリティ) 特定のWEBページのフリーズ AMAZONサイト PC側? ネットワーク? サイトに問題? 1 2023/01/30 16:23
- Excel(エクセル) Excelに文字データのみを貼り付けたい 8 2023/05/03 15:38
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
コンボボックスの特定項目だけを選択不可に
Visual Basic(VBA)
-
複数のコンボボックスの項目の表示/非表示について(VB6.0)
Visual Basic(VBA)
-
MFCでコンボボックスを選択不可状態にしたい
C言語・C++・C#
-
-
4
CloseとDisposeの違い
Visual Basic(VBA)
-
5
C# ReadOnlyのTextBoxで
C言語・C++・C#
-
6
C# dataGridViewの値だけクリア
C言語・C++・C#
-
7
Form_Load と Form_Activate のタイミング
Visual Basic(VBA)
-
8
FORMが開いているかどうかの確認方法
Visual Basic(VBA)
-
9
配列を使わずに、変数名を動的にループで回したい
C言語・C++・C#
-
10
DataGrdViewに関連付けたデータの更新
C言語・C++・C#
-
11
DateTimePickerでに年月までしか選択できないようにしたいです。
Visual Basic(VBA)
-
12
C# Form上に配置されたコントロールに重なるように透過GIF(PNG)を表示したい
C言語・C++・C#
-
13
コントロールを移動できない
Visual Basic(VBA)
-
14
CSVファイルの中で、「 , 」カンマを使いたい
その他(コンピューター・テクノロジー)
-
15
型 varchar から型 numeric への変換エラー。
その他(データベース)
-
16
文字列をsplitするSQL文を教えて下さい
SQL Server
-
17
VB.net 任意の例外を発生させるには・・・
Visual Basic(VBA)
-
18
別フォームから戻ったときのイベント
Visual Basic(VBA)
-
19
DataGridViewのセル編集完了後に値を設定するには
Visual Basic(VBA)
-
20
DataGridView 列ごとの入力制限
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAのフォント変更(エクセルか...
-
フォントの大きさ
-
コンボボックスの一部のアイテ...
-
コンボボックス内の文字サイズ変更
-
Eclipseで修正したファイル名の...
-
VB.NET2005 TextBox 高さ(Heig...
-
VBA TEXTBOXテキストボックスの...
-
チェックボックスの箱のサイズ...
-
PCで「使用可能な場合はグラフ...
-
グラフの交点の求め方(Excel)
-
マインクラフト(pc版)で座標...
-
「アイテムは収集されました」...
-
エクセルで作った新しいウイン...
-
作成したウインドウのサイズを...
-
gnuplotで3次元の円
-
ゲームでは結局どっちが良いの?
-
コントロールの書式設定で、“コ...
-
pythonでふたつのアニメーショ...
-
NVIDIAのシェーダーキャッシュ
-
C# ボタンコントロール内で文字...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
フォントの大きさ
-
コンボボックス内の文字サイズ変更
-
VBAのフォント変更(エクセルか...
-
ドロップダウンリストのフォン...
-
チェックボックスの箱のサイズ...
-
VB.NET2005 TextBox 高さ(Heig...
-
エディットボックスのフォント...
-
VBA TEXTBOXテキストボックスの...
-
コンボボックスの一部のアイテ...
-
リソースエディタでスタティッ...
-
文字色 エクリプス
-
JTableのヘッダー文字のサイズ変更
-
JakaraPOI セル内部のフォント...
-
VBにて指定した通りにExcelの列...
-
Eclipseで修正したファイル名の...
-
プロポーショナルフォントの文...
-
Msgboxで使用するフォントの指...
-
ワードでコントロールツールボ...
-
WPFのフォントカラー変更につい...
-
エディットの文字サイズ変更
おすすめ情報