0

MFIを使用したMFCアプリケーションがあります。これは、MFCScribbleの例/チュートリアルに似ています。子ウィンドウが最大化されると、メインフレームウィンドウのキャプション/タイトルが自動的に調整され、「Scribble-[Scribb1]」のように子ウィンドウのタイトルが追加されます。子ウィンドウのタイトルが非常に長い場合、それは切り捨てられます。キャプション全体の長さは約160文字に制限されているようです。この制限を増やしてより多くの文字を表示する方法はありますか?キャプションを再描画するためにWM_NCPAINTをオーバーライドすることは一方向だと思いますが、ある場合は他の単純な解決策をお勧めします。OnUpdateFrameTitle()をオーバーライドしようとしましたが、結合されたキャプション全体で機能しないようです。

4

2 に答える 2

1

内部でCFrameWnd::UpdateFrameTitleForDocument()メソッドを呼び出しているCFrameWnd::OnUpdateFrameTitleを見てください。それは魔法をします。これは仮想メソッドです。CMainFrmクラスでOnUpdateFrameTitleをオーバーライドし、必要に応じてウィンドウタイトルを設定できます。

知らなかった場合は、MFCライブラリが完全にソースとともに提供されます。CFrameWndソースはwinfrm.cppにあります(このファイルを検索すると、PC上のMFCのソースがどこにあるかがわかります)

于 2013-01-12T03:53:46.120 に答える
1

OnUpdateFrameTitleをオーバーライドして、UpdateFrameTitleForDocumentの独自の実装を呼び出すことはできません。Amitは、投稿する前にすでにソリューションを試しました。

これはMFCによっても実装されていません。MDIウィンドウはMFCによって導入されていません。MDIフレームウィンドウは、WindowsOSの一部として覚えているので存在していました。

MFCの内部にあるデフォルトのMFC実装は、必要に応じて、DefFrameProcとして定義された特別なMDIウィンドウプロシージャを呼び出します。

いくつかの不思議な理由によるWindowsの実装では、ウィンドウテキスト(MDIフレームのタイトルバーに表示される)を160文字に切り捨てます。これには、WM_SETTEXTメッセージの処理時に0を終了することも含まれます。これはおそらく、無駄にするメモリがあまりなく、すべてのバッファサイズが最小限に抑えられていた古いコンピュータの残骸です。

これはおそらく、無駄にするメモリがあまりなく、すべてのバッファサイズが最小に保たれ、ファイル名が8.3合計12文字であった古いコンピュータの残骸です。

要件を満たし、全文を表示するには、いくつかの変更を加える必要があります。

幸い、MEMCの要件に一致して、この動作を変更する非常に簡単な方法を見つけました。

メインフレームクラスでDefWindowProcをオーバーライドし、コードを次のように変更します。

LRESULT CMainFrame::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
    if(WM_SETTEXT == message)
    {
        // if set text (called from UpdateFrameTitleForDocument)
        // do not call DefWindowProc
        return CWnd::DefWindowProc(message, wParam, lParam);
    }

    // otherwise call DefWindowProc that in turn calls DefFrameProc
    return CMDIFrameWndEx::DefWindowProc(message, wParam, lParam);
}

次に、ビルドして実行します。

これは、MFCアプリのclassincおよびVisualStudioスタイルで機能します。

于 2013-01-12T16:39:48.473 に答える