画面解像度に応じてダイアログの拡大(縮小)表示 – プログラミング – Home

画面解像度に応じてダイアログの拡大(縮...
 
通知
すべてクリア

[解決済] 画面解像度に応じてダイアログの拡大(縮小)表示


ゆみ
 ゆみ
(@ゆみ)
ゲスト
結合: 22年前
投稿: 7
Topic starter  

似たような質問/回答が載っていたのですが、そうではなく
ダイアログのプロパティにあるフォントサイズを変更すればダイアログも、コントロールも文字
サイズも全て拡大(縮小)されますよね?
パソコンの解像度に合わせて、表示サイズを変更したいので、
プログラムの初期処理でプロパティのフォントサイズ変更をやりたいのですが、
どうすれば出来ますでしょうか?
宜しくお願いします。


引用未解決
トピックタグ
n
 n
(@n)
ゲスト
結合: 21年前
投稿: 90
 

実行ファイルからダイアログリソースをメモリ上に読み込んで
(FindResource,LoadResource,LockResource,SizeofResource等を使用)、
フォントのポイントサイズが記述されている部分を見つけ出して書き換えて
(DLGTEMPLATE辺りのヘルプを参考に手動で行う)、
それをDialogBoxIndirect等に渡してダイアログを作成すると、できます。


返信引用
ゆみ
 ゆみ
(@ゆみ)
ゲスト
結合: 22年前
投稿: 7
Topic starter  

ありがとうございます。かなり難しそうですね。。。。。


返信引用
n
 n
(@n)
ゲスト
結合: 21年前
投稿: 90
 

こんな感じです。

#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 );
}


返信引用
n
 n
(@n)
ゲスト
結合: 21年前
投稿: 90
 

…ってデバッガをよく見ると例外処理が!

> *pPointsize *= 2; //ここで!

やはりLoadResource()・LockResource()で得たメモリは書き込み禁止らしいですね…。

というわけで別にメモリを確保し、そこにロードしたリソースをコピーしてから、
書き換えを行いましょう。


返信引用
n
 n
(@n)
ゲスト
結合: 21年前
投稿: 90
 

ちなみに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;
}


返信引用
n
 n
(@n)
ゲスト
結合: 21年前
投稿: 90
 

すいません、メモリ管理に誤りがありました。修正します。

× dlg.InitModalIndirect( cdt.Detach() );
○ dlg.InitModalIndirect( cdt.m_hTemplate );


返信引用
ゆみ
 ゆみ
(@ゆみ)
ゲスト
結合: 22年前
投稿: 7
Topic starter  

ありがとうございます。まだ途中経過です。
両方試してみましたが、まだどちらもうまくいっていません。
というか、WinMainの方は、ダイアログベースで作っているので組み込み方がイマイチ、
解らないので仕方なく...(^-^;;
MFCの方は
dlg.InitModalIndirect( cdt.m_hTemplate );
のところで Debug Assertion Failed! が表示されてしまいます。
dlgcore.cppでエラーみたいです。
もうちょっと頑張ってみます。(^-^;;


返信引用
ゆみ
 ゆみ
(@ゆみ)
ゲスト
結合: 22年前
投稿: 7
Topic starter  

大変遅くなりましたが、
OnInitDialog()でリソースを読み込んでポイントを書き換えることで出来ました。
ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました