windows - Aktiverer CListCtrl markeringsvalg

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg bruger en MFC CListCtrl i rapportmodus og aktiveret valg i fuld række og alfa-blended markeringsvalg via


const DWORD extendedStyle = m\_wndList.GetExtendedStyle();
m\_wndList.SetExtendedStyle(extendedStyle | LVS\_EX\_DOUBLEBUFFER | LVS\_EX\_FULLROWSELECT);


Markeringsvalg, dvs. spænder et markeringsrektangel på tværs af flere elementer, mens du holder venstre museknap, fungerer, hvis jeg starter markeringen i området af vinduet CListCtrl, som ikke er optaget af elementer.


Men hvis jeg klikker på et element og vil starte markeringsvalg derfra, er valgrektangel ikke oprettet. Dette er i modsætning til for eksempel Windows Stifinder, hvor markeringsvalg også fungerer, hvis det startes fra et valgt element.


Som MCVE har jeg brugt 'Nyt projektguiden' på Visual Studio 2017 og oprettet en dialogbaseret MFC-applikation og placeret en 'List Control' på dialogressursressourcerne. Denne listekontrol er ledet til en medlemsvariabel CListCtrl m\_wndList]] via DDX og får de udvidede stilarter som nævnt ovenfor.


ListScroll.h


#pragma once

#ifndef \_\_AFXWIN\_H\_\_
   #error "include 'stdafx.h' before including this file for PCH"
#endif

#include "resource.h"

class CListScrollApp : public CWinApp
{
public:
   CListScrollApp();

public:
   virtual BOOL InitInstance();
   virtual int ExitInstance();

   DECLARE\_MESSAGE\_MAP()
};

extern CListScrollApp theApp;


ListScroll.cpp


#include "stdafx.h"
#include "ListScroll.h"
#include "ListScrollDlg.h"

#ifdef \_DEBUG
#define new DEBUG\_NEW
#endif

BEGIN\_MESSAGE\_MAP(CListScrollApp, CWinApp)
END\_MESSAGE\_MAP()

CListScrollApp::CListScrollApp() {}

CListScrollApp theApp;

BOOL CListScrollApp::InitInstance() {
   CWinApp::InitInstance();

   CListScrollDlg dlg;
   m\_pMainWnd = &dlg;
   INT\_PTR nResponse = dlg.DoModal();
   if (nResponse == IDOK) {
      // Do nothing
   } else if (nResponse == IDCANCEL) {
      // Do nothing
   } else if (nResponse == -1) {
      TRACE(traceAppMsg, 0, "Warning: dialog creation failed, so application is terminating unexpectedly.
");
   }

   return FALSE;
}

int CListScrollApp::ExitInstance() {
   return CWinApp::ExitInstance();
}


ListScrollDlg.h


#pragma once
#include "afxcmn.h"

class CListScrollDlg : public CDialog
{
public:
   CListScrollDlg(CWnd* pParent = NULL);

#ifdef AFX\_DESIGN\_TIME
   enum { IDD = IDD\_LISTSCROLL\_DIALOG };
#endif

protected:
   virtual void DoDataExchange(CDataExchange* pDX);
   virtual BOOL OnInitDialog();
   DECLARE\_MESSAGE\_MAP()

private:
   CListCtrl m\_wndList;
};


ListScrollDlg.cpp


#include "stdafx.h"
#include "ListScroll.h"
#include "ListScrollDlg.h"

#ifdef \_DEBUG
#define new DEBUG\_NEW
#endif

CListScrollDlg::CListScrollDlg(CWnd* pParent /*=NULL*/)
   : CDialog(IDD\_LISTSCROLL\_DIALOG, pParent)
{}

void CListScrollDlg::DoDataExchange(CDataExchange* pDX) {
   CDialog::DoDataExchange(pDX);
   DDX\_Control(pDX, IDC\_LIST1, m\_wndList);
}

BEGIN\_MESSAGE\_MAP(CListScrollDlg, CDialog)
END\_MESSAGE\_MAP()

BOOL CListScrollDlg::OnInitDialog() {
   CDialog::OnInitDialog();

   const DWORD extendedStyle = m\_wndList.GetExtendedStyle();
   m\_wndList.SetExtendedStyle(extendedStyle | LVS\_EX\_DOUBLEBUFFER | LVS\_EX\_FULLROWSELECT);

   m\_wndList.InsertColumn(1, \_T("Test 1"), 0, 200);
   m\_wndList.InsertColumn(1, \_T("Test 2"), 0, 800);

   m\_wndList.InsertItem(1, \_T("Item 1"), 0);
   m\_wndList.InsertItem(1, \_T("Item 2"), 0);

   return TRUE;
}


ListScroll.rc


IDD\_LISTSCROLL\_DIALOG DIALOGEX 0, 0, 320, 200
STYLE DS\_SETFONT | DS\_FIXEDSYS | WS\_MINIMIZEBOX | WS\_MAXIMIZEBOX | WS\_POPUP | WS\_VISIBLE | WS\_CAPTION | WS\_SYSMENU | WS\_THICKFRAME
EXSTYLE WS\_EX\_APPWINDOW
CAPTION "ListScroll"
FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
    DEFPUSHBUTTON   "OK",IDOK,209,179,50,14
    PUSHBUTTON      "Cancel",IDCANCEL,263,179,50,14
    CTEXT           "TODO: Place dialog controls here.",IDC\_STATIC,10,96,300,8
    CONTROL         "",IDC\_LIST1,"SysListView32",LVS\_REPORT | LVS\_ALIGNLEFT | WS\_BORDER | WS\_TABSTOP,7,7,306,162
END


Kan nogen pege på mig i den rigtige retning og forklare, hvordan man aktiverer markeringsvalg, der starter fra et enkelt element i listekontrollen?


Rediger : Her er et eksempel på markeringsvalg fra Windows Stifinder i Windows 10


Eksempel på markeringsvalg fra Windows Stifinder [11]

Bedste reference