none
CListCtrlのラベル編集開始時、CEditの選択範囲変更について RRS feed

  • 質問

  • お世話になります。

    既出かもしれませんが、

    私では検索しても該当するものが見つけることができず、

    質問させて頂きます。

     

    CListCtrlのラベル編集開始時(LVN_BEGINLABELEDIT)に

    エディット内の選択範囲をを変えたいのですが、XPでは選択範囲が変更されません。

    (Vistaでは変更されます)

     

    選択範囲の変更は、以下のようなタイミングでCEdit::SetSelを使用しました。

    ・LVN_BEGINLABELEDIT時に、エディットにテキストを設定し、CEdit::SetSelを呼ぶ。

    ・CListCtrlのエディットをサブクラス化し、サブクラスのWM_SETFOCUS時に、CEdit::SetSelを呼ぶ。

    どちらの方法でも、Vistaは選択範囲が変更されるのですが、XPでは変更されません。

    できればCListCtrlのCEditをそのまま使用したいのですが、

    何か方法はあるのでしょうか?

     

    ※開発環境は、VC2010(評価版)です。

     (VC2005でも試しましたが、同様の結果でした)

     

    2010年8月19日 2:10

回答

  • サブクラス化してますが、XPで普通にできてます。手元にリストビューのソースしかないですが、
    タイミングはON_NOTIFY_REFLECT( NM_CLICK,  OnNMClick)で、

    CEdit * edit = m_pListCtrl->EditLabel( idx_Item);// アイテムの編集を指示する
    // アイテムカラム位置にEditを移動(省略)
    m_Edit.SubclassWindow( edit->m_hWnd);
    m_Edit.SetWindowText( "編集対象テキスト");
    m_Edit.SetSel( MAKELONG( 0, -1));

    EditLabel()時にLVN_BEGINLABELEDITが発行されるので、
    ご提示のタイミングとは異なるんですけどね(vv;)。

    • 回答としてマーク target_3to4 2010年8月19日 9:12
    2010年8月19日 3:36

すべての返信

  • サブクラス化してますが、XPで普通にできてます。手元にリストビューのソースしかないですが、
    タイミングはON_NOTIFY_REFLECT( NM_CLICK,  OnNMClick)で、

    CEdit * edit = m_pListCtrl->EditLabel( idx_Item);// アイテムの編集を指示する
    // アイテムカラム位置にEditを移動(省略)
    m_Edit.SubclassWindow( edit->m_hWnd);
    m_Edit.SetWindowText( "編集対象テキスト");
    m_Edit.SetSel( MAKELONG( 0, -1));

    EditLabel()時にLVN_BEGINLABELEDITが発行されるので、
    ご提示のタイミングとは異なるんですけどね(vv;)。

    • 回答としてマーク target_3to4 2010年8月19日 9:12
    2010年8月19日 3:36
  • 仲澤@失業者 様

    ご回答ありがとうございます。

     

    ご提示のソースを見る限り、

    EditLabelで行なわれる処理やイベントの終了後、

    CEdit::SetSelをすれば、正しく選択できるようですね。

     

    現在の私の方法は、明示的にEditLabelを呼んでおらず

    リストにLVS_EDITLABELS を指定していますので、

    クリック時に自動的にラベルの編集が開始されてしまいます。

    その辺りの処理を修整・確認し、またご報告させて頂きます。

     

    • 回答としてマーク target_3to4 2010年8月19日 9:12
    • 回答としてマークされていない target_3to4 2010年8月19日 9:12
    2010年8月19日 4:17
  • 確認が遅くなりましたが、ご報告致します。

    仲澤@失業者 様の提示の通り、

    CListCtrl::EditLabelを明示的に呼び、

    その後、EditLabelで取得したCEditに対して

    SetSelをすれば、意図した通りテキストが選択できました。

     

    LVN_BEGINLABELEDIT 時に、CEdit::SetSelが

    XPでは機能してくれない理由は分かりませんが、

    回避する方法が分かりましたので、解決とさせて頂きます。

     

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

     

    ※追記

    同じアイテムが2回目以降クリックされた場合、ラベルの編集開始したかったため、

     (エクスプローラと同じような方法)

    リストのスタイルに、LVS_EX_TWOCLICKACTIVATE を追加し、

    LVN_ITEMACTIVATEで、EditLabelやSetSelを呼ぶことで解決しました。

     ※どうやら LVS_EX_TWOCLICKACTIVATE や LVS_EX_ONECLICKACTIVATE をスタイルに追加すると、ラベル編集は自動で開始されなくなるみたいです。

     

     

    2010年8月19日 9:12