• 締切済み

タブコントロール上のリストコントロール(再描画されない)

VS2005 SP1のMFCでプログラムを作成しています。 OSはWindows XP SP3です。 タブコントロールを使用したダイアログベースです。 タブの切り替えによりコントロールを配置した子ウィンドウ(実際はダイアログ)を表示させたり、非表示にさせたりしています。 ■配置と親子関係 ダイアログ:(1)  ↓(の上に) タブコントロール:(2)((1)が親)  ↓(の上に) ダイアログ:(3)((1)が親)  ↓(の上に) リストコントロール:(4)((3)が親) ■現象 本プログラムを別のウィンドウで隠し、ALT+TAB等で、フォアグラウンドに持ってきた場合に、(4)のリストコントロールが再描画されません。 ※リストコントロールでアイテムを選択した状態でないと発生しない模様 ただし配置と親子関係で示した構成は2組あり、1組はリストコントロールのリソースプロパティで、TransparentをTUREにすることにより現象が解消されました。(たぶん最後にリストコントロールが描画されるようになった) しかし、2組目は同じ対策をとっても現象が起こってしまいます。 画面切り替わり時によくみていると、リストコントロールが一瞬みえてから消えてるので、別の何かが上書き描画により消えていると思われます。 対策として、 OnPaint()にてリストコントロールをInvalidate()すれば解消されることはされるのですが、ツールバーにツールチップが表示するだけで、リストコントロールの再描画が発生してチラつきます。 説明が長くなってしまいましたが、どなたか良い解決策をご教授お願いします。 最後まで読んで頂き、有難う御座います。

noname#74694
noname#74694

みんなの回答

回答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; }

noname#74694
質問者

お礼

回答が遅くなってしまい申し訳ありません。 オーナードローは使用してませんが、カスタムドローを使用してます。 が、使用を止めても解消されませんでした。 タブコントロールを親にしてみますと、 なぜか画面切り替えでフォアグラウンドへもってきたときにダイアログ全体が再描画されなくなってしまいました。 やり方がまずかったのでしょうか・・・ タブの切り換え処理に関しましても、ご提示いただいた処理にしてみましたが、特に現象はかわりませんでした。 わざわざテストプログラムまで作成して頂き、有難うございました。

  • chie65535
  • ベストアンサー率43% (8512/19352)
回答No.1

成功している1組目と、失敗している2組目で、各コントロールの表示順序や作成順序に違いが無いか確認してみて下さい。 他のGUIフォームエディタが付いたコンパイラだと、ビジュアルコントロールを「背面に移動」「前面に移動」させたり、非ビジュアルコントロールの作成順序を指定したり出来ます。 また、親コントロールからの継承にも、何か違いが無いか確認してみて下さい。 この辺りの「何か」が異なるので、1組目と2組目で異なる挙動をしているのだと思われます。

noname#74694
質問者

お礼

回答有難う御座います。 2組のコントロールの違いについてはリソースのプロパティが同じであることは確認しております。 親コントロールからの継承もコーディング上でも同じ作りにしましたし、SPI++で見ても同じなのです。(T-T) VS2005には「前面に移動」といった設定はないですよね? SetWindowPos()で前面にしてもだめでした。

関連するQ&A

  • タブコントロール上のピクチャーコントロールへの描画

    お世話になっております。 VC2005を使用しております。 SDIベースです。 ダイアログを作成し、その上にタブコントロール(2ページ)を作成しました。 タブコントロールの1ページ目にピクチャーコントロールを配置し、ピクチャーコントロール上に描画を行おうと思うのですが、正常に動作しません。 OnPaintの中で描画を行っているのですがだめのようです。 タブコントロール外に、ピクチャーコントロールを配置すると描画する事ができます。 どのような、タイミングで描画を行えばよいのでしょうか? 教えてください。 よろしくお願いします。

  • VC++ VS2005 タブコントロールに貼り付けたリストコントロールが消える

    こんばんは。 早速ですが質問です。 VC++ .NET MFCプロジェクトで リソースエディタでダイアログにタブコントロールを貼り付け(1)、 そこに同じようにリソースエディタでリストコントロールとボタンを 貼り付けたダイアログを作りました(2)。 1のタブコントロール上に2をソースで貼り付け 表示させ、2のInitDialogとボタンクリックのイベントを作成して Listコントロールに値を入れるということをしたのですが リストコントロールの表示が消えてしまいます。 マウスでリストコントロールが貼りついている位置にカーソルを当てるとその部分がでてきます。 原因のお分かりになるかたご回答よろしくお願いします。

  • コントロールの上に描画

    Visual C# Express Edition で開発を行っています。 ユーザーコントロールで前景(背景の逆という意味で・・)を描画したくて困っています。 どういうことかというと、ユーザーコントロール上にボタン・リストボックス等を配置して、それらの上に1枚の大きな絵を半透明で描画したいのです。 ユーザーコントロールのOnPaintやPaintイベントで描画しても背景としてしか描画されず、描画された絵の上にコントロールが乗ってしまいます。 上記処理の実現方法がありましたら、教えて下さい。

  • タブコントロールに貼り付けられたコントロールの移動

    VB2008でタブコントロールに貼り付けられたテキストボックス等の移動について悩んでいます。 現在、タブコントロール内にタブが3ページありますが、 1ページ目に貼り付けたコントロール(ラベルやテキストボックスなど)を2ページ目にプログラム的に移動するにはどうすればいいのでしょうか。 デザイナであれば簡単なのですが、プログラムで行おうとすると 「move」に相当するようなものが見あたらず、困っています。 移動したものをプログラム終了後も保存しておく必要は無く、起動時にユーザーの好みのタブに表示させたいという目的で使用するつもりです。

  • VC++ タブコントロールについて

    以下の環境にてタブコントロールを実装しようとしています。 ・VisualStudio2008 VC++ ・ネイティブ(.NET未使用) ・ダイアログベース、スタティックライブラリ タブを表示させるメインダイアログと他に、子ダイアログ3つを用意して タブが押されたときに表示をON/OFF(ShowWindow使用)させるものを作ったのですが、 以下の問題が出ています。 うまい対策または、タブコントロールの文献で参考になるサイトを教えてください。 [現象と質問] ・メインダイアログを移動させると子ダイアログが追従しない。  → OnPaint()にてOnTcnSelchangeSelectTab()を呼ぶようにしたら追従しましたが、    すばやくダイアログを動かすと、子ダイアログが遅れてついてくるように見えてしまいます。    子ダイアログを追従させるうまい方法(本来のやりかた)はどうすればよいでしょうか。 ・子ダイアログをクリックすると、メインダイアログのタイトルが薄くなる(裏に隠れるような感じ)。  → メインダイアログと子ダイアログのプロパティの組み合わせでなんとかなると思っていますが、    どのようにしたらいいのか、てこずっています。    アドバイスをいただけたらと思います。

  • タブコントロールについて

    VB2008でフォームにタブコントロールを配置しました。 このタブの、ページ1にテキストボックスを作成しました。 当然ですが、 ページ2に切り替えた時には、テキストボックスが表示されません。 このテキストボックスを、どのページに切り替えた時でも表示するにはどのようにすれば良いのでしょぅか。 よろしくお願いします。

  • MFCでのリストコントロール

    現在VisualStudio.NET2005を使ってダイアログベースでプログラムを組んでいます。 その中でリストコントロールを配置しており、表形式で表示しています。 普通だったら実行してリスト上にあるデータをクリックすると背景が青になり、選択された状態になりますよね? それをクリックしても選択されないようにしたいのです。 プロパティで簡単にできるかと思ったらそうでもなさそうで・・・。 SetExtendedStyleでも使うのかな?と思って、 調べたのですが、ちょっとわからなかったので、 教えて頂きたいのです。 よろしくお願いします。

  • C++とWin32APIでタブコントロールを作成するには

    C++のWin32APIで、MFCを使わずに、 ダイアログボックスの中にタブコントロールを実装したいのですが、 その方法が解らず困っています。 とりあえずウインドウにタブコントロールを 付ける事まではできたものの、 (MFCを使用しない方法で)ダイアログボックスの中に 表示させる方法が見つからないのです・・・。 VisualStudioを使用しているので、 ツールボックスの中にある「Tab Control」というものを ダイアログボックスの中に貼り付けてみましたが、 [Tab1]~[Tab5]までありますが見た目上だけのものなので、 当然実行してもそこには何もありません。 (項目も、タブを切り替える処理も追加してないので 当たり前ですよね^^;) この方法はやはりMFCを使用しないと無理なのでしょうか? もし方法がございましたら、どうかご伝授をよろしくお願いします

  • VC++ のタブオーダーについて

    親ダイアログにタブコントロールを貼り付け、その中でエディットボックスや リストボックスで入力出来るようになっています。 タブコントロールの中でのタブ移動はタブオーダーの順に進むのですが、 親ダイアログにあるOKボタン、キャンセルボタンにタブキーで移動が 出来ません。(フォーカスが飛んでくれません) ダイアログのプロパティでコントロール、親ダイアログの管理など やってみたのですが、分かりません。組み合わせが悪いのでしょうか? よろしくお願いします。

  • Accessのタブコントロールを2行にしたい

    OS:2000 Office:2000 Accessを組んでいます。フォームにタブコントロールを配置して1ページ目、2ページ目、3ページ目と追加をしていきました、ページ数が多いのでタブが全て表示されません、2段にして全てのタブを表示したいのですが、出来ません。 教えて下さい<(_ _)>

専門家に質問してみよう