MFIを使用したMFCアプリケーションがあります。これは、MFCScribbleの例/チュートリアルに似ています。子ウィンドウが最大化されると、メインフレームウィンドウのキャプション/タイトルが自動的に調整され、「Scribble-[Scribb1]」のように子ウィンドウのタイトルが追加されます。子ウィンドウのタイトルが非常に長い場合、それは切り捨てられます。キャプション全体の長さは約160文字に制限されているようです。この制限を増やしてより多くの文字を表示する方法はありますか?キャプションを再描画するためにWM_NCPAINTをオーバーライドすることは一方向だと思いますが、ある場合は他の単純な解決策をお勧めします。OnUpdateFrameTitle()をオーバーライドしようとしましたが、結合されたキャプション全体で機能しないようです。
2 に答える
内部でCFrameWnd::UpdateFrameTitleForDocument()メソッドを呼び出しているCFrameWnd::OnUpdateFrameTitleを見てください。それは魔法をします。これは仮想メソッドです。CMainFrmクラスでOnUpdateFrameTitleをオーバーライドし、必要に応じてウィンドウタイトルを設定できます。
知らなかった場合は、MFCライブラリが完全にソースとともに提供されます。CFrameWndソースはwinfrm.cppにあります(このファイルを検索すると、PC上のMFCのソースがどこにあるかがわかります)
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スタイルで機能します。