NORさん
>これは連打問題とは関係無い流れに対しての副作用なのですが、
>最大化していない状態から最小化状態とし、
>タスクバーを右クリックして「最大化」をいきなり選ぶと、
>状態がおかしくなってしまいました(内部領域が広がらない)。
投稿した後に気づきました。
更に対応したものを作ろうかと思っていたところです。
もう1つ問題があります。
最大化→最小化→解像度変更→最大化
通常→最小化→解像度変更→復元
など、アイコン状態で解像度変更してから、復元や最大を
行う時にも発生します。
>これはCFrameWndExの状態などから区別できますでしょうか?
残念ながら登録されているメンバ変数などからは判定できません。
ですが、m_bWasMaximized変数をアイコンになるとき、
その前の状態を保持するという意味にすれば対処できますし、
別のメンバを宣言して、前の状態を保持しておいてもいいかと思います。
残念ながらOnSize()だけでは対処できませんでしたが、以下のように
すればなんとかいけそうです。
そちらでもテストしてみてください。
1.CMainFrameのメンバに
BOOL m_bResetFrame;
を追加し、コンストラクタでFALSEを指定
※変数名は自由に決めてください。
2.OnSize()を処理し
// 復元および通常操作 ※アイコン状態で解像度が変更されていない場合
if(( !m_bResetFrame ) &&
(( nType == SIZE_RESTORED && !m_bWasMaximized ) ||
( nType == SIZE_MAXIMIZED && m_bIsMinimized && m_bWasMaximized ))){
CDockingManager::m_bDisableRecalcLayout = TRUE;
CFrameWndEx::OnSize(nType, cx, cy);
CDockingManager::m_bDisableRecalcLayout = FALSE;
// アイコン化の場合、前の状態(最大化)をm_bWasMaximizedに設定
} else if( nType == SIZE_MINIMIZED ){
BOOL bMaximized = m_bWasMaximized;
CFrameWndEx::OnSize(nType, cx, cy);
m_bWasMaximized = bMaximized;
// アイコン状態で、解像度変更後1回目はデフォルト処理とする
} else {
CFrameWndEx::OnSize(nType, cx, cy);
}
m_bResetFrame = FALSE;
3.OnDisplayChange()を処理し、(WM_DISPLAYCHANGEを手動で登録)
if( !(m_bResetFrame = IsIconic()) ){
// 解像度変更で最大->最大は既に再計算されているので、通常の大きさのときのみ
行う
if( !m_bWasMaximized ){
RecalcLayout();
}
}
OnDisplayChange()の
処理の最後に
return __super::OnDisplayChange( wParam, lParam );
を追加してください。
貼り付けし忘れました。
更にコメント
アイコンを最小に置き換えてください。
また、
// アイコン状態で、解像度変更後1回目はデフォルト処理とする
を
// 最小から状態変更で、解像度変更後1回目
// および、最大化(最小からの復元以外)
です。
何度もすみません。T.T)
えーとさん、本当にありがとうございます。
教えていただいたルーチンで、前述の問題も発生しなくなりました。
> 最大化→最小化→解像度変更→最大化
> 通常→最小化→解像度変更→復元
> など、アイコン状態で解像度変更してから、復元や最大を
> 行う時にも発生します。
これは全く考えていませんでした。
教えていただきありがとうございます。
この処理は今後作成するアプリケーションでも必要になってくるでしょうから、
CFrameWndExを派生させたクラスを用意し、その中に今回の処理を入れ、
CMainFrameは常にこのクラスから派生するようにしようかと思います。