2017-05-09 5 views
0

ReplaceText()Win32 API関数を使用すると、Replace/Replaceだけを残してfind/find nextボタンを無効または非表示にできますか?FindReplaceダイアログの[Find/Find Next]オプションを無効にする

ない場合、私は自分のダイアログをロールバックする必要があります。

+0

私のアドバイス:単にそれらのダイアログを使用しないでください、彼らはメモ帳に適しています。はるかに柔軟性のあるあなた自身を作る。 –

答えて

2

ReplaceText()ダイアログでは、さまざまなFR_HIDE...のフラグを使用してdirectionMatch case、およびMatch Whole Wordボックスを非表示にすることができますが、それはFind NextReplaceボタンを隠すための任意のフラグを持っていません。したがって、手動で行う必要があります。これを行うには2つの方法があり

  1. あなたが表示したいだけでUIフィールドを含むカスタムダイアログリソースを作成することができ、その後、あなたはFR_ENABLETEMPLATEFR_ENABLETEMPLATEHANDLEフラグを有効にして提供することができますダイアログをテンプレートとしてそれぞれlpTemplateNameまたはhInstanceフィールドに入力します。

  2. あなたはFR_ENABLEHOOKフラグを有効にしてWM_INITDIALOGメッセージを処理するときに、デフォルトのダイアログで、既存のボタンを隠し/無効lpfnHookコールバックを提供することができます。

これらの技術は、MSDNのドキュメントに記述されています

Customizing the Find or Replace Dialog Box

コードで実装が容易であるように私は、#2を選ぶだろう、例えば:

UINT_PTR CALLBACK FRHookProc(HWND hdlg, UINT uiMsg, WPARAM wParam, LPARAM lParam) 
{ 
    if (uiMsg == WM_INITDIALOG) 
    { 
     HWND hBtn = GetDlgItem(hdlg, 1); // The "Find Next" button is ID 1 
     if (hBtn) 
      ShowWindow(hBtn, SW_HIDE); 
    } 
    return 0; 
} 

FINDREPLACE fr = {sizeof(fr), 0}; 
... 
fr.Flags = FR_ENABLEHOOK; 
fr.lpfnHook = &FRHookProc; 
... 

HWND hDlg = ReplaceText(&fr); 
+0

偉大な答え、ありがとう。 –

+0

は、私はこれを試して、問題に遭遇した - 私は、ダイアログが正しく描画されません置き換える見つけ、フック関数を指定すると、アプリケーションがフリーズした場合。これは、フック関数が何もせずにTRUEを返す場合にも当てはまります。あなたはこれに遭遇しましたか? –

+0

@TomDavies no。と私はそれを投稿する前にコードをテストした、それは正常に働いた。しかし、ドキュメントを読んで:「フックプロシージャがゼロを返した場合*、デフォルトのダイアログボックスプロシージャがメッセージを処理 **フックプロシージャがゼロ以外の値を返す場合、デフォルトのダイアログボックスプロシージャがメッセージを無視** *。。」 –

関連する問題