Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15183202
  • 博文数量: 7460
  • 博客积分: 10434
  • 博客等级: 上将
  • 技术积分: 78178
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-02 22:54
文章分类

全部博文(7460)

文章存档

2011年(1)

2009年(669)

2008年(6790)

分类: C/C++

2008-05-31 09:28:25

 在Form上添加一个OpenPictureDialog,添加一个Image,并为其添加一个图片。再加一个PopupMenu,并创建两个菜单项,一个是Open1,一个是Exit1,其中前者是打开图象文件对话框,后者为退出程序。设置Image1的PopupMenu属性为PopupMenu1。

    在Form1的OnCreate事件中添加:
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
      BmpToRgn();
    }

    在.h文件中的private段中添加
            void __fastcall TForm1::BmpToRgn();

    这个函数用来创建不规则窗体。
    //---------------------------------------
    void __fastcall TForm1::BmpToRgn()
    {
      Image1->AutoSize=true;
      Form1->AutoSize=true;
      Form1->BorderStyle=bsNone;  //将Form的标题栏去掉
      TColor ColorKey=Image1->Canvas->Pixels[0][0];  //以这个点的颜色为透明基准色
      int x,y;
      int l,r;
      POINT *a;
      bool lb,rb;
      HRGN wndrgn,temprgn;

      if((a=(POINT *)malloc(Width*2*(sizeof(POINT))))==NULL)
      {
        ShowMessage(\"申请内存失败!\");
        exit(0);
      }

      l=0;r=Image1->Height*2-1;
      wndrgn=CreateRectRgn(0,0,Image1->Width,Image1->Height);

      for(y=0;yHeight;y++)
      {
        lb=true;
        for(x=0;xWidth+1;x++)
          if(Image1->Canvas->Pixels[x][y]!=ColorKey)
          {
            a[l].x=x;
            a[l].y=y;
            lb=false;
            break;
          }
        if(lb) a[l]=a[l-1];
        l++;
        rb=true;

        for(x=Image1->Width;x>=0;x--)
          if(Image1->Canvas->Pixels[x][y]!=ColorKey)
          {
            a[r].x=x;
            a[r].y=y;
            rb=false;
            break;
          }
        if(rb) a[r]=a[r+1];
        r--;
      }

      r=Image1->Height*2-1;
      for(y=0;yHeight-1;y++)
      {
        for(x=a[y].x;x<=a[r].x;x++)
          if(Image1->Canvas->Pixels[x][y]==ColorKey)
          {
            temprgn=CreateRectRgn(x,y,x+1,y+1);
            CombineRgn(wndrgn,wndrgn,temprgn,RGN_XOR);
            DeleteObject(temprgn);
          }
        r--;
      }
      //temprgn=CreatePolygonRgn(a,Image1->Height*2,ALTERNATE);
      temprgn=CreatePolygonRgn(a,Image1->Height*2,WINDING);
      CombineRgn(wndrgn,wndrgn,temprgn,RGN_AND);
      DeleteObject(temprgn);
      delete a;
      SetWindowRgn(Handle,wndrgn,true);
    }

    为了使没有标题栏的窗体能移动,需要在Image1的OnMouseDown事件中添加以下代码:
    void __fastcall TForm1::Image1MouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
      if(Button == mbLeft)
      {
        ReleaseCapture();
        Perform(WM_NCLBUTTONDOWN,HTCAPTION, 0);
      }
    }

    //-----------------------------------------
    //通过右键菜单中的Exit1退出程序
    void __fastcall TForm1::Exit1Click(TObject *Sender)
    {
      Close();
    }

    //---------------------------------------
    //打开图片文件,并以这个图片创建不规则窗体
    void __fastcall TForm1::Open1Click(TObject *Sender)
    {
      if(OpenPictureDialog1->Execute())
      {
        Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);
        BmpToRgn();
      }
    }
    注意图片的背景色要相同。

阅读(179) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~