4

MFC ダイアログ ボックスに読み取り専用の編集ボックスを作成しました。ユーザーが読み取り専用の編集ボックスをクリックすると、ファイルダイアログが開き、UpdateDataを使用してこの値がテキストボックスに入力されるようにしようとしています。メッセージをキャッチしていON_EN_SETFOCUSますが、ファイル ダイアログで [OK] を押すとメッセージが再表示されるため、無限ループに陥ります。

UpdateData(TRUE);
CFileDialog fileDialog(TRUE,NULL, NULL,OFN_HIDEREADONLY|OFN_FILEMUSTEXIST, _T("Text Files(*.txt)|*.txt||"));
if( fileDialog.DoModal() == IDOK )
{
    configFile=fileDialog.GetPathName(); //Note to self, this includes filename, getPathName includes filename and path.

}
else
{
    return;
}

UpdateData(FALSE);

これをどのように行うべきかについて何かアイデアがあれば、とても感謝しています。

4

3 に答える 3

3

リスターさん、答えを追加します。

最初に、これの前にボタン名「...」を追加して、ファイルダイアログを開くための編集ボックスの右側にファイルダイアログを起動します。これが最も簡単な解決策であり、ほとんどのWindowsユーザーが期待するものです。

ただし、別のオプションは、MFC制御を拡張することです。コントロールを拡張することを決定するときは、ほとんどが目的の動作を持ち、サブクラスになるのに役立つ仮想デストラクタを備えたコントロールを選択する必要があります。ボタンのような振る舞いが必要なCButtonので、良い選択かもしれません。

クラスインターフェイスは次のようになります。

class CPathButton : public CButton
{
public:
    enum { ID /*= IDC_BUTTON1*/ };

    const CString GetPath() const;
    const CString GetFileName() const;
    const CString GetDirectory() const;
    const CString GetExtension() const;
    // other useful methods for setting file filters etc

protected:
    // add ON_CONTROL(BN_CLICKED, ID, &OnClick) or ON_BN_CLICKED(ID, &OnClick)
    DECLARE_MESSAGE_MAP()

    // CFileDialog fdlg.DoModal(), m_path = fdlg.GetPathName(), SetWindowText(fdlg.GetFileTitle()), etc
    afx_msg void OnClick();

    // additional message handlers etc

private:
    CString m_path; // save full path for after dialog is closed
};

コントロールが動的に作成されるか、リソースファイルを介して作成されるかなどに応じて、必要なだけカスタマイズを追加できます。基本的な考え方は、メンバーとして他の用途のためにフルパスを保存しながら、現在選択されているファイル名をボタンに表示することです。これにより、ユーザーはネストされたディレクトリを持つ長いパスの乱雑さを見る必要がなくなります。

デフォルトの外観が気に入らない場合は、メッセージを上書きOnPaintして処理WM_PAINTし、カスタムフォント、サイズを使用するか、長いファイルタイトルに省略記号を追加できます。また、テキストメトリックを使用してファイルタイトルに合わせてボタンのサイズを変更しGetTextExtent、名前がぴったり合うようにするかCToolTipCtrl、ボタンの上にマウスを置いたときにaを表示して、フルネームを表示することもできます。VS2008 +のCMFCButtonMFC機能パックからのツールチップ機能が組み込まれているため、ツールチップをCButton表示する代わりにそれを継承すると、ツールチップを呼び出すのと同じくらい簡単になります。SetTooltip(m_path)

本当に凝ったものにしたい場合は、uxthemeAPIまたは新しいWindowsアニメーションAPIのいくつかを使用できます。

于 2012-07-19T19:24:54.877 に答える
1

VS2008 SP1以降を使用している場合、パスを要求する最も簡単な方法はCMFCEditBrowseCtrlを使用することです。ボタン付きの編集コントロールを表示します。それを使用する手順は次のとおりです。

  • エディットコントロールのクラスをCMFCEditBrowseCtrlに変更します
  • EnableFileBrowseButtonを呼び出して、フォルダーではなくファイルを参照することを通知します(フィルターとデフォルトの拡張子を設定できます)
  • ユーザーがボタンをクリックするとファイルダイアログが表示され、その中で[OK]をクリックすると、選択したパスが編集コントロールに書き込まれます。
于 2012-07-20T07:20:20.560 に答える