コンボボックスの一部のアイテムが
選択不可能な状態となるコンボボックスを作成したいのです。
以下のような感じです。
コンボボックス▼
----果物----
りんご
バナナ
----野菜----
キャベツ
にんじん
コンボボックスの▼部分をクリックすると
リストが出てくるようなイメージです。
この[----果物----]と[----野菜----]の欄は
選択しクリックしてもリストを閉じずに無反応な状態にしたいのです。
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も見ています
-
風水の観点で選ぶ観葉植物とは?置き場所や上げたい運気ごとの注意点を紹介!
観葉植物で運気をアップするコツを、風水デザイン1級建築士の福島昌彦さんに伺った。
-
コンボボックスの特定項目だけを選択不可に
Visual Basic(VBA)
-
複数のコンボボックスの項目の表示/非表示について(VB6.0)
Visual Basic(VBA)
-
CloseとDisposeの違い
Visual Basic(VBA)
-
-
4
MFCでコンボボックスを選択不可状態にしたい
C言語・C++・C#
-
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#/Java?】try-catchでcatchせずにfinallyは一般的?
その他(プログラミング・Web制作)
-
10
C#にて別クラスの関数を使いたい
C言語・C++・C#
-
11
配列を使わずに、変数名を動的にループで回したい
C言語・C++・C#
-
12
DataGrdViewに関連付けたデータの更新
C言語・C++・C#
-
13
DateTimePickerでに年月までしか選択できないようにしたいです。
Visual Basic(VBA)
-
14
C# Form上に配置されたコントロールに重なるように透過GIF(PNG)を表示したい
C言語・C++・C#
-
15
CSVファイルの中で、「 , 」カンマを使いたい
その他(コンピューター・テクノロジー)
-
16
コントロールを移動できない
Visual Basic(VBA)
-
17
VB.net 任意の例外を発生させるには・・・
Visual Basic(VBA)
-
18
DataGridView 列ごとの入力制限
Visual Basic(VBA)
-
19
フルパスから最後のディレクトリ名を取得したい。
Visual Basic(VBA)
-
20
DataGridViewのセル編集完了後に値を設定するには
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
フォントの大きさ
-
コンボボックス内の文字サイズ変更
-
VBAのフォント変更(エクセルか...
-
ドロップダウンリストのフォン...
-
VB.NET2005 TextBox 高さ(Heig...
-
Msgboxで使用するフォントの指...
-
VBA TEXTBOXテキストボックスの...
-
文字色 エクリプス
-
チェックボックスの箱のサイズ...
-
リソースエディタでスタティッ...
-
コンボボックスの一部のアイテ...
-
エディットボックスのフォント...
-
エクセルのシート名のフォント...
-
C# のフォームデザイン&レイア...
-
EDITBOXに関して
-
static 文字が上に張り付いて・...
-
文字回転
-
カレンダーコントロールとサイ...
-
チェックボックスの文字サイズ...
-
GetTextExtentPoint32での高さ
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
フォントの大きさ
-
コンボボックス内の文字サイズ変更
-
VBAのフォント変更(エクセルか...
-
ドロップダウンリストのフォン...
-
チェックボックスの箱のサイズ...
-
VB.NET2005 TextBox 高さ(Heig...
-
エディットボックスのフォント...
-
VBA TEXTBOXテキストボックスの...
-
コンボボックスの一部のアイテ...
-
リソースエディタでスタティッ...
-
文字色 エクリプス
-
JTableのヘッダー文字のサイズ変更
-
JakaraPOI セル内部のフォント...
-
VBにて指定した通りにExcelの列...
-
Eclipseで修正したファイル名の...
-
プロポーショナルフォントの文...
-
Msgboxで使用するフォントの指...
-
ワードでコントロールツールボ...
-
WPFのフォントカラー変更につい...
-
エディットの文字サイズ変更
おすすめ情報