ボーダーをドラッグして、ウィンドウサイズを変更し、
ウィンドウサイズの変更が終了したときに1回だけ、
縦横比の調整をしたいのですが、
OnSizeでサイズ変更の終了をとっても、実際はドラック中に何度もOnSizeが呼ばれるため、調整がうまくいきません。
(ドラッグ以外の最大最小化でOnSizeに入った場合は、うまく調整できるので、調整のロジックミスではないと思ってます。)
OnSize呼び出し後、左クリックが上がった時をサイズ変更終了にしようかと思ったのですが、ボーダー上の左クリックのイベントが取れず、これも失敗してしまいました。
縦横比固定で調整できる方法のご教授をお願いします。
(長文で申し訳ないですが、以下、ソースです)
// szBefore:以前のクライアント領域のサイズ
// szNow:現在、変更されたサイズ←このサイズを4:3に調整したいのです
void CWndXXX::AdjustSize(CSize szBefore, CSize szNow)
{
INT h=0;
INT w=0;
if (szBefore==szNow)
return; // 以前と同じサイズの場合、リサイズされてないので無視
//縦横比が適正なら無視
if ((szNow.cx%4==0) && ((szNow.cx/4*3)==szNow.cy))
return;
// 変化の大きい方を基準に変更する。
if (abs(szBefore.cx-szNow.cx) > abs(szBefore.cy-szNow.cy))
{
// 横幅を基準に変更
h=(szNow.cx/4)*3;
w=(szNow.cx/4)*4;
}
else
{
// 縦幅を基準に変更
h=(szNow.cy/3)*3;
w=(szNow.cy/3)*4;
}
// ウィンドウサイズ変更
CRect rc,rcWindow;
GetClientRect(rc);
GetWindowRect(rcWindow);
// windowとクライアント領域の差(ボーダー部分)
INT nFrameW=rcWindow.Width()-rc.Width();
INT nFrameH=rcWindow.Height()-rc.Height();
ClientToScreen(rc);
rc.bottom=rc.top+h+nFrameH;
rc.right=rc.left+w+nFrameW;
MoveWindow(rc);
}
// サイズ変更
void CWndXXX::OnSize(UINT nType, int cx, int cy)
{
CWnd::OnSize(nType, cx, cy);
if (nType==SIZE_RESTORED)
AdjustSize(m_szBefore, CSize(cx,cy)); //<-ここが繰り返し呼ばれるとなぜか、調整がうまくいきません・・・。
m_szBefore.SetSize(cx,cy);
}
この場合、CWnd::OnSizing()のほうが適切では?
http://msdn.microsoft.com/ja-jp/library/9kwe022c(VS.80).aspx
正にその通りでした。OnSizingで変更するんですね。。。
ありがとうございました。
ツイート | ![]() |