CMFCMenuBarが勝手に複数段になる – 固定ページ 2 – プログラミング – Home

CMFCMenuBarが勝手に複数段に...
 
通知
すべてクリア

[解決済] CMFCMenuBarが勝手に複数段になる

固定ページ 2 / 2

えーと
 えーと
(@えーと)
ゲスト
結合: 19年前
投稿: 54
 

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();
}
}


返信引用
えーと
 えーと
(@えーと)
ゲスト
結合: 19年前
投稿: 54
 

OnDisplayChange()の
処理の最後に
return __super::OnDisplayChange( wParam, lParam );
を追加してください。

貼り付けし忘れました。


返信引用
えーと
 えーと
(@えーと)
ゲスト
結合: 19年前
投稿: 54
 

更にコメント
アイコンを最小に置き換えてください。

また、
// アイコン状態で、解像度変更後1回目はデフォルト処理とする

// 最小から状態変更で、解像度変更後1回目
// および、最大化(最小からの復元以外)
です。

何度もすみません。T.T)


返信引用
NOR
 NOR
(@NOR)
ゲスト
結合: 23年前
投稿: 128
Topic starter  

えーとさん、本当にありがとうございます。
教えていただいたルーチンで、前述の問題も発生しなくなりました。

> 最大化→最小化→解像度変更→最大化
> 通常→最小化→解像度変更→復元
> など、アイコン状態で解像度変更してから、復元や最大を
> 行う時にも発生します。

これは全く考えていませんでした。
教えていただきありがとうございます。

この処理は今後作成するアプリケーションでも必要になってくるでしょうから、
CFrameWndExを派生させたクラスを用意し、その中に今回の処理を入れ、
CMainFrameは常にこのクラスから派生するようにしようかと思います。


返信引用
固定ページ 2 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました