• ベストアンサー

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

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

  • yiojs
  • お礼率55% (15/27)

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

  • ベストアンサー
  • t_nojiri
  • ベストアンサー率28% (595/2071)
回答No.1

普通は、OnPaintに描画処理を纏めてしまうのが一番効率的な気が・・・。 http://www.t-recipe.com/vc/redraw.html

yiojs
質問者

お礼

OnPaintは知りませんでした。ありがとうございます。

その他の回答 (1)

回答No.2

再描画であれば、InvalidateRectでウィンドウの領域を無効にすれば、Windowsがしかるべき時にWM_PAINTを発行してくれます。 すぐに描画させたいのであれば、InvalidateRectの後でUpdateWindowを呼び出します。

関連するQ&A

  • 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();が原因でちらついていることまでは分かっているのですが、 なぜちらつくのか?ということと、対処方法もしくは別の方法はないのか? 別の方法があればどういったことなのか?ということが知りたいです。 初心者(小学生並み)にもわかるように教えていただければ幸いです。 宜しくお願いします。

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

    よろしくお願いします。 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.可能であれば、具体的にはどう記述すれば良いのでしょうか?

  • 非クライアント領域への描画について

    非クライアント領域に文字を書こうとしました。 以下の(2)では書けますが、(1)では書いてくれません。 CPaintDCはクライアント領域でないとダメなのですか? void CMainFrame::OnPaint() { CPaintDC dc(this); // 描画用のデバイス コンテキスト dc.TextOut(0,0,"こんにちは"); ・・・(1) CDC* pDC = GetWindowDC(); pDC->TextOut(100,0,"こんにちは"); ・・・(2) 環境 WIN98 VC++6.0 MFC

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

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

  • タスクトレイのアイコンが消えてしまう。

    こんにちは。 今、タスクトレイに常駐するプログラムを作成しています。 プログラム起動するとすぐ、メインウインドウとタスクトレイにアイコンが 表示されます。 メインウインドウ右上の最小化ボタンまたは、終了ボタンを押すと メインウインドウが消えてタスクトレイのアイコンだけが残るように したいと考えています。 最小化ボタンの場合はWM_SIZEをキャッチして、ShowWindow(hwnd, SW_HIDE) で、メインウインドウだけ消え、タスクトレイのアイコンは残ります。 しかし、終了ボタンの場合は、WM_DESTROY をキャッチし、同じくShowWindow(hwnd, SW_HIDE) でメインウインドウを消しているのですが、メインウインドウだけでなく、 アイコンも消えてしまいます。アイコンを消さずに残すようにしたいのですが、 どうしたらよいでしょうか。WM_DESTROYでは、PostQuitMessage(0)はポストして おらず、最後にreturn 0;を返しています。 どうぞよろしくお願いします。 環境 BCC、WindowsXP、C言語、Win32 API

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

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

  • 他プロセスのウィンドウをいじりたい

    他プロセスのウィンドウをいじりたい 自分でマクロソフトを作ろうとしたのですが、 自分のプロセス内のウィンドウにしかアクセスできないことに気づきました。 やりたいことは  ・他のプロセスのウィンドウのメッセージプロシージャをすりかえて   他のプロセスのウィンドウに送られたメッセージを見たりすること  ・マウスをクリックさせたり、キーボードを押したりすること です。要するに他のプロセスのウィンドウを自分の操り人形のようにしたいわけです いろいろ調べたけれど自分のDLLを読み込むように他のプロセスのメモリを 書き換える方法など、怪しいものしかなかったので 他の方法を教えてください

  • 他のアプリの表示、非表示について

    他のアプリケーション(アプリA)をコントロールするプログラムを作っています。アプリAと自作アプリは起動したままです。自作アプリでボタンを押すとアプリAを表示させてアクティブにして仕事をさせ、終わったら非表示にします。 アプリAのハンドルをhandle = FindWindow()で取得して ShowWindow(handle,SW_SHOWNORMAL)で表示して、 ShowWindow(handle,SW_HIDE);で隠しています。 ボタンを押したときに、アプリAが表示されていると、非表示にしたあとタスクバーのアプリを手動で表示できません。 MINIMIZEやCloseWindos()も試しましたが、それだと画面の左下にアプリAが残ってしまいます。 SendMessage(handle, WM_SYSCOMMAND, SC_MINIMIZE, 0);も試しましたがうまくいきません。使い方が悪いのかもしれません。 アプリAを隠す事と元のサイズで表示する。という二つの動作をプログラムで交互に行う場合に、途中で手動でアプリAの最小化、あるいはタスクバーから出すという動作をさせることができるのが希望です。どうすればよいでしょうか。 OSはXPです。

  • 再描画されない

    お世話になります。WS_POPUPで作成したウィンドウにGDI+を用いて画像を表示させています。 そのウィンドウに、他のウィンドウ(最大化されていない)を重ねて動かすと、重なっていた部分が再描画されず真っ白になってしまいます。 最大化されたウィンドで隠した場合は正常に表示されます。 VC+2005です。よろしくお願いします。m(__)m //ウィンドウプロシージャWM_PAINT内 hdc = BeginPaint(hWnd, &ps); Image myImage(fn); MoveWindow(hWnd, 0, 0, myImage.GetWidth(), myImage.GetHeight(), 0); Graphics MyGraphics(hdc); MyGraphics.DrawImage(&myImage, 0, 0, myImage.GetWidth(), myImage.GetHeight()); EndPaint(hWnd, &ps);

  • 領域を塗りつぶしたい

    縦10ドット、横70ドット の領域を、横に7等分して 虹の色をつける。 □□□■■■■ という感じにしたいんだけど、塗りつぶし関係のソースを 教えてください。 sikaku01 = CreateWindow(       "STATIC",       "",       SS_WHITE | WS_CHILD | WS_VISIBLE,       0,0,10,10,       hWnd,       NULL,       hInstance,       NULL); これを7個作って、sikaku01 の領域の色を変える方法しか 分かりませんでした。 もっといい方法があると思うんです。 領域の色は固定じゃなくて、ランダムにチラチラと変色 させたいから、色を変えられる領域で、その領域を塗りつぶす 方法が知りたいです。 SetPixel( ) での1ドットずつの描画も思いついたけど、 遅いし、領域ごとの塗りつぶしの方法でやりたいと思いました。 コンパイラは BCC32 を使っています。

専門家に質問してみよう