OS windows XP
VC VisualC++.NET 2003
VC初心者です。ダイアログベースで、ピクチャーボックスを置き、その中に
線を何本か描画したりします。そのピクチャーボックス内に描いたものを
2倍に拡大又は縮小したい方法は、どのような描画関数を用いて行えば実現できる
でしょうか。(.NETは使用いたしません)
以前、
方法1) SetWindowOrg,SetWindowExt で座標系を変化させる。
方法2) 座標値を2倍するなりして自分で2倍のサイズを計算する。
の回答得てこの二つの関数の書式を調べ、読んだのですが、
初心者の自分の中で理解できませんでした。
再度質問させていただきました。
何か良い例題となるもの,若しくは下記の拡大ボタン処理でどのようにすれば
良いかを示していただけると助かるのですが。
ご教授の程宜しくお願い致します。
下記は自分なりのサンプルを作成したものです。
描画ボタン(OnBnClickedButton3)と
拡大ボタン(OnBnClickedButton1)と
void CzoomupDlg::OnBnClickedButton3()
{
CClientDC myDC(&m_pict); //描画の準備
CRect mySize;
m_pict.GetClientRect(mySize); //クライアント座標を受け取るRECT構造体
myDC.FillSolidRect(mySize,RGB(255,255,0)); //黄色で塗りつぶし
myDC.MoveTo(50,50); //ライン描画
myDC.LineTo(160,50);
myDC.MoveTo(50,80);
myDC.LineTo(160,80);
myDC.MoveTo(50,110);
myDC.LineTo(160,110);
// TODO : ここにコントロール通知ハンドラ コードを追加します。
}
void CzoomupDlg::OnBnClickedButton1()
{
//拡大処理
//SetWindowOrg()
//SetWindowExt(int cx, int cy);
// TODO : ここにコントロール通知ハンドラ コードを追加します。
}
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200511/05110050.txt
で、「SetWindowOrg(),SetWindowExt()の関数の使い方を調べ実験する」と仰ってましたが、
どこまで解りました?
私にとって簡単な方の、方法2について。
void CzoomupDlg::OnBnClickedButton1()
{
m_scale *= 2.0;
Invalidate();
}
void CzoomupDlg::OnBnClickedButton3()
{
CClientDC myDC(&m_pict); //描画の準備
CRect mySize;
m_pict.GetClientRect(mySize); //クライアント座標を受け取るRECT構造体
myDC.FillSolidRect(mySize,RGB(255,255,0)); //黄色で塗りつぶし
myDC.MoveTo(m_scale * 50, m_scale * 50); //ライン描画
myDC.LineTo(m_scale * 160, m_scale * 50);
...
}
ただ、これではダイアログが別のウィンドウに隠れたりすると、
描いた図形が消えてしまうので、OnDrawなどで描画するのが基本です。
その場合、例えばこんな感じ。
void CzoomupDlg::OnBnClickedButton3()
{
m_needDraw = TRUE;
Invalidate();
}
void CzoomupDlg::OnDraw()
{
CClientDC myDC(&m_pict); //描画の準備
CRect mySize;
m_pict.GetClientRect(mySize); //クライアント座標を受け取るRECT構造体
myDC.FillSolidRect(mySize,RGB(255,255,0)); //黄色で塗りつぶし
if (m_needDraw) {
myDC.MoveTo(m_scale * 50, m_scale * 50); //ライン描画
myDC.LineTo(m_scale * 160, m_scale * 50);
...
}
}
# 今使っているパソコンにはコンパイラが入ってないので、動作確認はしてません。
# メンバ変数は適切に宣言・初期化してください。
お恥ずかしながら、SetWindowExt()の関数ですが、
引数に intx, int cyの2つがあり、それぞれウィンドウのx範囲を論理単位で指定、
ウィンドウのy範囲を論理単位で指定と書いてあることを調べ、論理値単位とは?と思
い、論理単位について調べ、グラフィックス描画とかでその位置を指定するのに「論理単
位」が用いられる。ことまで調べました。