お世話になります。
Visual Studio2005 C++ MFCにて
ピクチャボックスにビットマップ画像表示
を行っています。
そのなかで、PlgBlt()を使用して画像の回転を行なって
いるのですが指定したピクチャボックスに回転画像が
表示されません。
回転前の画像はピクチャボックスに表示され、回転画像は
ピクチャボックス外に表示されてしまいます。
御存知の方がおられましたらお教え頂けないでしょうか。
以下コードとなります。
int x=200,y=200,w=m_pBMIH->biWidth,h=m_pBMIH->biHeight;
POINT pt[3]={{x,y},{x+w,y},{x,y+h}};
POINT center={x+w/2,y+h/2};
float rot = (float)3.1415 / 3
for(int i=0;i<3;i++) {
pt[i].x -= center.x;
pt[i].y -= center.y;
//回転させる
pt[i]=rotPoint(pt[i],rot);
//元に戻す
pt[i].x += center.x;
pt[i].y += center.y;
}
CDC *pDC1 = m_pict1.GetDC();
m_pict1.GetClientRect(&m_rect1);
pDC1->SetStretchBltMode(HALFTONE);
::StretchDIBits(pDC1->GetSafeHdc(),
0, 0, m_rect1.right, m_rect1.bottom, // 転送先
0, 0, m_pBMIH->biWidth, m_pBMIH->biHeight, // 転送元
m_pData, m_pBMI, DIB_RGB_COLORS, SRCCOPY);
//画像回転
CBitmap msk;
pDC1->PlgBlt(pt, pDC1, 0, 0, w, h,msk,0, 0);
PlgBlt()のマニュアルに
「サイズ変更、平行移動、反転を行うことはできますが、
回転や傾斜を行うことはできません」とありますが、
読みましたか。
>PlgBlt()のマニュアルに
>「サイズ変更、平行移動、反転を行うことはできますが、
>回転や傾斜を行うことはできません」とありますが、
>読みましたか。
これはおそらく転送元のDCでSetWorldTransformされている場合の動作のことじゃないでしょうか。
(BitBltにも同様の解説があるので・・・)
回転、傾斜後の座標を自分で計算してやれば、
PlgBltで回転画像も傾斜した画像も表示することは可能です。
MSDNの日本語訳が悪いようです
マスクの説明から続いていて、
「スケーリング、平行移動、反転は、(マスクの使用に)問題ないが、
回転、傾斜の場合はそうはいかない。
マスクがモノクロでないとエラーになる」
という意味のようです
で、本題の「違う場所に表示される」理由
>int x=200,y=200
これが原因(というか・・・どこからでてきたんだこの200は?)。
どっちも0にすればいい
おおっなるほど、これは大変失礼しましたm(__)m。
編集 削除お世話になります。
御指摘通り、
>>int x=200,y=200
>これが原因(というか・・・どこからでてきたんだこの200は?)。
>どっちも0にすればいい
int x=0,y=0でピクチャボック内に表示できました。
有難う御座いました。