ゲームのように、きれいにフェードアウトする方法

このQ&Aのポイント
  • ゲームのように、きれいにフェードアウトしたい方法を教えてください。
  • ゲームのようなフェードアウト効果を実現するための方法を教えてください。
  • フェードアウトをスムーズに行う方法について教えてください。
回答を見る
  • ベストアンサー

ゲームのように、きれいにフェードアウトしたい

ゲームのように、きれいにフェードアウトしたいのですが、どうすればいいですか? よろしくお願いします。 #include<atlimage.h> class Picture { // ここに、いろいろな変数、関数があります // 描画すると、ちらつきます void Draw(CDC *pDC) { // (CImage)image,(CDC)*imageDC,SpDCは、クラスの宣言、この関数の外 // (CBitmap)cbmp,*oldcbmp 同上 // (CBrush)Brush 同上 imageDC=CDC::FromHandle(image.GetDC()); BLENDFUNCTION bf; bf.BlendOp=AC_SRC_OVER; bf.AlphaFormat=0 ; bf.BlendFlags=0; bf.SourceConstantAlpha=(BYTE)GetImageAlpha(); // 255~徐々に減少 SpDC.FillRect(CRect(0,0,GetImageSize().cx,GetImageSize().cy),&Brush);// CSize GetImageSize(){return imageSize;} イメージの高横 SpDC.AlphaBlend(0,0,GetImageSize().cx,GetImageSize().cy,imageDC,0,0,GetImageSize().cx,GetImageSize().cy,bf); pDC->BitBlt(0,0,GetImageSize().cx,GetImageSize().cy,&SpDC,0,0,SRCCOPY); image.ReleaseDC(); // デストラクタにて、SpDC.SelectObject(oldcbmp);cbmp.DeleteObject();SpDC.DeleteDC();Brush.DeleteObject(); } }; //補足ですが、SetTimer()でInvalidate()しています。

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

  • ベストアンサー
noname#30727
noname#30727
回答No.1

このソースでわかる範囲では、ちらつきそうな所はわかりませんでした。 ウィンドウの背景ブラシが有効になっていて、OnPaintの前に必ずウィンドウがクリアされるという事は考えられます。

thulala
質問者

お礼

回答ありがとうございます。 BOOL CFadeOutView::OnEraseBkgnd(CDC* pDC) { // TODO : ここにメッセージ ハンドラ コードを追加するか、既定の処理を呼び出します。 return 0; } としましたら、きれいに描画されました。 後は、何とかがんばって見ます。 本当にありがとうございました。

関連するQ&A

  • VC++でのアイコン背景透過について

    VC++2013 MFC環境です。 プログラムで○や×などの記号のアイコンを描画し、PNG,GIF,JPEGの形式でファイルに保存したいです。その時、アイコンの背景を透過したいのですがうまくいきません。 CDCクラスとCImageクラスを使用しアイコンの出力をしています。 背景透過について調べていくつか使えそうな関数があり試したのが、TransparentBltという関数で、デバイスコンテキストを二つ用意して、片方に記号を描画し、透過したい色を指定してもう片方にコピーすると指定した色が透過になる?と解釈しプログラム組みましたが結果は真っ黒の画像でした。 ここで完全に手が止まってしまい、質問させていただきます。 以下ソース CImage Image, image2; Image.Create( 50, 50, 24 ); image2.Create( 50, 50, 24 ); CDC* pDC = CDC::FromHandle( Image.GetDC( ) ); CDC* pdc2 = CDC::FromHandle( image2.GetDC( ) ); CRect rect( 0, 0, 50, 50 ); CPen BlackPen( PS_SOLID, 3, RGB( 0, 0, 0 ) ); CBrush WhitBrush( RGB( 255, 255, 255 ) ); CBrush BlackBrush( RGB( 0, 0, 0 ) ); pDC->FillRect( &rect, &WhitBrush ); pDC->SelectObject( &BlackPen ); pDC->SelectObject( &WhitBrush ); pDC->Ellipse( 5, 5, 45, 45 ); COLORREF col = Image.GetPixel( 0, 0 ); pdc2->TransparentBlt( 0, 0, 50, 50, pDC, 0, 0, 50, 50, col ); Image.SetTransparentColor( col ); image2.Save( L"c:\\icon\\maru.png" ); Image.ReleaseDC( ); image2.ReleaseDC( ); 他にも実装例があれば教えてください。 C++や画像生成に関しては経験がありません。

  • PictureControlのハンドルをCImageで取得

    お世話になっております。 VC2005を使用しております。 PictureControlで編集した画像を、CImageを使用してjpgファイルに保存することを行っております。 CDC *pDC = m_Pic.GetDC();でPictureControlのCDC取得 CImage SaveImage;で本体を宣言し、 CDC *SaveImageDC;でCDCを宣言します。 SaveImageDC->BitBlt(0,0,image.GetWidth(),image.GetHeight(),pdc,0,0,SRCCOPY);でコピー を行っておりますが、SaveImageとSaveImageDCを連動させる事ができません。 どのようにすればよいか教えてください。 よろしくお願いします。

  • SetWindowPosで指定したサイズにしたい

    イメージを描画する際に、イメージのサイズ分とウインドウを構成する要素のサイズを足して、SetWindowPos でサイズを変更していますが、サイズが不足しています。 難しいです。 教えてください。お願いします。 ///////////////////////////////////////////// void CImageRectView::OnLButtonDown(UINT nFlags, CPoint point) { CImage image; image.Load("000.jpg"); CDC *imageDC=CDC::FromHandle(image.GetDC()); CDC *pDC=GetDC(); int mnuh=GetSystemMetrics(SM_CYMENU); int titleh=GetSystemMetrics(SM_CYCAPTION); CRect FrameRect,ClientRect; GetWindowRect(&FrameRect); GetClientRect(&ClientRect); int FrameWidth=(FrameRect.right-FrameRect.left)-(ClientRect.right-ClientRect.left); int FrameHeight=(FrameRect.bottom-FrameRect.top)-(ClientRect.bottom-ClientRect.top); GetParentFrame()->SetWindowPos(&wndTop,rect.left,rect.top,image.GetWidth()+FrameWidth,image.GetHeight()+FrameHeight+mnuh+titleh,SWP_NOMOVE); pDC->BitBlt(0,0,image.GetWidth(),image.GetHeight(),imageDC,0,0,SRCCOPY); ReleaseDC(pDC); ReleaseDC(imageDC); CView::OnLButtonDown(nFlags, point); } /////////////////////////////////////////////

  • CFromViewの OnDrawメソッドについて

    MFC初心者です。VC2005でグラフィックスに挑戦しております。 まだよくクラスとか、MFCの作法などしらないのでトンチンカンな質問をしますが、 ドキュメント(で正しいでしょうか?)がCViewクラスの場合、 OnDraw(CDC* pDC)が定義されていたので、直接そこに描画コードを書きましたが、 CFromViewクラス(コントロール可能)の場合、 OnDraw(CDC* pDC)が見当たりませんので、定義にvoid OnDraw(CDC* pDC)を追加し、 以下のようにメソッドを追加して、無理やり表示させました。 この方法は普通でしょうか? void CtestView::OnDraw(CDC* pDC) { CBrush myBrush; CBrush* pOldBrush; myBrush.CreateSolidBrush(RGB(255,0,0)); // ソリッドブラシの作成 pOldBrush = pDC->SelectObject(&myBrush); // myBrushを選択 pDC->Ellipse(60,10,160,110); pDC->SelectObject(pOldBrush); // 元に戻す myBrush.DeleteObject(); // ブラシを削除 } //--------------------------------------------------- 以下クラス定義部 class CtestView : public CFormView { protected: // シリアル化からのみ作成します。 CtestView(); DECLARE_DYNCREATE(CtestView) public: enum{ IDD = IDD_test_FORM }; // 属性 public: CtestDoc* GetDocument() const; // 操作 public: // オーバーライド public: virtual BOOL PreCreateWindow(CREATESTRUCT& cs); protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV サポート virtual void OnInitialUpdate(); // 構築後に初めて呼び出されます。 // 実装 public: virtual ~CtestView(); #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif void OnDraw(CDC* pDC); /////////////////////////// ←勝手に追加 protected: // 生成された、メッセージ割り当て関数 protected: DECLARE_MESSAGE_MAP() }; #ifndef _DEBUG // testView.cpp のデバッグ バージョン inline CtestDoc* CtestView::GetDocument() const { return reinterpret_cast<CtestDoc*>(m_pDocument); } #endif

  • mfcの画像表示で、bmp表示がよくわかりません

    mfcの画像表示で、bmp表示がよくわかりません。 特に、SelectObject()でBitmapを戻す等が特によくわかりません。 今までは、そういうもんだとしてきたのですが、放っておけない事態になりまして、 相談させて下さい。 (1)下記のbmpDC.SelectObject(oldbmp)等について、その仕組みを詳細に紹介しているHPを ご存じでしたらお教えください。 (2)下記プログラムの画像の扱いで、まずい部分を、おかしいなと思われた部分をお教えください。  動作は、問題なく動作しています。BITMAPを敷き詰めるプログラムです。 CArray<HBITMAP> hBitAry; (HBITMAPを配列にしているまずさは今回は除外して下さい。) … int topX=-100-5; int topY=0; int hLen=100; int wLen=100; int yoko=0; CDC *pDC=mPict.GetDC(); for(int i=0; i<hBitAry.GetCount(); i++) { CDC bmpDC; bmpDC.CreateCompatibleDC(pDC); CBitmap *pBitmap=CBitmap::FromHandle(hBitAry.GetAt(i)); BITMAP BMP; pBitmap->GetBitmap(&BMP); CBitmap *oldbmp=bmpDC.SelectObject(pBitmap); if(yoko<3) { topX+=100+5; yoko++; } else { topX=0; topY+=100+5; yoko=0; } pDC->SetStretchBltMode(COLORONCOLOR); pDC->StretchBlt(topX,topY,100,100,&bmpDC,0,0,BMP.bmWidth,BMP.bmHeight,SRCCOPY); bmpDC.SelectObject(oldbmp); ::DeleteObject(CBitmap::FromHandle(hBitAry.GetAt(i))); } ReleaseDC(pDC); どうぞよろしくお願い致します。

  • Excel VBA のコンパイルエラー

    Excel VBA で GDI32 にある API を declare するとメモリ不足のコンパイルエラー となってしまいます。 どなたか解決策を御教示下さい。 使用するAPI は GetTextExtentPoint32 です。 コンパイルエラーが起きるVBAコードは、MSのVBサンプルから拾ったものです。 private Declare Function GetTextExtentPoint32 Lib "gdi32" Alias "GetTextExtentPoint32A" ( _ ByVal hdc As Long, _ ByVal lpsz As String, _ ByVal cbString As Long, _ ByRef lpSize As CSize) As Long Private Type CSize cx As Long cy As Long End Type 同じ GDI32 にある DeleteObject の declare 文はエラーが発生しません。 環境は以下の通りです。 Excel 2007 OSはVista 32bit メモリは 3G で約60%使用 宜しくお願いします。

  • メタファイルがうまく保存できない

    環境:Visual Studio2010 + VC + MFC 現在、MFCを使ってイメージを保存するプログラムを組んでいます。 以下のコードでメタファイルを作成し図形を書き込んでファイル保存しています。 しかし、一方のPC(WindowsXP)では正しい大きさ(縦横比)でファイル保存できるのですが、 もう一方のPC(Windows7)では右側が欠けてしまって思い通りの大きさ(縦横比)で ファイル保存できません。 原因等、何か分かる方がいましたら教えて下さい。 どうぞ宜しくお願い致します。 HDC hdc = CreateEnhMetaFile(pDC->GetSafeHdc(), strFile, &r,pDescription); if (hdc == NULL) return FALSE; CDC *pDCMeta = CDC::FromHandle(hdc); pDCMeta->SetMapMode(MM_ANISOTROPIC); pDCMeta->SetWindowExt(mmWidth, mmHeight); pDCMeta->SetViewportExt(pxWidth, pxHeight); // pDCMetaに書き込み処理 HENHMETAFILE hMeta = CloseEnhMetaFile(hdc); DeleteEnhMetaFile(hMeta);

  • CImage::ReleaseDC()のエラーで困っています。

    CImage::ReleaseDC()のエラーで困っています。 ウインドウ上に複数の画像を表示し、それぞれ配置や大きさを マウスのD&Dで変えられるようなアプリを作っています。 Visual Studio 2005 C++, MFC 画像はCImageクラスのm_ImageへLoadしてあります。 GetDCでハンドルを取得しているので、ReleaseDCにて開放を 行っていますが、そこで下のエラーになります。 [Second Chance Assertion Failed: File c:\program files\microsoft visual studio 8\vc\atlmfc\include\atlimage.h, Line 1217] 何か解決のヒントになる事がありましたら教えてください。 void CImageButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { (前略) //ウィンドウDC互換Bitmap作成 CBitmap Bmp; Bmp.CreateCompatibleBitmap(pDC, nWidth, nHeight); //メモリDC作成 CDC MemDC; MemDC.CreateCompatibleDC(pDC); //メモリDCにBitmap選択 MemDC.SelectObject(&Bmp); //メモリDCにストレッチ描画 MemDC.SetStretchBltMode(HALFTONE); CDC* pImgDC = CDC::FromHandle(pBtnInfo->m_Image.GetDC()); HDC hImgDC = pImgDC->m_hDC; pBtnInfo->m_Image.StretchBlt(MemDC.m_hDC, 0, 0, nWidth, nHeight, SRCCOPY); pBtnInfo->m_Image.ReleaseDC(); (中略) //四角形を描画 CPen focusPen(PS_DOT, nPenWidth, RGB(nR, nG, nB)); CPen* OldPen = MemDC.SelectObject(&focusPen); MemDC.MoveTo(btnRect.left, btnRect.top); MemDC.LineTo(btnRect.left, btnRect.bottom); MemDC.LineTo(btnRect.right, btnRect.bottom); MemDC.LineTo(btnRect.right, btnRect.top); MemDC.LineTo(btnRect.left, btnRect.top); MemDC.SelectObject(OldPen); //メモリDCからウィンドウDCにビット転送 pDC->BitBlt(0, 0, nWidth, nHeight, &MemDC, 0 ,0, SRCCOPY); (後略)

  • いわゆるフェードアウトでしょうか!?

    女性から男性に告白。 一回断られたが、やっぱり真剣に告白してくれたんだし俺も真剣に考えたいと告白保留されました。 彼が「次会えるのが◯日なんだけど、また時間とか連絡するわ。別に気不味いとか思わないで!いつも通り連絡してくれて大丈夫。」 私「ありがとう。じゃぁ◯日予定空けとくね」 その後、何気無い労いのメールを送り、一回返事は返ってきたのですが、その後送っても未読のまま。 約束の当日なっても連絡が来ませんでした。 確認の為に「会う日って今日だよね?」とLINEを送りましたが、未読のまま。 因みにブロックはされていない様でした。 相手は激務のお仕事されている人なのでいつもの如く忙しいのかなと思っていましたが、これが私の告白に対する回答なのか。と思うとショックです。 こんな不義理な対応する人では無かったので残念です。 心の何処かでは約束の日まで2週間あったのでその間に何か予期せぬトラブルがあったのかなと思ったりします。 言わずもがな、このような人はもう諦めた方がいいですよね?

  • フェードアウト

    手紙を送った相手から一年近く返事が返ってこないのですがこれってフェードアウトだと思いますか。

専門家に質問してみよう