查看單個文章
舊 2005-06-21, 12:19 PM   #1
魔術王子
版區管理員
 
魔術王子 的頭像
榮譽勳章
UID - 115097
在線等級: 級別:42 | 在線時長:1991小時 | 升級還需:30小時級別:42 | 在線時長:1991小時 | 升級還需:30小時
註冊日期: 2004-01-13
住址: 魔術學園
文章: 2974
精華: 0
現金: 14895 金幣
資產: 2678525 金幣
預設 用C++Builder設計一個不規則形狀表單

請先用編輯軟體將不顯示部分塗成藍色(Blue)
然後再表單上插入一個TImage物件,載入這張圖
然後再Form1的OnActivate事件填入
語法:
void __fastcall TForm1::FormActivate(TObject *Sender)
{
    HRGN rgn1,rgn2;
    int x,y,startx,endx;
    if(rgn1!=0)DeleteObject(rgn1);
    rgn1=0;
    LockWindowUpdate(Handle);
    for(y=0;y<Image1->Height-1;y++)
    {
        x=0;
        startx=0;
        endx=x;
        do
        {
            while((Image1->Canvas->Pixels[x][y]==clBlue)&&(x<=Image1->Width)){x++;}
            startx=x;
            x++;
            while((Image1->Canvas->Pixels[x][y]!=clBlue)&&(x<=Image1->Width)){x++;}
            endx=x;
            if(startx!=Image1->Width)
            {
                if(endx==Image1->Width)endx--;
                if(rgn1==0)
                {
                    rgn1=CreateRectRgn(startx+1,y,endx,y+1);
                }
                else
                {
                    rgn2=CreateRectRgn(startx+1,y,endx,y+1);
                    if(rgn2!=0)
                    {
                        CombineRgn(rgn1,rgn1,rgn2,RGN_OR);
                    }
                    DeleteObject(rgn2);
                }
            }
        }while(x<Image1->Width-1);
    }
    LockWindowUpdate(0);
    SetWindowRgn(Handle,rgn1,true);
}
//---------------------------------------------------------------------------
Image1的OnDblClick事件填入(不填也行,只是要結束程式會有點麻煩)
語法:
void __fastcall TForm1::Image1DblClick(TObject *Sender)
{
    Close();
}
//---------------------------------------------------------------------------
本程式節錄自RUN!PC 67期 李明樹先生發表
魔術王子 目前離線  
送花文章: 1528, 收花文章: 1555 篇, 收花: 3894 次
回覆時引用此帖