MFCタブコントロールのグラデーション描画

このQ&Aのポイント
  • VC++2010・MFC環境でMFCのタブコントロールのウィンドウ部をグラデーション描画したい。現在の描画ではタブ切り替え時にちらつきが発生している。
  • ソースコードにはタブ切り替え時の処理とウィンドウのアクティブ/非アクティブ時の処理が含まれている。
  • ちらつきの原因と対処方法、または別の方法について教えて欲しい。
回答を見る
  • ベストアンサー

MFCタブコントロールのグラデーション描画

現在、VC++2010・MFC環境でMFCのタブコントロールのウィンドウ部(?)をグラデーション描画にしたいと考えています。 完成予想としては、Excelのメニュー(?)みたいな感じでグラデーションがかかるような感じにしたいのですが、現在、グラデーションの描画は何とか(たぶん無理やり)できましたが、タブを切替たり、ダイアログ自体が非アクティブ/アクティブを繰り返すとちらついてしまいます。 ソースは以下のようになっています。 ----------------------------------------------------------------- void CTabGradDlg::OnTcnSelchangeTab(NMHDR *pNMHDR, LRESULT *pResult) { // TODO: ここにコントロール通知ハンドラー コードを追加します。 int sel = m_xcTab.GetCurSel(); m_edit1.ShowWindow(SW_HIDE); m_edit2.ShowWindow(SW_HIDE); m_button1.ShowWindow(SW_HIDE); m_button2.ShowWindow(SW_HIDE); switch(sel) { case 0: m_edit1.ShowWindow(SW_SHOW); m_button1.ShowWindow(SW_SHOW); break; case 1: m_edit2.ShowWindow(SW_SHOW); m_button2.ShowWindow(SW_SHOW); break; } Invalidate(); *pResult = 0; } void CTabGradDlg::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized) { CDialogEx::OnActivate(nState, pWndOther, bMinimized); // TODO: ここにメッセージ ハンドラー コードを追加します。 switch( nState ) { case WA_INACTIVE : // 非アクティブ break; case WA_ACTIVE : // (マウスをクリックする以外の方法) アクティブ case WA_CLICKACTIVE : // (マウス クリック)アクティブ Invalidate(); break; } } ----------------------------------------------------------------- Invalidate();が原因でちらついていることまでは分かっているのですが、 なぜちらつくのか?ということと、対処方法もしくは別の方法はないのか? 別の方法があればどういったことなのか?ということが知りたいです。 初心者(小学生並み)にもわかるように教えていただければ幸いです。 宜しくお願いします。

noname#147446
noname#147446

質問者が選んだベストアンサー

  • ベストアンサー
  • zwi
  • ベストアンサー率56% (730/1282)
回答No.7

クラスビューでCTabXxxCtrlを選んでプロパティを開きます。 プロパティにアイコンでメッセージというのがあるので、そこでWM_PAINTを選べばOnPaint()が作成されます。 どういう事に成るかは作って見れば分かりますが、ここで描画すればチラつくことはなくなると思いますが以前に書いた通りすごく面倒です。 >この場合はタブ・ボタンも全て自分で書く必要があります。 書くではなく正確に言うと描くですね。失礼しました。 OnPaint()を作ってみれば分かります。 どうやって描くかというとCDCクラスのメンバ関数を駆使して下さいとしか言えません。すごく面倒ですけどね。 なお、C++の勉強はMFCをやる以上は避けられないので入門書を購入して勉強してくださいとしか言えません。

noname#147446
質問者

お礼

ありがとうございます。 >クラスビューでCTabXxxCtrlを選んでプロパティを開きます。 >プロパティにアイコンでメッセージというのがあるので、そこでWM_PAINTを選べばOnPaint()が作成されます。 >どういう事に成るかは作って見れば分かりますが、ここで描画すればチラつくことはなくなると思いますが以前に書いた通りすごく面倒です。 上記手順で作成したら、作成できました。ありがとうございます。 OnPaintに何もコードを書かずにデバッグ確認したら、タブすらも表示されませんでした。 それが >>この場合はタブ・ボタンも全て自分で書く必要があります。 ということですね? >なお、C++の勉強はMFCをやる以上は避けられないので入門書を購入して勉強してくださいとしか言えません ネットに転がっているものを参考に勉強するだけでは、不十分なのでしょうか? 当初の目的はグラデーション描画についてのことでしたので、ベストアンサーを付けさせていただきます。

その他の回答 (6)

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.6

見てみたところ問題点はCTabGradDlg::OnDrawItemで強引に描画している所の様です。 m_xcTabの宣言が CTabCtrl m_xcTab; に成っていると思いますが、CTabCtrlを継承したクラスを新規に作成してそのクラス名としてください。 CTabXxxCtrl m_xcTab; と宣言に書き換えます。CTabXxxCtrlはCTabCtrlを継承した新規のクラスです。 その新たなクラスであるCTabXxxCtrlクラスのOnPaint()でオーナードローします。この場合はタブ・ボタンも全て自分で書く必要があります。これは実に面倒なので私としては前に書いたタブボタンだけを使う方法をお勧めします。 継承が分からない事言うことでしたらC++をちゃんと勉強して下さい。C言語の知識だけではMFCを扱えません。

noname#147446
質問者

お礼

ありがとうございます。 >CTabCtrlを継承したクラスを新規に作成してそのクラス名としてください。 >CTabXxxCtrl m_xcTab; >と宣言に書き換えます。CTabXxxCtrlはCTabCtrlを継承した新規のクラスです。 >その新たなクラスであるCTabXxxCtrlクラスのOnPaint()でオーナードローします。 CTabCtrlのクラスを作成し、宣言の書き換えはできました。 しかし、『CTabXxxCtrlクラスのOnPaint()でオーナードローします。』がよくわかりません。 クラスを作成しただけではOnPaint()は存在しませんよね? メッセージマップ(?)にも何も書いてないし。。。自分でOnPaint()作ればいいのでしょうか? また、『OnPaint()でオーナードローする。』とはどういうことでしょうか? >この場合はタブ・ボタンも全て自分で書く必要があります。 タブ・ボタンも全て自分で書くというのは、どういうことでしょうか? 自力で調べたりしましたが、未だに『書く』といったことが何を指しているのかよくわかりません。。。 >継承が分からない事言うことでしたらC++をちゃんと勉強して下さい。C言語の知識だけではMFCを扱えません。 そうですね、その通りです。ご不便をおかけしてすみません。 以前に少しだけ習ったのですが、習ってからだいぶ期間が開いていたので、ほとんど忘れてしまいました。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.5

次々新事実が出てくるのでソースコードを添付した貰った方が良いと思います。 勘だけで答えるのは限度があります。

noname#147446
質問者

お礼

ありがとうございます。 >次々新事実が出てくるのでソースコードを添付した貰った方が良いと思います。 そうですね。何分、初めて質問投稿させていただいたので、何をどう伝えたらいいかわかりませんでした。すみません。 以下、最初の質問以外のソースコードです。(OnPaintとオーナードローの描画についてのみ) void CTabGradDlg::OnPaint() { CDialog::OnPaint(); CTabCtrl *pTabCtrl =(CTabCtrl *)GetDlgItem(IDC_TAB); //--------------------------------- // デバイスコンテキスト(DC)作成 //--------------------------------- CWnd* pWnd = GetDlgItem(IDC_TAB); CDC* dc = pWnd->GetDC(); //--------------------------------- // ダミーデバイスコンテキスト(DC)作成 // ビットマップ作成 //--------------------------------- CDC dcDmy; dcDmy.CreateCompatibleDC(dc); CBitmap bmpDmy; //--------------------------------- // クライアント領域取得 //--------------------------------- CRect rect; GetClientRect(&rect); // クライアント領域の座標取得 pTabCtrl->AdjustRect(FALSE, &rect); //--------------------------------- // 裏描画画面作成 //--------------------------------- bmpDmy.CreateCompatibleBitmap(dc, rect.Width(), rect.Height()); dcDmy.SelectObject(&bmpDmy); //--------------------------------- // 256色の配列レコード作成 //--------------------------------- int segments = 255; DWORD* dwBits = new DWORD[segments]; for(int i = 0; i < segments; ++i) { dwBits[i] = (DWORD)RGB(0xFF - i, 0xFF - i, 0xFF - i); }; //--------------------------------- // 32ビットの1ピクセル幅ビットマップ // と255ピクセル作成 //--------------------------------- HBITMAP hBitmap = ::CreateBitmap(1, segments, 1, 32, dwBits); delete [] dwBits; //--------------------------------- // パターンブラシ作成(グラデーション) //--------------------------------- CBrush brush; brush.CreatePatternBrush(CBitmap::FromHandle(hBitmap)); CBrush* oldbrush = (CBrush*)dcDummy.SelectObject(&brush); //--------------------------------- // パターンブラシ作成(フレーム) //--------------------------------- CBrush frmbrush; frmbrush.CreateSolidBrush(RGB(255, 255, 255)); //--------------------------------- // パターンブラシで四角形描画 //--------------------------------- CRect frmrect; frmrect = rect; frmrect.top = 0; frmrect.left = 0; dcDummy.Rectangle(frmrect); dcDummy.FrameRect(frmrect, &frmbrush); dcDummy.SelectObject(oldbrush); //--------------------------------- // ブラシの破棄 //--------------------------------- frmbrush.DeleteObject(); // ブラシの破棄 brush.DeleteObject(); // ブラシの破棄 //--------------------------------- // 貼り付け //--------------------------------- dc->BitBlt(rect.left , rect.top , rect.Width(), rect.Height(), &dcDmy, 0, 0, SRCCOPY); //--------------------------------- // メモリの解放 //--------------------------------- dcDmy.DeleteDC(); bmpDmy.DeleteObject(); pWnd->ReleaseDC(dc); //CDCを解放 } //************************************************************** // TabGradDlgのオーナードロー //************************************************************** void CTabGradDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpdis) { if(lpdis->CtlType == ODT_TAB) { CTabCtrl *pTabCtrl = (CTabCtrl *)GetDlgItem(IDC_TAB); //--------------------------------- // デバイスコンテキスト(DC)作成 //--------------------------------- CDC *dc = CDC::FromHandle(lpdis->hDC); ・・・・ // 以下、OnPaint()と同様 ・・・・ //--------------------------------- // タブの文字列表示(ブラシ破棄後実装) //--------------------------------- TC_ITEM tcItemGet; TCHAR buffer[256] = {0}; tcItemGet.pszText = buffer; tcItemGet.mask = TCIF_TEXT; tcItemGet.cchTextMax = 256; m_xcTab.GetItem(lpdis->itemID, &tcItemGet); CRect Rect = lpdis->rcItem; Rect.left += 3; Rect.top += 3; dc->DrawText(tcItemGet.pszText, -1, Rect, DT_END_ELLIPSIS); ・・・ // 貼りつけ、メモリ解放 } } あと、他のソースコードは、質問に添付してあったOnActivateとOnTcnSelchaneTabです。 それ以外は、特にコードを書いていません。 宜しくお願いします。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.4

試して見ましたが、CDialogを継承したCXXXDlg上でOnPaint()で描画したものはチラつきません。タブコントロールは、CXXXDlgのダイアログ上に有るものとします。 普通にやるとタブコントロールがタブ以外の部分も白く描画してしまうので、タブボタンを残してリソースエディタ上でサイズを縮めてやりました。 こういう状態では無いんですよね? あとの方法は、CTabCtrlクラスを継承して継承クラスのOnPaint()でオーナードローする方法ですがタブボタンまで自分で書かなくてはいけないので面倒です。

noname#147446
質問者

お礼

ありがとうございます。 >普通にやるとタブコントロールがタブ以外の部分も白く描画してしまうので、タブボタンを残してリソースエディタ上でサイズを縮めてやりました。 >こういう状態では無いんですよね? 『タブボタンを残して』の意が読み取れませんでした。 リソースエディタ上でタブコントロールのサイズを小さくするといったことでいいんですかね? そうだとすると、そういう状態ではないです。 >あとの方法は、CTabCtrlクラスを継承して継承クラスのOnPaint()でオーナードローする方法ですがタブボタンまで自分で書かなくてはいけないので面倒です。 『CTabCtrlクラスを継承して継承クラスのOnPaint()でオーナードロー』とはどういった方法なのでしょうか? 記述し忘れていましたが、現在、タブコントロールはオーナードローにしていて、オーナードロー内でもグラデーションの描画をしています。 なので、《オーナードローで描画》・《OnPaintで描画》するようになっています。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.3

すいません状況を整理させて下さい。 まとめると ・タブコントロールは使っているが、各タブ用の子ダイアログは用意していない。 ・OnPaintでグラデーション背景を描いている。 ・OnActiveでInvalidate();して再描画を行わないと再描画されずにウィンドウ画像が崩れる場合がある。 ってことですよね? このOnPaintとOnActiveがあるのはCTabGradDlgですか?で、このCTabGradDlgは何を継承したクラスなのでしょうか?プログラムの作りそのものに問題がある気がしてきました。 各タブ用の子ダイアログを作って各子ダイアログでグラデ背景を描画すれば解決する気がします。

noname#147446
質問者

お礼

ありがとうございます。 >・タブコントロールは使っているが、各タブ用の子ダイアログは用意していない。 その通りです。 >・OnPaintでグラデーション背景を描いている。 OnPaintの他にタブコントロールをオーナードローしているので、そこでもグラデーション描画をしています。 また、背景というより、DCに描画しているような感じです。 >・OnActiveでInvalidate();して再描画を行わないと再描画されずにウィンドウ画像が崩れる場合がある。 『ウィンドウ画面が』というより、『タブコントロールの一部のが』といった感じです。(同じですかね?) >このOnPaintとOnActiveがあるのはCTabGradDlgですか? はい、同じCTabGradDlgです。 >で、このCTabGradDlgは何を継承したクラスなのでしょうか? CDialogEx(CTabGradDlg::IDD, pParent)だと思います。 (いまいち継承の概念が読み込めていないので曖昧です。すみません。) >各タブ用の子ダイアログを作って各子ダイアログでグラデ背景を描画すれば解決する気がします。 その方法も考えたのですが、そうすると、子ダイアログの大きさが統一できないのではないかと思いまして。。 また、その方法だと、子ダイアログの背景をグラデーションにし、子ダイアログにそれぞれボタン等のコントロールを表示するという風になるのでしょうか?

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.2

失礼しましたOnPaintで書いているんですね。OnPaintでInvalidate();すると描画が無限ループになるのでやってはいけません。 ところでWA_ACTIVEやWA_CLICKACTIVEでInvalidate();は必要なのでしょうか?そもそもOnActivate自体いらないのでは?OnActivateが必要になった事ってあまり無いですよ。

noname#147446
質問者

お礼

ありがとうございます。 >ところでWA_ACTIVEやWA_CLICKACTIVEでInvalidate();は必要なのでしょうか? ウィンドウの一部(下記のタブの【*****】部分)が、他のウィンドウの影になって再度ウィンドウをアクティブにした時に、(タブの)影になっていた部分が描画されていなかったので、 ウィンドウがアクティブになったら再度描画しよう。という結果になり、このようなコードになりました。 ______           | タブ1 | タブ2|________ |         **************| |         **************| |         **************|  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ >そもそもOnActivate自体いらないのでは?OnActivateが必要になった事ってあまり無いですよ。 上記にも説明した理由の為OnActivateを使用していましたが、OnActivateを使用する以外で他の方法があるのでしょうか?

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.1

MFCでダイアログ系(タブもダイアログ系)の場合は、OnPaintで描画しないとちらつきますが大丈夫でしょうか?

noname#147446
質問者

お礼

回答ありがとうございます。 >OnPaintで描画しないとちらつきますが大丈夫でしょうか? というのは、OnPaintでInvalidateを実装(?)すればいいのでしょうか? OnPaintでは現在、ダブルバッファリングにてグラデーションの描画をしています。 また、補足としては、タブはダイアログではなく、タブコントロール貼りつけたまま(言い方変?) の状態で、タブ遷移することで、子ダイアログが表示されるといったものではありません。

関連するQ&A

  • 他のプロセスの描画領域を再描画

    他のプロセスの描画領域を再描画 対象となる他のプロセスのウインドウハンドルやデバイスコンテキストは利用可能のようですが再描画の方法をShowWindow(hWnd, SW_HIDE);ShowWindow(hWnd, SW_SHOW);としているために真っ白な状態が見えたりするのでそれを避ける方法を教えてください。

  • VC++のちらつき防止方法

    いつもお世話になっております。 ただいまVC++をもちいてアプリを作っておりますが画面がちらつきを押さえたく、質問させていただきます。 現在、STATICな領域がありまして、その中に文字を書いているのですが、 時間経過とともに文字が変わるものがあります。 その際、背景黒に白文字で以下のようにしています。 ::ShowWindow(hoge,hogehoge,SW_HIDE); ::SetDlgItemText(hoge,hogehoge,text); ::ShowWindow(hoge,hogehoge,SW_SHOW); とやっておりますが、スタティック領域全体が一瞬白くなってから 更新されます。 結構頻繁に更新するので、ちらつきが結構目立ってしまいます。 invalidateなどもやってみたのですが同様にちらついてしまいました。 なんとか改善したいのですが何か方法はありますでしょうか? アドバイスよろしくお願いします。

  • ウィンドウ非表示のちらつきを無くすには

    <環境> WIN98 VC++6.0 MFC SDIにて 起動時に下記にてウィンドウを非表示にしていますが、最初に一瞬表示されてから、消えます。 何事も無かったかのように、こっそりと非表示にするにはどうすればよいですか? BOOL CAbcApp::InitInstance() { 省略 //m_pMainWnd->ShowWindow(SW_SHOW); m_pMainWnd->ShowWindow(SW_HIDE); m_pMainWnd->UpdateWindow(); return TRUE; }

  • ウィンドウハンドルの取得方法について

    よろしくお願いします。 WIN98 VC++6.0 MFC にて 色々勉強しておりますが、今だにウィンドウハンドルの取得方法が良く分かりません。 SDKのサンプルを見ると、なるほどそうするのか。と思いますが、MFCになると分からなくなります。 たとえば、 ウィザードのデフォルトに従いダイアログベースでのプロジェクトを作成し、ボタン1と2を配置します。 以下のコードでボタン1を非表示にできます。 void CPppDlg::OnButton2() { CWnd* pButton1 = GetDlgItem (IDC_BUTTON1); pButton1->ShowWindow(SW_HIDE); } このコードにおいて、 1.SDKの BOOL ShowWindow( HWND hWnd, // handle to window int nCmdShow // show state of window ); を用いて引数が2個の形式に書きかえることは可能でしょうか? 2.可能であれば、具体的にはどう記述すれば良いのでしょうか?

  • ウィンドウにボタンを配置するには?

    VC++6.0、WinXPです CMainFrame::CMainFrame() { CButton myButton1; myButton1.Create( _T("Button"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, CRect(10,10,100,100),this, 100); myButton1.ShowWindow(SW_SHOW); myButton1.UpdateData(); } としてますがビルドはできますが実行中にエラーがでます。何がおかしいのでしょうか? よろしくお願いします。

  • シートの条件選択

    EXCEL2003で下記のようにユーザーフォーム上のオプションボタンと チェックボックスの選択状況に応じてシートを選択するようにしていました が、EXCEL2007で実行したら、「sel_sw」のところで 「コンパイルエラー:プロジェクトおよびライブラリが見つかりません」 とエラーが出てしまいました。 EXCEL2007ではどのように記述すればよいか、教えていただけますでしょうか。 よろしくお願いします。 --------------------------------------------------------------- Private Sub 印刷する_Click() UserForm9.Hide With UserForm9 If .OptionButton1 = False And .OptionButton2 = False Then MsgBox ("オプションボタン選択") GoTo error End If If .CheckBox2 = False And .CheckBox3 = False And .CheckBox4 = False And .CheckBox5 = False Then MsgBox ("チェックボックスを選択") GoTo error Else sel_sw = True If .CheckBox2 = True And .OptionButton1 = True Then Sheets("A").Select sel_sw sel_sw = False End If If .CheckBox2 = True And .OptionButton2 = True Then Sheets("B").Select sel_sw sel_sw = False End If If .CheckBox3 = True And .OptionButton1 = True Then Sheets("C").Select sel_sw sel_sw = False End If If .CheckBox3 = True And .OptionButton2 = True Then Sheets("D").Select sel_sw sel_sw = False End If If .CheckBox4 = True Then Sheets("E").Select sel_sw sel_sw = False End If If .CheckBox5 = True Then Sheets("F").Select sel_sw sel_sw = False End If End If End With Exit Sub error: UserForm9.Show End Sub

  • CFrameWnd とCFormView2

    http://oshiete1.goo.ne.jp/kotaeru.php3?q=880746の続きです。 試行錯誤でCFrameWnd とCFormViewを使ったコーディングをしてみました CFrameWnd::LoadFrameを使った方はうまくいったのですがCFrameWnd::Createの方はうまくいきませんでした。 //LoadFrame CCreateContext con; memset(&con,0,sizeof(CCreateContext)); con.m_pNewViewClass = RUNTIME_CLASS(CXXXView); m_pMainFrame = new CMainFrame; m_pMainFrame->LoadFrame(IDR_MAINFRAME,WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE,NULL, &con ); m_pMainFrame->ShowWindow(SW_SHOW); //Create・・・うまくいかない(何故?) m_pContext = new CCreateContext; memset(m_pContext,0,sizeof(CCreateContext)); m_pContext->m_pNewViewClass = RUNTIME_CLASS(CXXXView); m_pMainFrame->Create("MyClass","MyWindow",WS_OVERLAPPEDWINDOW,CRect(0,0,10,10),NULL,NULL,0,m_pContext); m_pMainFrame->ShowWindow(SW_SHOW); ところでLoadFrameでうまくいったのは良いのですが 一つ疑問が、、、CFrameWndをタスクバーでは非表示で 表示することって無理でしょうか? ShowWindow(SW_SHOW);の時点でタスクバーにでてしまいます。 タスクバーに表示させないにはダイアログベースにする必要があるのでしょうか? 宜しくお願いいたします。

  • フォームの再表示について

    VC++初心者です。 ダイアログベースのアプリケーションをつくったんですが、その後ボタンクリックでモーダルダイアログを2つ順番に表示したいと思っています。 void CMFC_testDlg::OnBnClickedButton1() {   CmyDialog myDL;   ret1 = myDL.DoModal(); } で一つ目を表示 void CmyDialog::OnBnClickedOk() {   this->ShowWindow(SW_HIDE);   CmyDialog02 myDL02;   myDL02.DoModal(); } で一つ目を隠して、2つ目を表示 さらに2つ目のダイアログのボタンを押した時、2つ目を閉じて1つ目を再表示したいと思います。 void CmyDialog02::OnBnClickedOk() {   EndDialog(-1);   CmyDialog::ShowWindow(SW_SHOW); } と書いた所エラーになります。 どこがまずいんでしょうか。 エラーメッセージ:静的でないメンバ関数の呼び出しが正しくありません VBになれてしまっているため、C++の文法でどう書いていいのかわかりません。 どなたかお教えください。

  • 閉じてしまったダイアログのエディットボックスへの書き込み禁止方法

    VC++ 6.0 MFC ダイアログベースです。 メインダイアログ画面で、ボタンを押下した時に、別ダイアログ(子ダイアログ)が呼び出されて、 その子ダイアログ内では、ワーカースレッドを使用して処理を行い、 処理結果をエディットボックスに表示させています。 子ダイアログを閉じる時に、WaitForSingleObject を使って、スレッドを完全に終了させてからダイアログを閉じるように しているのですが、スレッドの処理が、エディットボックスに書き込む時に閉じてしまうと、 スレッドがそこで止まってしまいスレッドが終了しません。 このような場合どうしたら良いのでしょうか? ・閉じるボタンが押されたら、エディットボックスに書き込まないようにすれば良いと思い、 (フラグを立てて試したのですが、フラグチェック後に閉じるが押されることがあり失敗) // スレッドの開始 m_Thread = AfxBeginThread(ThreadFunc, this);    // この時、子ダイアログを閉じてしまうと // INFINITEなので、ずっと止まってしまいます。 CString data = "処理結果"; case 0: m_M0edit.SetWindowText(data); break; case 1: m_M1edit.SetWindowText(data); break; case 2: m_M2edit.SetWindowText(data); break; ・ ・ ・ ・ // 子ダイアログを閉じる時に呼び出されます。 // スレッドでの処理が完全に終わるのを待ちます。 afx_msg void CSelecting_Dlg::OnClose() {   DWORD dwRet   dwRet = WaitForSingleObject(m_Thread->m_hThread, INFINITE);   EndDialog(0); } /***************/ 失敗談 /***************/ // スレッドの開始 m_Thread = AfxBeginThread(ThreadFunc, this);    // この時、子ダイアログを閉じてしまうと // INFINITEなので、ずっと止まってしまいます。 CString data = "処理結果"; if (m_openFlag == 1){ //フラグを見て書き込みするかチェックする。   switch (t){      case 0: m_M0edit.SetWindowText(data); break;      case 1: m_M1edit.SetWindowText(data); break;      case 2: m_M2edit.SetWindowText(data); break; ・ ・ ・ ・   } } // 子ダイアログを閉じる時に呼び出されます。 // スレッドでの処理が完全に終わるのを待ちます。 afx_msg void CSelecting_Dlg::OnClose() {   DWORD dwRet   m_openFlag = false; //閉じるボタンが押されたら フラグを降ろす。   dwRet = WaitForSingleObject(m_Thread->m_hThread, INFINITE);   EndDialog(0); }

  • ダイアログの再表示について

    宜しくお願いします。 <環境> WIN98 VC++6.0 MFC  ダイアログのボタン押し下げでウィンドウを生成し、 生成後はダイアログを非表示にしています。 void CInput::OnButton1()//ウィンドウの生成 { UpdateData (TRUE); pWnd = new CMyWnd( this); pWnd->m_left=100; pWnd->m_top=100; m_pAryDlg.Add ( pWnd ); //m_pAryDlg2.Add ( &m_InputData ); pWnd->m_moji=m_InputData; pWnd->Kado_Create(this); ShowWindow(SW_HIDE); //ダイアログの非表示 } ウィンドウをダブルクリックすると、ダイアログが非表示から 表示になるように以下のコードを書きましたが、表示されません。 どのようにすれば表示されるようになりますか? void CMyWnd::OnLButtonDblClk(UINT nFlags, CPoint point)  //ウィンドウのダブルクリック { CInput* pInput = (CInput*)GetParent(); // CInputは親ダイアログのクラス pInput->ShowWindow(SW_SHOW); CWnd::OnLButtonDblClk(nFlags, point); }

専門家に質問してみよう