似たような質問/回答が載っていたのですが、そうではなく
ダイアログのプロパティにあるフォントサイズを変更すればダイアログも、コントロールも文字
サイズも全て拡大(縮小)されますよね?
パソコンの解像度に合わせて、表示サイズを変更したいので、
プログラムの初期処理でプロパティのフォントサイズ変更をやりたいのですが、
どうすれば出来ますでしょうか?
宜しくお願いします。
実行ファイルからダイアログリソースをメモリ上に読み込んで
(FindResource,LoadResource,LockResource,SizeofResource等を使用)、
フォントのポイントサイズが記述されている部分を見つけ出して書き換えて
(DLGTEMPLATE辺りのヘルプを参考に手動で行う)、
それをDialogBoxIndirect等に渡してダイアログを作成すると、できます。
ありがとうございます。かなり難しそうですね。。。。。
こんな感じです。
#include windows.h
#include resource.h
BOOL CALLBACK DialogProc( HWND hwnd, UINT m, WPARAM wp, LPARAM lp )
{
//省略
}
int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE, LPSTR, int )
{
//ダイアログリソースのメモリへの読み込み
HRSRC hrsrc =
FindResource( hInstance, MAKEINTRESOURCE( IDD_DIALOG1 ), RT_DIALOG );
HGLOBAL hglobal = LoadResource( hInstance, hrsrc );
LPVOID lpvoid = LockResource( hglobal );
LPCDLGTEMPLATE pDlgTemplate = ( LPCDLGTEMPLATE )lpvoid;
if ( pDlgTemplate->style & DS_SETFONT )
{
//メモリ内のDLGTEMPLATE構造体に相当する部分を飛ばす
LPWSTR pNext =
( LPWSTR )( ( BYTE* )lpvoid + sizeof( DLGTEMPLATE ) );
//メニューリソースIDの記述部分を飛ばす
LPCWSTR pMenu = pNext;
if ( *pMenu==0 )
++pNext;
else if ( *pMenu==0xFFFF )
pNext += 2;
else
pNext += lstrlenW( pMenu ) + 1;
//ウィンドウクラスの記述部分を飛ばす
LPCWSTR pClass = pNext;
if ( *pClass==0 )
++pNext;
else if ( *pClass==0xFFFF )
pNext += 2;
else
pNext += lstrlenW( pClass ) + 1;
//タイトル文字列の記述部分を飛ばす
LPCWSTR pTitle = pNext;
pNext += lstrlenW( pTitle ) + 1;
//ポイントサイズ記述部分を書き換える
WORD* pPointsize = ( WORD* )pNext;
*pPointsize *= 2;
}
return DialogBoxIndirect( hInstance, pDlgTemplate, 0, DialogProc );
}
…ってデバッガをよく見ると例外処理が!
> *pPointsize *= 2; //ここで!
やはりLoadResource()・LockResource()で得たメモリは書き込み禁止らしいですね…。
というわけで別にメモリを確保し、そこにロードしたリソースをコピーしてから、
書き換えを行いましょう。
ちなみにMFCだとCDialogTemplateクラスという便利なものがありました。
ダイアログベースだと以下のようにできます。
#include <afxpriv.h>
BOOL CMfcApp::InitInstance()
{
CDialogTemplate cdt;
cdt.Load( MAKEINTRESOURCE( IDD_MFC_DIALOG ) );
CString fontname;
WORD fontsize;
cdt.GetFont( fontname, fontsize );
cdt.SetFont( fontname, fontsize * 2 );
CMfcDlg dlg;
m_pMainWnd = &dlg;
dlg.InitModalIndirect( cdt.Detach() );
dlg.DoModal();
return FALSE;
}
すいません、メモリ管理に誤りがありました。修正します。
× dlg.InitModalIndirect( cdt.Detach() );
○ dlg.InitModalIndirect( cdt.m_hTemplate );
ありがとうございます。まだ途中経過です。
両方試してみましたが、まだどちらもうまくいっていません。
というか、WinMainの方は、ダイアログベースで作っているので組み込み方がイマイチ、
解らないので仕方なく...(^-^;;
MFCの方は
dlg.InitModalIndirect( cdt.m_hTemplate );
のところで Debug Assertion Failed! が表示されてしまいます。
dlgcore.cppでエラーみたいです。
もうちょっと頑張ってみます。(^-^;;
大変遅くなりましたが、
OnInitDialog()でリソースを読み込んでポイントを書き換えることで出来ました。
ありがとうございました。