アプリ版:「スタンプのみでお礼する」機能のリリースについて

コンボボックスの一部のアイテムが
選択不可能な状態となるコンボボックスを作成したいのです。
以下のような感じです。

コンボボックス▼
----果物----
りんご
バナナ
----野菜----
キャベツ
にんじん

コンボボックスの▼部分をクリックすると
リストが出てくるようなイメージです。
この[----果物----]と[----野菜----]の欄は
選択しクリックしてもリストを閉じずに無反応な状態にしたいのです。
WordやExcel2007のフォント選択ダイアログ内の
[テーマのフォント]、[すべてのフォント]部分に近いイメージです。

変更時に来るイベントでどうにかしようとしましたがうまくできず、
コンボボックスクラスを自作すれば出来るのかなと思いますが、
いまいちどうして良いかわからないです。
VC++2005でMFCを使っています(CComboBox)

わかる方がいらっしゃいましたらお教え頂ければ幸いです。

A 回答 (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 を返します。
}
    • good
    • 0
この回答へのお礼

返事遅くなり申し訳ありません。

わたし自身C++自体あまりわかっていない状態で、
回答頂けても理解できるかどうか不安でしたが、
ここまで詳細に書いていただけるとは思ってもおらず、
大変参考になりました。
思っていたとおりに動作させることも出来ました。

動作上仕組みがわからない部分もあり
理解する必要はありますが、
これを元に発展させて行けそうです。

どうもありがとうございました。

お礼日時:2009/12/16 20:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A