今現在、MFCにて簡単な画像ビュワーを作成してます。
問題になっているのは画像を縮小して縮小した画像に合わせてウィンドウサイズを変更するコードを書きましたが
ウィンドウサイズを変更して縮小した画像より画面サイズが小さければウィンドウにスクロールバーを表示する仕様にしてます。
しかし、スクロールバーが表示した状態で新たに画像を読み込むと縮小した画像より少し大きい(スクロールバー分)サイズにウィンドウサイズが変更されます。
水平スクロールバーのみを表示した状態で新たに画像を読み込むと横幅のみスクロールバー分大きいウィンドウサイズになってしまいます。
垂直スクロールバーのみ表示した状態でも同様縦幅のみスクロールバー分大きいウィンドウサイズになっていしまいます。
スクロールバーが表示されない状態で新たに画像を読み込むと縮小した画像とぴったりなサイズにウィンドウを変更してくれます。
画像を新たに読み込むと気にスクロールバーを解除してもスクロールバー分大きいウィンドウサイズになってしまいます。
このような場合どのようにすれば良いか途方にくれています。
以上、なにか良い案があればご提示宜しくお願い致します。
動作環境は
OS: Windows 10 Home 22H2
開発環境: Visual studio 2019
です。
以下にざっくりではありますがソースコードを記載させて頂きます。
// 画像ファイルを読み込む
void xxxxx::OnFileOpen()
{
// 画像読み込み処理
...
...
...
if (読み込み成功)
{
// スクロールバーの解除
LONG dwStyle = ::GetWindowLong(this->m_hWnd, GWL_STYLE);
if ((dwStyle & WS_HSCROLL) == WS_HSCROLL)
{
dwStyle &= ~WS_HSCROLL;
}
if ((dwStyle & WS_VSCROLL) == WS_VSCROLL)
{
dwStyle &= ~WS_VSCROLL;
}
::SetWindowLong(this->m_hWnd, GWL_STYLE, dwStyle);
}
Invalidate(true);
}
// ウィンドウ再描画メッセージ
void xxxxx::OnPaint()
{
CPaintDC dc(this);
// 読み込んだ画像を縮小する処理
// 縮小した画像を描画する処理
int nWidth = 縮小した画像サイズ(幅);
int nHeight = 縮小した画像サイズ(高さ);
// 縮小した画像に合わせてウィンドウサイズを変更
RECT rect1, rect2;
GetWindowRect(&rect1);
GetClientRect(&rect2);
nWidth += ((rect1.right - rect1.left) - (rect2.right - rect2.left));
nHeight += ((rect1.bottom - rect1.top) - (rect2.bottom - rect2.top));
SetWindowPos(
nullptr,
0,
0,
nWidth,
nHeight,
(SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOMOVE)
);
}
// ウィンドウ変更メッセージ
void xxxxx::OnSize(UINT nType, int cx, int cy)
{
CFrameWnd::OnSize(nType, cx, cy);
LONG dwStyle = ::GetWindowLong(this->m_hWnd, GWL_STYLE);
if (cx < 縮小した画像サイズ(幅))
{
dwStyle |= WS_HSCROLL;
}
else
{
dwStyle &= ~WS_HSCROLL;
}
if (cy < 縮小した画像サイズ(高さ))
{
dwStyle |= WS_VSCROLL;
}
else
{
dwStyle &= ~WS_VSCROLL;
}
::SetWindowLong(this->m_hWnd, GWL_STYLE, dwStyle);
Invalidate(true);
}