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で質問しましょう!
似たような質問が見つかりました
- その他(Microsoft Office) EXCELでバーコードを作成すると白くなってコードが見えません 1 2022/04/04 14:24
- C言語・C++・C# ActiveXコントロールを.NETにインポートできない??? 2 2023/05/02 02:50
- Excel(エクセル) コントロールにリンクするセルが選択されない 3 2022/06/12 14:37
- Excel(エクセル) エクセルについて教えてください。 2 2023/06/14 11:11
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- AJAX 自作の地図をグーグルマップのようにしたい 3 2022/11/15 11:53
- Visual Basic(VBA) Excel(VBA) 特定の条件に該当する行の値、書式を同じセルにコピ&ペーストしたいです 1 2022/05/21 18:18
- Chrome(クローム) 最近Win10にてブラウザが左にスッと隠れていく現象に悩まされてます 3 2023/07/22 23:11
- その他(プログラミング・Web制作) このプログラミングをどう組みますか? Googlecolabでやってるんですが、出来る方お願いします 1 2022/07/13 10:52
- 夫婦 夫の自由度について 14 2023/08/21 23:46
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
画面を強制的に再描画させる方法
C言語・C++・C#
-
LRESULTとHRESULT
C言語・C++・C#
-
CStringをwchar_tに変換したい
C言語・C++・C#
-
-
4
EDITコントロールで入力できる文字を制限するには?
C言語・C++・C#
-
5
ボタンのオーナードローについて
C言語・C++・C#
-
6
リストビューの選択状態を取得するメッセージはありますか?
C言語・C++・C#
-
7
ビジュアルC++でボタンの有効/無効
C言語・C++・C#
-
8
MFCでOnPaintのタイミング
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コントロールの書式設定で、“コ...
-
ActiveXコントロールを.NETにイ...
-
フォームでPDFを表示させた...
-
DateTimePickerでに年月までし...
-
スピンボタンを右クリックして...
-
エクセルのコントロールツール...
-
プロパティシートのタブの名前...
-
Accessのタブコントロールを2...
-
リストコントロール(MFC or API...
-
コードでスクロールバーを操作...
-
タブコントロールのオブジェク...
-
コモンダイアログコントロール...
-
MFC・ダイアログベースで、ダイ...
-
VisualStudio MFC変数が追加で...
-
ActiveXコントロールの...
-
VB6.0のデザイン時 コントロー...
-
VB タブページの自動切り替え...
-
CTreeCtrlのノードごとにアイコ...
-
エクセル - リストボックスのマ...
-
CPropertySheetのタブオーダー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コントロールの書式設定で、“コ...
-
エクセルのコントロールツール...
-
DateTimePickerでに年月までし...
-
スピンボタンを右クリックして...
-
連続で印刷すると画像が更新さ...
-
フォームでPDFを表示させた...
-
ActiveXコントロールを.NETにイ...
-
エクセル - リストボックスのマ...
-
コモンダイアログコントロール...
-
TabControlとToolBarの背景色変更
-
EXCELVBA リストボックスで選択...
-
警告表示を非表示にしたい
-
CEdit の内容が変わった時にメ...
-
ワードのドロップダウンリスト
-
リストボックスの同期
-
文字色を変えたい(ACCESS VBA)
-
VScrollBarの点滅を何とかしたい。
-
C#でChartコントロールを...
-
Excel VBAでのMultipageの選択
-
C++6.0でのresource.hについて
おすすめ情報