![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
VS2005 SP1のMFCでプログラムを作成しています。
OSはWindows XP SP3です。
タブコントロールを使用したダイアログベースです。
タブの切り替えによりコントロールを配置した子ウィンドウ(実際はダイアログ)を表示させたり、非表示にさせたりしています。
■配置と親子関係
ダイアログ:(1)
↓(の上に)
タブコントロール:(2)((1)が親)
↓(の上に)
ダイアログ:(3)((1)が親)
↓(の上に)
リストコントロール:(4)((3)が親)
■現象
本プログラムを別のウィンドウで隠し、ALT+TAB等で、フォアグラウンドに持ってきた場合に、(4)のリストコントロールが再描画されません。
※リストコントロールでアイテムを選択した状態でないと発生しない模様
ただし配置と親子関係で示した構成は2組あり、1組はリストコントロールのリソースプロパティで、TransparentをTUREにすることにより現象が解消されました。(たぶん最後にリストコントロールが描画されるようになった)
しかし、2組目は同じ対策をとっても現象が起こってしまいます。
画面切り替わり時によくみていると、リストコントロールが一瞬みえてから消えてるので、別の何かが上書き描画により消えていると思われます。
対策として、
OnPaint()にてリストコントロールをInvalidate()すれば解消されることはされるのですが、ツールバーにツールチップが表示するだけで、リストコントロールの再描画が発生してチラつきます。
説明が長くなってしまいましたが、どなたか良い解決策をご教授お願いします。
最後まで読んで頂き、有難う御座います。
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
こんばんは。
一応書いてある通りに作成して試してみましたが、不具合の再現が出来ませんでした。
ただ、当方はVC60MFCで実験しているので、VC2005MFCとは事例が異なるかもしれませんが・・・。以下参考意見程度に。
症状から見て、リストコントロールがオーナードローになっており、その描画経路が不完全な為、再描画の際に画面が壊れたりするトラブルを起こしているのでは? ・・・と、何となく想像しました。
↓此のメンバの中でトラブルを起こしているとか・・・
void CMyListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
}
後は、タブを押して子ウィンドウダイアログを切り替えた時に、以前の子ウィンドウダイアログ上のリストコントロールにフォーカスが設定されっぱなしになっているとか・・・。
ただ、此れに関して、描画の不具合との因果関係は不明です(しかし放置しておくと厄介)。
その他、気になったのが「ダイアログ:(3)((1)が親)」になっている辺りでしょうか。
ダイアログ:(3)の親をタブコントロールにして見ては?(当方の実験ではタブコントロールを親に設定しています)。う~む。
切り替えはこんな感じにしています。
//選択中のタブに関連付けた子ウィンドウダイアログのポインタを取る(constメンバへ転送)
CDialog* CComplexTab::GetCurrentPageDlg()
{
return const_cast<CDialog*>(static_cast<const CComplexTab*>(this)->GetCurrentPageDlg());
}
//こっちが本体
const CDialog* CComplexTab::GetCurrentPageDlg() const
{
//選択中のタブ番号を取る
const int iSel = TabCtrl_GetCurSel(this->GetSafeHwnd());
//タブに関連付けたアイテムを取る
TCITEM tabItem = {TCIF_PARAM};
this->GetItem(iSel, &tabItem);
//キャストして返す
return reinterpret_cast<CDialog*>(tabItem.lParam);
}
/////////////////////////////////////////////////////////////////////////////
// CComplexTab メッセージ ハンドラ
void CComplexTab::OnSelchanging(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
//選択中のタブのアイテムデータを取る
CDialog* pDlg = this->GetCurrentPageDlg();
//子ウィンドウダイアログを隠す
pDlg->ShowWindow(SW_HIDE);
*pResult = 0;
}
void CComplexTab::OnSelchange(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
//選択中のタブのアイテムデータを取る
CDialog* pDlg = this->GetCurrentPageDlg();
//子ウィンドウダイアログを表示
pDlg->ShowWindow(SW_SHOW);
//タブのハンドルにフォーカスを設定する(以前のリストコントロールにフォーカスが有った場合、そのフォーカスを逃がす為)
::SetFocus(pNMHDR->hwndFrom);
*pResult = 0;
}
回答が遅くなってしまい申し訳ありません。
オーナードローは使用してませんが、カスタムドローを使用してます。
が、使用を止めても解消されませんでした。
タブコントロールを親にしてみますと、
なぜか画面切り替えでフォアグラウンドへもってきたときにダイアログ全体が再描画されなくなってしまいました。
やり方がまずかったのでしょうか・・・
タブの切り換え処理に関しましても、ご提示いただいた処理にしてみましたが、特に現象はかわりませんでした。
わざわざテストプログラムまで作成して頂き、有難うございました。
No.1
- 回答日時:
成功している1組目と、失敗している2組目で、各コントロールの表示順序や作成順序に違いが無いか確認してみて下さい。
他のGUIフォームエディタが付いたコンパイラだと、ビジュアルコントロールを「背面に移動」「前面に移動」させたり、非ビジュアルコントロールの作成順序を指定したり出来ます。
また、親コントロールからの継承にも、何か違いが無いか確認してみて下さい。
この辺りの「何か」が異なるので、1組目と2組目で異なる挙動をしているのだと思われます。
回答有難う御座います。
2組のコントロールの違いについてはリソースのプロパティが同じであることは確認しております。
親コントロールからの継承もコーディング上でも同じ作りにしましたし、SPI++で見ても同じなのです。(T-T)
VS2005には「前面に移動」といった設定はないですよね?
SetWindowPos()で前面にしてもだめでした。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・「I love you」 をかっこよく翻訳してみてください
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・昔のあなたへのアドバイス
- ・かっこよく答えてください!!
- ・あなたが好きな本屋さんを教えてください
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・【大喜利】【投稿~8/27】 こんなガソリンスタンド二度と来るか!なぜそう思った?
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・【お題】動物のキャッチフレーズ
- ・【お題】甲子園での思い出の残し方
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・自分用のお土産
- ・人生で一番お金がなかったとき
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・ちょっと先の未来クイズ第1問
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コントロールの書式設定で、“コ...
-
EXCEL VBAでwebページを保存す...
-
ActiveXコントロールを.NETにイ...
-
エクセルのコントロールツール...
-
コモンダイアログコントロール...
-
連続で印刷すると画像が更新さ...
-
エクセル - リストボックスのマ...
-
VB6でタブコントロールが見つか...
-
タブコントロール上のリストコ...
-
WS_TABSTOPが機能するコントロ...
-
C++とWin32APIでタブコントロー...
-
DateTimePickerでに年月までし...
-
VB.NETのTabControlについて
-
フォームでPDFを表示させた...
-
Visual Basic のツールボックス
-
警告表示を非表示にしたい
-
マインクラフト(pc版)で座標...
-
エクセルで作った新しいウイン...
-
エクセルである行が急に消えて...
-
MFC ビットマップ描画で残像が残る
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コントロールの書式設定で、“コ...
-
エクセルのコントロールツール...
-
DateTimePickerでに年月までし...
-
スピンボタンを右クリックして...
-
フォームでPDFを表示させた...
-
ActiveXコントロールを.NETにイ...
-
コモンダイアログコントロール...
-
連続で印刷すると画像が更新さ...
-
警告表示を非表示にしたい
-
エクセル - リストボックスのマ...
-
ダイアログボックスのボタンコ...
-
TabControlとToolBarの背景色変更
-
文字色を変えたい(ACCESS VBA)
-
Excel VBAでのMultipageの選択
-
EXCELVBA リストボックスで選択...
-
ワードのドロップダウンリスト
-
WM_SIZEを発生させる方法
-
CEdit の内容が変わった時にメ...
-
VBAでリストボックス内で↑↓の操...
-
リストコントロール(MFC or API...
おすすめ情報