2

指定された形式のビットマップだけを描画するのは難しいことではありませんが、そのコードが機能しない理由を理解できません(いくつかのデルファイの例で見ました):

Graphics::TBitmap* bmp;

void __fastcall TForm1::FormCreate(TObject* Sender)
{
    bmp = new Graphics::TBitmap();
    bmp->Width = 300;
    bmp->Height = 300;
    bmp->Canvas->Ellipse(0, 0, 300, 300);
}

void __fastcall TForm1::Button1Click(TObject* Sender)
{
    HRGN rgn = CreateRectRgn(10, 10, 30, 30);
    if(SelectClipRgn(bmp->Handle, rgn) == ERROR) ShowMessage("Error");
    Canvas->Draw(0, 0, bmp);
}

したがって、ビットマップは通常の方法で描画されます。MSDNでは、ERRORフラグは「以前のクリッピング領域は影響を受けません」と説明されています。デバイスを最初に構成する必要がありますか、それとも前のリージョンを削除する必要がありますか?このタスクを実行するのは正しい方法ですか。このビットマップを含むTImageでSetWindowRgnを使用しますが、TImageはウィンドウではないため、Handleがありません。何が悪いのかを見つけるのを手伝ってください。

4

1 に答える 1

1

CopyRectのメソッドを使用するだけですCanvas

たとえば、Button2 というボタンを作成し、次のコードを挿入します。

void __fastcall TForm1::Button2Click(TObject *Sender)
{
    //dimensions of real image: 300x300

    //clipping a region
    //dimension: 200x200
    //offset (x,y): (10,10)
    int xOff = 10;
    int yOff = 10;
    int widthOfRegion = 200;
    int heightOfRegion = 200;

    //printing the clipped region
    //dimension: 200x200
    //offset (x,y): (305,0) -> to do not overwrite image drawn by button1
    int xOff2 = 305;
    int yOff2 = 0;
    int widthOfRegion2 = 200;
    int heightOfRegion2 = 200;

    Canvas->CopyRect(
        //first rect is destination
        TRect(xOff2, yOff2, xOff2 + widthOfRegion2, yOff2 + heightOfRegion2)
        //second is canvas of source
        ,bmp->Canvas
        //third is rect of source that you want to copy
        ,TRect(xOff, yOff, xOff + widthOfRegion, yOff + heightOfRegion)
    );
}

したがって、実行して Button1 と Button2 を押した後の結果は次のとおりです。 XD

ヒント: 領域 2 の幅と高さを変更して、クリップされた領域をズームインまたはズームアウトできます :)

ソース: http://www.borlandtalk.com/how-to-use-selectcliprgn-vt11696.html

于 2013-03-22T13:00:51.127 に答える