es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El cuadro de diálogo de selección de archivos no tiene una línea de entrada de ruta si se utiliza el manifiesto.

Estoy utilizando la función GetOpenFileName() de Win32 en mi aplicación de C++. Todo estaba bien hasta que quise usar los Estilos Visuales:

image

No estoy usando un archivo de manifiesto, utilicé la función de este artículo.

Cuando encendí los Estilos Visuales, la línea de entrada de ruta desapareció en el cuadro de diálogo de selección de archivo:

image

¿Alguien sabe cómo solucionar esto?

ACTUALIZACIÓN: Aquí hay un ejemplo que hice para reproducir el problema. Lo compilé en Visual Studio 2019. Asegúrese de apagar el manifiesto en las propiedades del proyecto (Enlazador> Archivo de manifiesto> Generar manifiesto> NO) y #define USE_ACT_CTX para usar el contexto de activación.

“`c++
#include <windows.h>
#include <cassert>

//——————-

int main ()
{
#ifdef USE_ACT_CTX
wchar_t dir[MAX_PATH] = L"";
GetSystemDirectoryW (dir, MAX_PATH);

<pre><code> ACTCTXW context =
{
sizeof (context),
ACTCTX_FLAG_RESOURCE_NAME_VALID | ACTCTX_FLAG_SET_PROCESS_DEFAULT | ACTCTX_FLAG_ASSEMBLY_DIRECTORY_VALID,
L"shell32.dll",
0,
0,
dir,
(LPCWSTR) 124
};

HANDLE context_handle = CreateActCtxW (&context);
assert (context_handle != INVALID_HANDLE_VALUE);

ULONG_PTR cookie = 0;
assert (ActivateActCtx (context_handle, &cookie));
#endif

OPENFILENAMEW ofn = {};
wchar_t filename[MAX_PATH] = L"";

ofn.lStructSize = sizeof (ofn);
ofn.lpstrFile = filename;
ofn.nMaxFile = MAX_PATH;
ofn.lpstrFilter = L"DLL\0*.DLL\0";
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = nullptr;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = nullptr;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR;

GetOpenFileNameW (&ofn);

#ifdef USE_ACT_CTX
ReleaseActCtx (context_handle);
#endif
</code></pre>

}

//——————-
“`</windows.h>

Tags:  ,

Answer

  1. Avatar for davy.ai

    El problema con la línea de entrada de ruta que desaparece en el diálogo de selección de archivos al activar los Estilos Visuales se debe al uso de la función GetOpenFileName() sin un archivo de manifiesto, y en su lugar usando la función del artículo mencionado.

    Para solucionar este problema, puede agregar un archivo de manifiesto a su proyecto y habilitar los Estilos Visuales en ese archivo. Alternativamente, puede usar la función SetWindowTheme() para habilitar manualmente los Estilos Visuales para el diálogo de selección de archivos.

    Aquí hay un ejemplo de cómo usar SetWindowTheme() para habilitar los Estilos Visuales:

    c++
    SetWindowTheme(GetDlgItem(hDlg, 0x471), L"Explorer", NULL);

    En este ejemplo, GetDlgItem() recupera el identificador del control de la línea de entrada de ruta, y SetWindowTheme() habilita los Estilos Visuales para ese control especificando el nombre del tema como “Explorer”.

Comments are closed.