• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:SetWindowRgn()関数について。)

SetWindowRgn()関数についての質問

このQ&Aのポイント
  • SetWindowRgn()関数を使ってアニメーションするデスクトップアクセサリを作成していますが、二回目のループでリージョンの再設定が失敗しています。
  • 現在、CRgn* _pRgnsとCBitmap* _pBitmapをメンバ変数として使用し、ビットマップの形をしたリージョンをフレーム枚数だけ作成しています。
  • onTimer()関数内でフレーム位置をインクリメントし、該当フレーム番号のビットマップとリージョンを適用し、描画させていますが、二回目のループでリージョンの再設定が失敗します。

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

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

重要なことを思い出しました。 おそらく、アニメーションの一巡目までは正常終了ということなので次の理由でしょう。 SetWindowRgn()は成功すると引数で指定されたリージョンは、Windowsによって管理が行われるようになります。 #これにより、ウィンドウに設定したリージョンは破棄が不要となります。 そのため、何度も同じリージョンを使いまわして設定しようとしても、2回目以降は失敗します。 これを避けるには、SetWindowRgn()を呼ぶ前に、リージョンをコピーし、配列に入っているリージョンではなく、コピーしたリージョンをパラメータに設定する必要があります。

Shinoa
質問者

お礼

回答ありがとうございます。 早速試してみたところ、問題なく動作致しました。 アドバイスありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

第2引数はBOOL型なので、trueではなくTRUEを指定してください。 また、CWnd::SetWindowRgn()は内部でAPIを呼び出しているだけなので、NT系のOSならGetLastError()で詳細エラーを取得して調べてみてください。 あと怪しそうなのは、リージョンの作成方法ですかね。 コードがかかれていないのでわかりませんが。

Shinoa
質問者

補足

回答ありがとうございます。 早速、ご指摘いただいた箇所を改めました。 以下のコードを追加し、取得できたエラー文字列は、 『この操作を正しく終了しました。』でした。 ちなみに、エラーコード自身は0です。 // 非矩形ウィンドウの設定 int ret = SetWindowRgn( *(_pRgns + _frameNo), TRUE ); if ( ret == 0 ){  FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM |          FORMAT_MESSAGE_IGNORE_INSERTS,          NULL, GetLastError(), 0,          ErrorMes, 1024, NULL);  // リージョンの設定に失敗  stopTimer(); } リージョンの作成部分ですが、以下のような処理を行っています。 bool TestAppDlg::createRgn() {  unsigned char r, g, b;  unsigned char* buff;  COLORREF WHITE = RGB( 255, 255, 255 );  _pRgns = new CRgn[ BITMAP_NUM ];  if ( _pRgns == NULL ) return false;  int bitSize = IMAGE_WIDHT * IMAGE_HEIGHT * 4;  buff = new unsigned char[ bitSize ];  // フレーム数分、リージョンを作成する。  for ( int i=0; i<BITMAP_NUM; i++ ){   memset( buff, '\0', sizeof(buff) );   (_pBitmap + i)->GetBitmapBits( bitSize, buff );   (_pRgns + i)->CreateRectRgn( 0, 0, 0, 0 );   for( int y = 0; y < IMAGE_HEIGHT; y++ ){    for( int x = 0; x < IMAGE_WIDHT; x++ ){     int inx = (y * IMAGE_WIDHT) + x;     COLORREF color = RGB(buff[ 4*inx ], buff[ 4*inx+1 ], buff[ 4*inx+2 ] );     if ( color != WHITE ){      CRgn rgn;      rgn.CreateRectRgn( x, y, x + 1, y + 1 );      (_pRgns + i)->CombineRgn( (_pRgns + i), &rgn, RGN_OR );     }    }   }  }  delete[] buff ;  return true ; } 以上、何かお気づきの点がございましたらご教示ください。

すると、全ての回答が全文表示されます。

関連するQ&A