2010-07-02 47 views
1

我有一个用C++编写的全屏应用程序,希望打开一个对话框窗口,这样用户就可以选择一个文件来打开,而不必让应用程序突破全屏模式。是否可以在全屏应用程序中创建GetOpenFileName对话框?

在Windows上,要以全屏模式运行,我打电话ChangeDisplaySettings(&settings, CDS_FULLSCREEN)。 (从技术上讲,我使用SDL,但这是它使用了电话。)

要打开文件对话框中,我使用下面的代码:

HWND hWnd = NULL; 
SDL_SysWMinfo wmInfo; 
SDL_VERSION(&wmInfo.version); 
if(SDL_GetWMInfo(&wmInfo)) { 
    hWnd = wmInfo.window; // Note: This is sucessful, and hWnd != NULL 
} 

OPENFILENAMEW ofn; 
wchar_t fileName[MAX_PATH] = L""; 
ZeroMemory(&ofn, sizeof(ofn)); 

ofn.lStructSize = sizeof(OPENFILENAME); 
ofn.hwndOwner = hWnd; 
ofn.lpstrFile = fileName; 
ofn.nMaxFile = MAX_PATH; 
ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST; 

if(GetOpenFileNameW(&ofn)) { 
    DoSomethingWith(fileName); 
} 

运行时的hWnd不为空,但是当此对话框已创建,它会将窗口焦点转移到对话框,该对话框将突出显示全屏应用程序,类似于在全屏幕中切换到另一个窗口。一旦文件被选中并且打开文件对话框关闭,我必须手动切换回全屏应用程序。

是否可以使用现有的Windows对话框做我想做的事情,还是必须编写自己的应用内文件浏览系统或仅以窗口模式运行?

回答

1

当然......你只需要传递全屏窗口的HWND作为打开文件通用对话框的父级(它是传递到GetOpenFileNameOPENFILENAME结构中的hwndOwner参数)。

+0

我添加了我用来获取和设置hwndOwner的代码,但即使在hwndOwner不为NULL时它仍然不起作用。也许现在这更像是一个SDL问题。 – JDS 2010-07-02 23:46:11

+0

明天我会试试自己(在纯C + WinAPI中,因为我不知道SDL),我会让你知道... – Wizard79 2010-07-02 23:49:51

+0

我知道这是在一个普通的Win32应用程序全屏运行。我对SDL一无所知,但我不知道它会做什么不同。 – casablanca 2010-07-03 00:00:26

相关问题