0

フラグが設定SetThemeAppPropertiesされていない引数を指定して呼び出すと、Common Dialogs(またはリストFile Open Dialog )でエラーが返されます。STAP_ALLOW_CONTROLSCoCreateInstanceCLSID_FileOpenDialog0x80040111

サンプルコードは次のとおりです。

HRESULT hResult;
CComPtr< IFileOpenDialog > pFileOpenInterface1;
CComPtr< IFileOpenDialog > pFileOpenInterface2;

hResult = ::CoCreateInstance( CLSID_FileOpenDialog, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS( &pFileOpenInterface1 ) );
::SetThemeAppProperties( 0 );
hResult = ::CoCreateInstance( CLSID_FileOpenDialog, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS( &pFileOpenInterface2 ) );

実行中のコードにするために、(Visual Studio 2010 Professionalで)単純なWin32 GUIアプリケーションを作成し、そのコードをメニューの[ヘルプ]|[バージョン情報]ハンドラーに追加しました。

なぜそうなのか、そしてその問題を回避する方法は?

4

3 に答える 3

1

すべてのコントロールでビジュアル スタイルを無効にすることは、かなりの負担になります。ダイアログの最新バージョンがそれをサポートしていないことは驚くべきことではありません。GetOpenFileName() を使用して、従来のシェル ダイアログ インターフェイスにフォールバックしてみてください。次に、コモン コントロールの 6.0 バージョンを有効にするマニフェスト エントリを削除します。おそらくスキニングのアイデアには少し嫌悪感があります。

于 2011-03-11T07:26:25.370 に答える
0

テンプレートを使用して一般的なダイアログをカスタマイズすることは、Windows 7ではそれほど簡単ではありません。最初に、GetOpenFileNameにDoModalからレガシー関数を呼び出させる必要があります。これはm_bVistaStyle=falseで簡単に実行できます。しかし、私がいくつかの主張に対処しなければならなかったよりも

ASSERT(pThreadState-> m_pAlternateWndInit == NULL);
pThreadState-> m_pAlternateWndInit = NULL;

何のためにあるのかはまだわかりませんが、WM_NCDESTROYを処理し、単純に割り当てることで「回避」できます。

_AFX_THREAD_STATE * pThreadState = AfxGetThreadState();
if(:: IsWindow(pThreadState-> m_pAlternateWndInit-> m_hWnd))
TRACE( "怖い...");
それ以外の場合、
pThreadState-> m_pAlternateWndInit = NULL;
TRACE( "WM_NCDESTROY");
falseを返します。

ウィンドウ手順で。しかし、私が管理しなかったのは、CDN_SELCHANGEのOpenFileDialogから選択したファイル名を取得することです。CDM_GETFILEPATHを送信すると、このメッセージで使用しているバッファの大きさに関係なく、256文字しか返されません。たぶん誰かがWindows7でこれを行う方法を知っていますか?

于 2011-03-11T13:24:04.853 に答える
0

ばかげた質問かもしれませんが、 CoCreateInstance を使用する前にInitCommonControlsEx () とCoInitializeEx () を呼び出しますか?

STAP_ALLOW_CONTROLS フラグが設定されている場合、SetThemeAppProperties への呼び出しによって COM が自動的に初期化されると思います。ただし、そのフラグが設定されていない場合は、自分で行う必要があります。

于 2011-03-11T12:16:28.937 に答える