LVS_EX_FULLROWSELECTが効かない

このQ&Aのポイント
  • LVS_EX_FULLROWSELECTを指定してもリストコントロールの一行選択ができない理由は何でしょうか?
  • CXXXXXXクラスのOnInitDialog関数内で、ListView_SetExtendedListViewStyle関数にLVS_EX_FULLROWSELECTを指定していますが、効果がありません。
  • プロパティページに貼り付けたリストコントロールでLVS_EX_FULLROWSELECTを使いたいのですが、うまくいきません。
回答を見る
  • ベストアンサー

LVS_EX_FULLROWSELECTが効かない

LVS_EX_FULLROWSELECTをリストコントロールに指定して、一行選択をしたいのですが、なぜか効きません。なぜでしょうか? ソース---------------- BOOL CXXXXXX::OnInitDialog() { CPropertyPage::OnInitDialog(); ListView_SetExtendedListViewStyle( m_LIST.m_hWnd , LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT | LVS_EX_ONECLICKACTIVATE | LVS_EX_UNDERLINEHOT ); ・・・・・ } プロパティページ内にリストコントロールを貼り付けて使っています。 よろしくお願いします。

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

  • ベストアンサー
  • taku2888
  • ベストアンサー率60% (15/25)
回答No.3

ウィンドウが表示された直後で何もしなければ フォームにフォーカスがあたってる可能性が一番ですか・・ なので、OnInitDialog() の後ろの方で ListView.SetFocus(); してみたらいかがですか。

その他の回答 (2)

  • taku2888
  • ベストアンサー率60% (15/25)
回答No.2

カーソルキーの「↑」「↓」動かしてセルが移動できれば Focusがあたってます。 NM_SETFOCUSとか通っても最終どうなってるのか不明です。

w0a15455
質問者

補足

ご指摘ありがとうございます。 カーソルキーの「↑」「↓」動かしてみましたが、移動しませんでした。 これは、フォーカスが当たっていないってことですよね。 なぜ、こうなるのでしょうか? 回避方法を探してみます。

  • taku2888
  • ベストアンサー率60% (15/25)
回答No.1

どの様な仕様か不明ですが、 LVS_EX_FULLROWSELECTは、そのリストコントロールにフォーカスが当たっていないと機能しないと思われますが。 その条件でもダメでしょうか。

w0a15455
質問者

お礼

返事が遅くなって、申し訳ありません。 出張に出てしまって。 NM_SETFOCUSで、フォーカスが当たっているのを確認したのですが、 ここは、通っているので、フォーカスは、当たっていると判断しました。 もう少し調べてみます。

関連するQ&A

  • リストビューで選択行の背景を変える

    お世話になります。リストビューの選択行の背景色を変えたいと思い、カスタムドローを用い以下のようにしましたが、選択していない所も赤になってしまいます。 if (lplvcd->nmcd.dwDrawStage == CDDS_ITEMPREPAINT) {  // 選択行の背景色を変更  if (lplvcd->nmcd.uItemState & CDIS_SELECTED) {   lplvcd->clrTextBk = RGB(255, 0, 0);   lplvcd->nmcd.uItemState &= ~CDIS_SELECTED;  } else {   lplvcd->clrTextBk = RGB(255, 255, 255);  }  return CDRF_NOTIFYSUBITEMDRAW; } デバッグモードで見ると、else以降の分は解釈されていないようです。 リストビューは g_hList = CreateWindowEx(0 , WC_LISTVIEW , 0 , WS_CHILD | WS_VISIBLE | LVS_REPORT | LVS_NOSORTHEADER | LVS_SHOWSELALWAYS, 1 , 1 , width , lv_height , g_hMain , (HMENU)1 , g_hInst , NULL); dwStyle = ListView_GetExtendedListViewStyle(g_hList); dwStyle |= LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT | LVS_EX_SUBITEMIMAGES; ListView_SetExtendedListViewStyle(g_hList, dwStyle); ListView_SetBkColor(g_hList, RGB(240,240,240)); のようにしています。宜しくお願いします

  • EXCELのListViewコントロールの使用について

    こんにちは。 EXCELでUSERFORMを作成しListViewコントロール を貼り付けたのですが、ColumnHeadersプロパティで ヘッダーを挿入したりGridlinesプロパティをTRUEに してもコントロールには何も変化が見られません。 EXCELではListViewコントロールは使えないので しょうか。 なんとかして使用したいので使用方法をご存知の方 ご教授お願いします。

  • VB6 API LISTVIEW(チェックボックス付き)にチェックを付けたい

    CreateWindowExでLISTVIEW(チェックボックス付きのレポートビュー)を作ったのですが、「山田花子」行にソースでチェックを付ける方法が分かりません。 Form1のソース ↓ Option Explicit Private Sub Form_Load() Dim lngRet As Long Dim lvcol As LV_COLUMN Dim rStyle As Long Dim item As LV_ITEM '-- リストビューの作成 hList = CreateWindowEx(WS_EX_CLIENTEDGE, _ WC_LISTVIEW, "", _ WS_CHILD Or WS_VISIBLE Or WS_BORDER Or _ WS_CLIPSIBLINGS Or WS_CLIPCHILDREN Or _ LVS_REPORT, _ 0&, 0&, Me.ScaleWidth / Screen.TwipsPerPixelX, 200&, _ Me.hwnd, _ 0&, _ App.HINSTANCE, _ ByVal 0&) '拡張スタイルを設定 rStyle = rStyle Or LVS_EX_FULLROWSELECT Or LVS_EX_GRIDLINES Or LVS_EX_CHECKBOXES SendMessageByNum hList, LVM_SETEXTENDEDLISTVIEWSTYLE, 0&, rStyle '-- カラムヘッダーの追加 With lvcol .mask = LVCF_FMT Or LVCF_WIDTH Or LVCF_TEXT Or LVCF_SUBITEM .fmt = LVCFMT_LEFT .cx = 100 .pszText = "名前" .iSubItem = 0 lngRet = ListView_InsertColumn(hList, 0&, lvcol) End With '-- リストアイテムの追加 With item .mask = LVIF_TEXT Or LVIF_IMAGE ' 1つめ .pszText = "山田 太郎" .iItem = 0 .iSubItem = 0 .iImage = 0 lngRet = ListView_InsertItem(hList, item) ' 2つめ .pszText = "山田 花子" .iItem = 1 .iSubItem = 0 .iImage = 1 lngRet = ListView_InsertItem(hList, item) End With End Sub Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) '-- リストビューを破棄 DestroyWindow hList End Sub 標準モジュールは補足に書きます

  • [Excel]複数選択可能なリストビューは?

    Excel 2007を使っています ユーザーフォームで、ListView(Microsoft ListView Control 6.0)を つかっていますが、複数選択できなくてこまっています。 リストボックスのfmMultiSelectExtendedみたいな 使い方をしたいのですが、何かいい方法はありませんか?

  • CreateWindowEx のウィンドウスタイルが反映されないのですが・・・

    CreateWindowEx のウィンドウスタイルが反映されないのですが・・・ VC++6.0 の SDK にて、ウィンドウを表示するプログラムを作成中なのですが、 スタイルが思うように反映されません。なぜなのでしょうか。 hList = CreateWindowEx( 0,      WC_LISTVIEW, "",       WS_CHILD | WS_VISIBLE |//猫でもわかる ~ によるうとデフォルトで必要らしい      WS_EX_CLIENTEDGE |   // 縁が沈んで見える境界線を持ちます。→ 持ちません      WS_EX_ACCEPTFILES |  // ドラッグ&ドロップを受けるとあるが、テキストをドロップしても×マーク      WS_EX_RIGHTSCROLLBAR | // 右スクロールバーが出るはずなのに・・・      LVS_REPORT,       // カラムのタイトル      0, 0, 0, 0,      hWnd,      (HMENU)LISTVW_HI_1,      hInst,      NULL);

  • 最適なコントロールは??

    お世話になっております。 現在、ExcelVBAで、シート上のある情報を、フォーム上のListViewコントロールに移し、時間と共に上から反転(選択状態)となるコーティングをしています。 (例:↓リスト[ListViewコントロール]) 名前1 , 0:05 名前2 , 0:03 名前3 , 0:10 ・・・ ↑この場合、「スタート」ボタンを押すと同時に、5秒経つと「名前1」の行が、さらにそこから3秒経つと「名前2」の行が選択状態になるといった代物です。 ここで例えば「名前2」のListItemと「名前3」のListItemのリストの順番を逆にしようとした場合、選択した瞬間に、今まで選択状態だったものが解けてしまいます。おまけにこのListViewコントロールはセルのバックカラーを変更することもできません。 説明が長くなってしまったのですが、同じようなコントロールで、「FlexGrid」・「DataGrid」・「DataList」等いろいろありますが、セルのバックカラーを自由に変えれるコントロールはありますでしょうか?もしくはこれらのコントロールの使用方法等を記載したサイト等を教えていただけないでしょうか?いろいろ探してはみたのですがなかなか見つかりません。よろしくお願いします。

  • リストビューのカスタムドローについて

    Windows XP SP3 + Visual Studio 2008 C++ で、リストビューを使用したダイアログベースのソフトを作っています。 リストビューには、ファイル名、ファイルサイズ、最終更新日時を「詳細」で表示させています。(よくあるファイル一覧です。) エクスプローラと同じように、ファイル名等のテキストを NTFS の圧縮ファイルは青 暗号化ファイルは緑 で表示させようと思い、カスタムドローを使用しています。 また、圧縮でもなく暗号化でもないファイルに対しては、ChooseFont() で選択された色 ( CHOOSEFONT 構造体の rgbColors ) を設定しています。 ChooseFont() で選択した色のうち、濃紺以外の色は問題なく表示されているのですが、なぜか、ChooseFont で濃紺 ( 0x00800000 ) を選択した場合だけ、第一列 ( ファイル名 ) のみ濃紺になり、第二列目以降 ( ファイルサイズ、最終更新日時 ) が、システム設定値 ( 黒 ) となります。 しかも、リストビューのスタイルを拡張スタイルの LVS_EX_FULLROWSELECT ( 行選択モード? ) にすると、濃紺の場合でも、第二列目以降も正常に表示されます。 コーディングは、カスタムドローの部分だけを抜粋すると以下のような感じになっています。 LPNMLVCUSTOMDRAW pnmlvcd; LVITEM lvi; DWORD dwAttributes; switch( message ) { case NM_CUSTOMDRAW:   pnmlvcd = ( LPNMLVCUSTOMDRAW )lParam;   switch( pnmlvcd->nmcd.dwDrawStage ) {   case CDDS_PREPAINT:     SetWindowLong( hwndMain, DWL_MSGRESULT, ( LONG )CDRF_NOTIFYITEMDRAW );     return( TRUE );   case CDDS_ITEMPREPAINT:     lvi.mask = LVIF_PARAM;     lvi.iSubItem = 0;     lvi.iItem = pnmlvcd->nmcd.dwItemSpec; // 描画しようとしている行のインデックス     if( ListView_GetItem( hwndList, &lvi ) ) {       // 属性を取得       // lvi.lParam はファイルの情報を格納した構造体 FILEITEM へのポインタです。       dwAttributes = ( ( PFILEITEM )lvi.lParam )->dwAttributes;       if( 通常ファイルの場合 ) {  // dwAttributes を使用して属性を判定         // ChooseFont で選択した色を設定         pnmlvcd->clrText = cfList.rgbColors;         SetWindowLong( hwndMain, DWL_MSGRESULT, ( LONG )CDRF_DODEFAULT );         return( TRUE );       } else if( 圧縮ファイルの場合 ) {  // dwAttributes を使用して属性を判定         // 青         pnmlvcd->clrText = RGB( 0, 0, 0xff );         SetWindowLong( hwndMain, DWL_MSGRESULT, ( LONG )CDRF_DODEFAULT );         return( TRUE );       } else if( 暗号化ファイルの場合 ) {  // dwAttributes を使用して属性を判定         // 緑         pnmlvcd->clrText = RGB( 0, 0xff, 0 );         SetWindowLong( hwndMain, DWL_MSGRESULT, ( LONG )CDRF_DODEFAULT );         return( TRUE );       }     }   }   break; hwndMain はダイアログのウィンドウハンドル、hwndList はリストビューのウィンドウハンドルです。 (見やすくするため、スペースに全角スペースを使用しています。また、属性の判定部分は実際には dwAttributes との、&、| を使用しています。) コーディング的には、ChooseFont() で何色が選択されようが知ったこっちゃないという感じなのですが・・・。 試しに、ChooseFont() で選択した色ではなく、RGB( 0, 0, 0x80 ) を指定しても同様の現象でした。 濃紺の場合でも、LVS_EX_FULLROWSELECT でなくても第二列目以降が正しい色で表示されるようにする方法はないでしょうか。 このリストビューは Drag & Drop のソース側の機能も実装していまして、その影響で、LVS_EX_FULLROWSELECT だと、Drag 操作による複数行選択の操作が難しくなるので、LVS_EX_FULLROWSELECT は避けたいと考えています。 あるいは、上記のコーディングで、何かおかしいんじゃないかという部分がありましたら教えていただけませんでしょうか。 よろしくお願いします。

  • CListCtrlのcheckboxサイズ変更

    WindowsCE、MFC、C++で実装しています。 CListCtrlで表を作成し、 下記の方法でチェックボックスを表示させました。 CListCtrl m_list; m_list.SetExtendedStyle((m_lstCheck.GetExtendedStyle()|LVS_EX_CHECKBOXES)); チェックボックス(画像参照)のサイズを大きくしたいのですが、 方法がわかりません。 (SetFont()関数で試してみましたが、文字にしか反映されませんでした。)

  • リストビューにフォーカスを設定するには

    開発環境はVC++6.0、SDK、Windows2000です。 CreateWindowEx( 0, WC_LISTVIEW, "", WS_CHILD | WS_VISIBLE | WS_TABSTOP | LVS_REPORT | LVS_SINGLESEL, 10, 10, 515, 271, hdwnd, (HMENU)100, hInstance, NULL); 上記APIでリストビューを表示しているのですが、表示直後には先頭ラインにフォーカスが設定されません。 当然表示された後にマウス操作にてラインをクリックするとフォーカスがあたるのですが、 表示された直後に指定行にフォーカスをあてたい場合にはどうすればよいでしょうか? ご存知の方ご教授お願いします。

  • ツリービューで、起動時にチェックを入れたい

    またまた教えてください。 mfcのツリービューにて、チェックボックスを設け、 起動時にチェックを入れたいのですが、チェックが入りません。 BOOL CtreeTestDlg::OnInitDialog() { CDialogEx::OnInitDialog(); … // TODO: 初期化をここに追加します。 HTREEITEM h1 = m_tree.InsertItem(_T("TEST"), TVI_ROOT); m_tree.SetCheck(h1); return TRUE; // フォーカスをコントロールに設定した場合を除き、TRUE を返します。 } ボタンクリック時では問題がありません。 UpdateData等も入れたりしたのですが、ダメでした。 vs2010,2013両方でダメです。 なにかよい方法がないでしょうか? よろしくお願い致します。

専門家に質問してみよう