Visual Studio 2008を使って、MFCのダイアログベースのプログラミングをしています。
ダイアログ編集タブの右下のサイズの部分で150×150になるようにピクチャーボックスのサイズを変更しました。
そんなピクチャーボックスにEllipse(0,0,150,150);の円を描きました。
すると、自分ではサイズを150×150にしていたから画面いっぱいの円が描かれると思っていたのですが、左上によった位置に円が描かれました。
そこで、GetClientRectで取得したCRect型の中身を見てみたところmyRECT {top=0 bottom=225 left=0 right=263}となっていて、実際は150×150ではないようで。
もしかしてサイズ150×150のつもりが150×150ではないのだろうか?と思ってリソースファイルを見てみたところ、ちゃんと150×150のようでした。
CONTROL "",IDC_CANVAS,"Static",SS_BLACKFRAME,162,7,150,150
ここでの150,150はなんのサイズなのでしょうか?
ダイアログ上で150×150ないし正方形のピクチャーボックスを表示させたいのですが、そうするにはどのようにすればよいのでしょうか?
ダイアログベース ピクチャーボックスのサイズについて。
Re: ダイアログベース ピクチャーボックスのサイズについて。
MFCはわかりませんが、
普通のWindowsのリソースで作るダイアログのサイズと座標の指定は、
テキストのフォントサイズを基準にしています。
水平方向はフォントサイズの1/4を、垂直方向はフォントサイズの1/8が「1」になります。
繰り返しますが、MFCのことはわかりません。参考までに。
普通のWindowsのリソースで作るダイアログのサイズと座標の指定は、
テキストのフォントサイズを基準にしています。
水平方向はフォントサイズの1/4を、垂直方向はフォントサイズの1/8が「1」になります。
繰り返しますが、MFCのことはわかりません。参考までに。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: ダイアログベース ピクチャーボックスのサイズについて。
MFCでも内部はWin32APIですのでフォントのサイズです。
あとGetClientRectだと上下左右のウィンドウパーツのサイズで調整されますので縦横のサイズも変わるはずです。
[補足]
とりあえずピクチャボックのウィンドウサイズをプログラムから変更すれば150x150には出来ます。
あとGetClientRectだと上下左右のウィンドウパーツのサイズで調整されますので縦横のサイズも変わるはずです。
[補足]
とりあえずピクチャボックのウィンドウサイズをプログラムから変更すれば150x150には出来ます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: ダイアログベース ピクチャーボックスのサイズについて。
みけCAT さんが書きました:普通のWindowsのリソースで作るダイアログのサイズと座標の指定は、
テキストのフォントサイズを基準にしています。
水平方向はフォントサイズの1/4を、垂直方向はフォントサイズの1/8が「1」になります。
全然理解できていなかったり・・・softya(ソフト屋) さんが書きました:MFCでも内部はWin32APIですのでフォントのサイズです。
あとGetClientRectだと上下左右のウィンドウパーツのサイズで調整されますので縦横のサイズも変わるはずです。
自分で指定した値をフォントサイズが影響して変更されるとかいう話ですか?
150×150はフォントサイズに関係する・・・のでしょうか?
canvas.GetClientRect(myRECT);で変化したmyRECTを用いてEllipse(myRECT);としたところ、ピクチャーボックスいっぱいの楕円が描かれました。
ダイアログの縦はピクチャーボックスの縦+上下の余白にしているのですが、そのダイアログサイズもプログラムで変更できますか?softya(ソフト屋) さんが書きました:とりあえずピクチャボックのウィンドウサイズをプログラムから変更すれば150x150には出来ます。
ピクチャーボックスの左側にテキストボックスなどを配置していて、現在ダイアログ編集タブで適当な間隔をあけつつ縦いっぱいに配置しているのですが、そういうのも配置変更できますか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: ダイアログベース ピクチャーボックスのサイズについて。
フォントはダイアログ毎にデフォルトで指定されているはずです。かなたん さんが書きました:全然理解できていなかったり・・・
自分で指定した値をフォントサイズが影響して変更されるとかいう話ですか?
150×150はフォントサイズに関係する・・・のでしょうか?
canvas.GetClientRect(myRECT);で変化したmyRECTを用いてEllipse(myRECT);としたところ、ピクチャーボックスいっぱいの楕円が描かれました。
CONTROL "",IDC_CANVAS,"Static",SS_BLACKFRAME,162,7,150,150
の近くにありませんか?
150の単位はみけCATさんが説明したとおりです。横は1/4文字で1なので150だと150/4文字分です。
フォントサイズを変えればウィンドウサイズも変わりますので試してみて下さい。
ウィンドウのサイズはCWnd::SetWindowPosで変更できます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: ダイアログベース ピクチャーボックスのサイズについて。
ウィンドウのサイズの変更は、この関数を参考にしてみるといいと思います。
普通のWindowsのウィンドウのサイズをクライアント領域の大きさで指定する関数です。
void wndResizeByClient(HWND hWnd,int x,int y) {
RECT size;
RECT wndsize;
GetClientRect(hWnd,&size);
GetWindowRect(hWnd,&wndsize);
wndsize.right=wndsize.right-wndsize.left;
wndsize.bottom=wndsize.bottom-wndsize.top;
SetWindowPos(hWnd,NULL,0,0,
x+wndsize.right-size.right,
y+wndsize.bottom-size.bottom,
SWP_NOMOVE | SWP_NOREPOSITION | SWP_NOZORDER);
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: ダイアログベース ピクチャーボックスのサイズについて。
あぁ・・・みんな思うことは同じなんですねぇ・・・。
私も昔「GetClientRectはあるのに、SetClientRectがないのはどういう了見だ!!」とか思ったことありますw
そんなこんなで、作ったのが下記のような関数。
OnInitDialog辺りで設定したいコントロールクラスに対して使うと幸せになれるかもしれません。
SetClientRect(m_pict, CSize(150, 150));
使い方はこんな感じ。
私も昔「GetClientRectはあるのに、SetClientRectがないのはどういう了見だ!!」とか思ったことありますw
そんなこんなで、作ったのが下記のような関数。
OnInitDialog辺りで設定したいコントロールクラスに対して使うと幸せになれるかもしれません。
VOID SetClientRect(CWnd& wnd, CSize size)
{
CRect window;
wnd.GetWindowRect(window);
CRect client;
wnd.GetClientRect(client);
size.cx = window.Width() - client.Width() + size.cx;
size.cy = window.Height() - client.Height() + size.cy;
CRect newRect(window.TopLeft(), size);
wnd.MoveWindow(newRect, TRUE);
}
使い方はこんな感じ。
最後に編集したユーザー バグ on 2012年7月12日(木) 10:57 [ 編集 1 回目 ]
Re: ダイアログベース ピクチャーボックスのサイズについて。
ダイアログのフォントを基準にした単位は、ダイアログベース単位と言います。
これはディスプレイの解像度(というかピクセルの密度)に応じて、適切な大きさでダイアログが表示されるようにするためのものです。
ピクセル単位で描画すると、解像度が上がった分小さく描画されます。
プログラム側でサイズを調整する場合でもダイアログベース単位を考慮しないと、例えばRetinaディスプレイが当たり前になったとき、ちんまりとした表示になってしまいます。
これはディスプレイの解像度(というかピクセルの密度)に応じて、適切な大きさでダイアログが表示されるようにするためのものです。
ピクセル単位で描画すると、解像度が上がった分小さく描画されます。
プログラム側でサイズを調整する場合でもダイアログベース単位を考慮しないと、例えばRetinaディスプレイが当たり前になったとき、ちんまりとした表示になってしまいます。
Re: ダイアログベース ピクチャーボックスのサイズについて。
ありました。softya(ソフト屋) さんが書きました:フォントはダイアログ毎にデフォルトで指定されているはずです。
CONTROL "",IDC_CANVAS,"Static",SS_BLACKFRAME,162,7,150,150
の近くにありませんか?
FONT 9, "MS UI Gothic", 0, 0, 0x1
のことですね?
後ろ3つの引数がよくわからないですけど。
フォントサイズを変えるってことは、当然ダイアログで使っているスタティックテキストのフォントサイズもそれに影響して変わりますよね?softya(ソフト屋) さんが書きました:150の単位はみけCATさんが説明したとおりです。横は1/4文字で1なので150だと150/4文字分です。
フォントサイズを変えればウィンドウサイズも変わりますので試してみて下さい。
そういう関数があるのですね。softya(ソフト屋) さんが書きました:ウィンドウのサイズはCWnd::SetWindowPosで変更できます。
ちょっと調べてみようと思います。
みけCAT さんが書きました:ウィンドウのサイズの変更は、この関数を参考にしてみるといいと思います。
普通のWindowsのウィンドウのサイズをクライアント領域の大きさで指定する関数です。
こういうのなら、指定した通りのサイズになってくれるんですね?バグ さんが書きました:あぁ・・・みんな思うことは同じなんですねぇ・・・。
私も昔「GetClientRectはあるのに、SetClientRectがないのはどういう了見だ!!」とか思ったことありますwそんなこんなで、作ったのが下記のような関数。
OnInitDialog辺りで設定したいコントロールクラスに対して使うと幸せになれるかもしれません。
SetClientRect(m_pict, CSize(150, 150));
使い方はこんな感じ。
ピクセルで決めると解像度によってはサイズの大きさが変わってしまうため、どの解像度でも影響しないフォントサイズを基準にするんですね。ISLe さんが書きました:ダイアログのフォントを基準にした単位は、ダイアログベース単位と言います。
これはディスプレイの解像度(というかピクセルの密度)に応じて、適切な大きさでダイアログが表示されるようにするためのものです。
ピクセル単位で描画すると、解像度が上がった分小さく描画されます。
プログラム側でサイズを調整する場合でもダイアログベース単位を考慮しないと、例えばRetinaディスプレイが当たり前になったとき、ちんまりとした表示になってしまいます。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: ダイアログベース ピクチャーボックスのサイズについて。
試せば分かることは聞く前に試すほうが良いですよ。かなたん さんが書きました: フォントサイズを変えるってことは、当然ダイアログで使っているスタティックテキストのフォントサイズもそれに影響して変わりますよね?
その方がより理解が進みます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。