MFC - Hojas de propiedades

UN property sheet, también conocido como cuadro de diálogo de pestaña, es un cuadro de diálogo que contiene páginas de propiedades. Cada página de propiedades se basa en un recurso de plantilla de diálogo y contiene controles. Está incluido en una página con una pestaña en la parte superior. La pestaña nombra la página e indica su propósito. Los usuarios hacen clic en una pestaña de la hoja de propiedades para seleccionar un conjunto de controles.

Para crear páginas de propiedades, veamos un ejemplo simple creando un proyecto MFC basado en cuadros de diálogo.

Una vez que se crea el proyecto, necesitamos agregar algunas páginas de propiedades.

Visual Studio facilita la creación de recursos para las páginas de propiedades mostrando el cuadro de diálogo Agregar recurso, expandiendo el nodo Diálogo y seleccionando uno de los elementos IDD_PROPPAGE_X.

Step 1 - Haga clic con el botón derecho en su proyecto en el explorador de soluciones y seleccione Agregar → Recursos.

Step 2 - Seleccione IDD_PROPPAGE_LARGE y haga clic en NUEVO.

Step 3 - Cambiemos el ID y el título de esta página de propiedad a IDD_PROPPAGE_1 y Property Page 1 respectivamente como se muestra arriba.

Step 4 - Haga clic con el botón derecho en la página de propiedades en la ventana del diseñador.

Step 5 - Seleccione la opción Agregar clase.

Step 6 - Ingrese el nombre de la clase y seleccione CPropertyPage de la lista desplegable de la clase base.

Step 7 - Haga clic en Finalizar para continuar.

Step 8 - Agregue una página de propiedades más con ID IDD_PROPPAGE_2 y Título de la página de propiedades 2 siguiendo los pasos mencionados anteriormente.

Step 9- Ahora puede ver dos páginas de propiedades creadas. Para implementar su funcionalidad, necesitamos una hoja de propiedades.

La hoja de propiedades agrupa las páginas de propiedades y las mantiene como entidad.

Para crear una hoja de propiedades, siga los pasos que se indican a continuación:

Step 1 - Haga clic derecho en su proyecto y seleccione Agregar> Opciones de menú de clase.

Step 2 - Seleccione Visual C ++ → MFC en el panel izquierdo y Clase MFC en el panel de plantilla y haga clic en Agregar.

Step 3 - Ingrese el nombre de la clase y seleccione CPropertySheet de la lista desplegable de la clase base.

Step 4 - Haga clic en finalizar para continuar.

Step 5 - Para lanzar esta hoja de propiedades, necesitamos los siguientes cambios en nuestra clase de proyecto principal.

Step 6 - Agregue las siguientes referencias en el archivo CMFCPropSheetDemo.cpp.

#include "MySheet.h"
#include "PropPage1.h"
#include "PropPage2.h"

Step 7 - Modifique el método CMFCPropSheetDemoApp :: InitInstance () como se muestra en el siguiente código.

CMySheet mySheet(L"Property Sheet Demo");
CPropPage1 page1;
CPropPage2 page2;

mySheet.AddPage(&page1);
mySheet.AddPage(&page2);

m_pMainWnd = &mySheet;
INT_PTR nResponse = mySheet.DoModal();

Step 8 - Aquí está la implementación completa del archivo CMFCPropSheetDemo.cpp.

// MFCPropSheetDemo.cpp : Defines the class behaviors for the application.
//
#include "stdafx.h"
#include "MFCPropSheetDemo.h"
#include "MFCPropSheetDemoDlg.h"
#include "MySheet.h"
#include "PropPage1.h"
#include "PropPage2.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CMFCPropSheetDemoApp
BEGIN_MESSAGE_MAP(CMFCPropSheetDemoApp, CWinApp)
   ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
END_MESSAGE_MAP()


// CMFCPropSheetDemoApp construction

CMFCPropSheetDemoApp::CMFCPropSheetDemoApp() {

   // support Restart Manager
   m_dwRestartManagerSupportFlags = AFX_RESTART_MANAGER_SUPPORT_RESTART;
   // TODO: add construction code here,
   // Place all significant initialization in InitInstance
}


// The one and only CMFCPropSheetDemoApp object

CMFCPropSheetDemoApp theApp;


// CMFCPropSheetDemoApp initialization

BOOL CMFCPropSheetDemoApp::InitInstance() {
   
   // InitCommonControlsEx() is required on Windows XP if an application
   // manifest specifies use of ComCtl32.dll version 6 or later to enable
   // visual styles. Otherwise, any window creation will fail.
   INITCOMMONCONTROLSEX InitCtrls;
   InitCtrls.dwSize = sizeof(InitCtrls);
   // Set this to include all the common control classes you want to use
   // in your application.
   InitCtrls.dwICC = ICC_WIN95_CLASSES;
   InitCommonControlsEx(&InitCtrls);
   
   CWinApp::InitInstance();
   
   
   AfxEnableControlContainer();
   
   // Create the shell manager, in case the dialog contains
   // any shell tree view or shell list view controls.
   CShellManager *pShellManager = new CShellManager;

   // Activate "Windows Native" visual manager for enabling themes in MFC controls
   CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));
   // Standard initialization
   // If you are not using these features and wish to reduce the size
   // of your final executable, you should remove from the following
   // the specific initialization routines you do not need
   // Change the registry key under which our settings are stored
   // TODO: You should modify this string to be something appropriate
   // such as the name of your company or organization
   SetRegistryKey(_T("Local AppWizard-Generated Applications"));
   
   CMySheet mySheet(L"Property Sheet Demo");
   CPropPage1 page1;
   CPropPage2 page2;
   
   mySheet.AddPage(&page1);
   mySheet.AddPage(&page2);
   
   m_pMainWnd = &mySheet;
   INT_PTR nResponse = mySheet.DoModal();
   if (nResponse == IDOK) {
      // TODO: Place code here to handle when the dialog is
      // dismissed with OK
   }else if (nResponse == IDCANCEL) {
      // TODO: Place code here to handle when the dialog is
      // dismissed with Cancel
   }else if (nResponse == -1) {    
      TRACE(traceAppMsg, 0, "Warning: dialog creation failed, 
        so application is terminating unexpectedly.\n");
      TRACE(traceAppMsg, 0, "Warning: if you are using MFC controls on the dialog, 
        you cannot #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS.\n");
   }

   // Delete the shell manager created above.
   if (pShellManager != NULL) {
      delete pShellManager;
   }

   // Since the dialog has been closed, return FALSE so that we exit the
   // application, rather than start the application's message pump.
   return FALSE;
}

Step 9- Cuando se compile y ejecute el código anterior, verá el siguiente cuadro de diálogo. Este cuadro de diálogo contiene dos páginas de propiedades.