質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.48%

  • C++

    3587questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

C++のプログラムでGIFアニメを再生したい場合

受付中

回答 1

投稿

  • 評価
  • クリップ 2
  • VIEW 3,437

metier

score 8

C++のプログラムでGIFアニメを再生したい場合、Gdiplusで下記のようなコードで再生ができてます。

呼び出し側
InsImageGIF(_TEXT("anime.gif"),mainHwnd,0,0);

関数
int InsImageGIF(TCHAR* ImgSrc, HWND DistHwnd,int iStartX,int iStartY)
{
    HDC hdc;
    HDC mhdc;
    HBITMAP hbp;
    BITMAP bp;

    PAINTSTRUCT ps;
    GUID guid;
    hdc = GetDC(DistHwnd);
    Graphics MyGraphics(hdc);
    Image gifimage(ImgSrc);
    gifimage.GetFrameDimensionsList( &guid, 1);
    int frame_cnt = gifimage.GetFrameCount(&guid);
    for (int i = 0; i< frame_cnt; i++) { // フレーム数分くりかえす
        gifimage.SelectActiveFrame(&guid, i);
        MyGraphics.DrawImage(&gifimage, iStartX, iStartY );

        Sleep(1000);      // 1秒まつ
    }
    EndPaint(DistHwnd,&ps);

    ReleaseDC(DistHwnd,hdc);

    return 0;              //  終わるまで返ってこない
}

この場合、呼び出し側はアニメが終わるのを待って次に進むしかないため、途中で止めたり、音声を挿入したりできないです。
たとえば、呼び出しstartで開始、呼び出しstopで終了するなど、
C++で、1回呼び出しただけで関数から帰ってきて自動で再生できるようにするには、どうすればよいでしょう?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

+3

C++言語の場合、関数の途中で「処理をOS側に返す」ような処理を簡単に書くことはできませんので、sleepで待機させる形ではなく、
  • 最初の呼び出しではSetTimerなどでタイマーで呼び出すようにセットだけして、タイマーのコールバックごとに1枚進める
  • gifアニメを進めるスレッドを別に立てる
などの手法が必要になります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

関連した質問

  • 解決済

    [fuelPHP]SQL集計結果の値の取得方法

    FuelPHPで、SQLの集計結果を取得しようとArr::getを使用したのですが、 値が取れずに0になってしまいます。 どのように書けば良いかお教え下さい。 コード     

  • 解決済

    gifの繰り返し回数の指定がわからない

    gif_libの画像処理に関する質問です。 https://github.com/katahiromz/imaio_bmp/blob/master/imaio_win.c この

  • 解決済

    ポインタ渡しと文字列比較

    C言語初心者です。 文字列rawcがリストlistの中に入っていない(登録されていない)とき、 その文字列をリストの登録されている最後に格納する関数regを作成しました。 既に登

  • 受付中

    整数の繰り返し入力

    整数を繰り返し入力し、0 を入力したら、それまでに入力した整数の合計と個数を出力(表示)するプログラムを改造し、 t を入力したら、それまでに入力した数値の合計を出力(表示)して終

  • 解決済

    他のファイルの変数の値を持ってくる方法について。

    閲覧ありがとうございます! 早速質問なんですが、他のファイルの変数の値を参照するにはどうすればいいのでしょうか?上手くできず困っています; //AppDalegate.swift

  • 解決済

    C++でのオセロゲームについて

    色々手を尽くしましたが、自力で解決できないため教えていただければと思い質問いたします。 学習のためhttps://gist.github.com/mia-0032/5325961

  • 解決済

    c言語学習中の学生です。

    前提・実現したいこと c言語を学んでいる学生です。 非常に低レベルな質問ですがお願いします。 Windows10でmingwを使っています。 発生している問題・エラーメッセージ

  • 解決済

    BitBltによる画像表示について

    現在C++でGUIアプリケーションを作成しているのですが、ウィンドウに画像を表示させたいです。 調べると、画像を表示するにはメッセージループのWM_PAINTの箇所に該当する記述を

同じタグがついた質問を見る

  • C++

    3587questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。