Go4Expert

Go4Expert (http://www.go4expert.com/)
-   MFC (http://www.go4expert.com/forums/mfc/)
-   -   Urgent: Coloring Drawn Hexagons (http://www.go4expert.com/forums/urgent-coloring-drawn-hexagons-t20033/)

chadz 9Nov2009 21:39

Urgent: Coloring Drawn Hexagons
 
1 Attachment(s)
hello i am a beginner in using MFC,
i drew a hexagon in mfc using this code: ( a part of the code)
m_StartPoint.x -= int(ceil(r));//50,100
m_EndPoint.y -= int(ceil(h)); //100,99

dc.MoveTo(m_StartPoint);
dc.LineTo(m_EndPoint);

m_EndPoint.y -= int(ceil(s)); //m_Endpoint:100,49
dc.LineTo(m_EndPoint);

m_EndPoint.y -= int(ceil(h));
m_EndPoint.x -= int(ceil(r));
dc.LineTo(m_EndPoint);

m_EndPoint.y += int(ceil(h));
m_EndPoint.x -= int(ceil(r));
dc.LineTo(m_EndPoint);

m_EndPoint.y += int(ceil(s));
dc.LineTo(m_EndPoint);

m_EndPoint.y += int(ceil(h));
m_EndPoint.x += int(ceil(r));
dc.LineTo(m_EndPoint);



and it looks like the picture "hexagon.jpg"

the question is how can i fill it with color, lets say in red? or even more how can i fill it with a small picture instead of coloring it?

Any idea?
thank you

Gene Poole 10Nov2009 21:10

Re: Urgent: Coloring Drawn Hexagons
 
For solid color, use CDC::FloodFill(). For an image, you'll have to set a clipping region to the shape of your hexagon and bitblt the image.

chadz 10Nov2009 22:52

Re: Urgent: Coloring Drawn Hexagons
 
Quote:

Originally Posted by Gene Poole (Post 60041)
For solid color, use CDC::FloodFill(). For an image, you'll have to set a clipping region to the shape of your hexagon and bitblt the image.

thx, but can u tell me how do i do that :set a clipping region to the shape of your hexagon and bitblt the image?

can you tell me what should i add in this code:
----------------------------------------------------
Code:

CClientDC dc(pntWnd);
 
 
  CPoint m_StartPoint = crdSouthEast;//(100,100)
  CPoint m_EndPoint = crdSouthEast;
  CPoint Temp;
  computeHexagonQuantities(hexagonSide);//

        POINT pts[6];
       
               
//Drawing
        m_StartPoint.x -= int(ceil(r));

        int temp=int(ceil(r));
        m_EndPoint.x =m_StartPoint.x+temp;
        m_EndPoint.y -= int(ceil(r));

        pts[0]=m_StartPoint;
        pts[1]=m_EndPoint;

        m_EndPoint.x=m_StartPoint.x;
        m_EndPoint.y-= int(ceil(r));
               
        pts[2]=m_EndPoint;
 
        m_EndPoint.x-=int(ceil(s));
       
        pts[3]=m_EndPoint;
       
        Temp.x=m_EndPoint.x;
        m_EndPoint.x-=int(ceil(r));
        m_EndPoint.y+= int(ceil(r));
       

        pts[4]=m_EndPoint;
       

        m_EndPoint.x = Temp.x;
        m_EndPoint.y+= int(ceil(r));
       

        pts[5]=m_EndPoint;
       

        m_EndPoint.x =m_StartPoint.x;
        m_EndPoint.y =m_StartPoint.y;
       

        dc.Polygon(pts,6);

//PS
//i loaded a bitmap in another cpp file by doing :
  CBitmap test;
  test.LoadBitmapW(IDB_BITMAP7);//IDB_BITMAP2

//this "test" is passed by reference in the class containing the above code...
//so how to clipper and BitBlt it?

thank you for your help

Gene Poole 11Nov2009 00:22

Re: Urgent: Coloring Drawn Hexagons
 
This paints a bitmap defined in resources as IDB_BITMAP1 into a triangular clipping region on the screen:

Code:

          CPaintDC dc(this);
          POINT pts[3];
          CRgn rgn1;
          CDC memdc;
          CBitmap cbm;
          BITMAP bmp;
         
          pts[0].x=10;
          pts[0].y=100;
         
          pts[1].x=60;
          pts[1].y=20;
         
          pts[2].x=100;
          pts[2].y=100;
         
          //dc.Polygon(pts,3);
          rgn1.CreatePolygonRgn(pts,3,ALTERNATE);
          dc.SelectClipRgn(&rgn1);
          memdc.CreateCompatibleDC(&dc);
         
          cbm.LoadBitmap(IDB_BITMAP1);
          cbm.GetBitmap(&bmp);
          CBitmap *tbmp=memdc.SelectObject(&cbm);
          dc.BitBlt(0,0,bmp.bmWidth,bmp.bmHeight,&memdc,0,0,SRCCOPY);
         
          memdc.SelectObject(tbmp);


chadz 11Nov2009 12:16

Re: Urgent: Coloring Drawn Hexagons
 
2 Attachment(s)
Quote:

Originally Posted by Gene Poole (Post 60049)
This paints a bitmap defined in resources as IDB_BITMAP1 into a triangular clipping region on the screen:

Code:

          CPaintDC dc(this);
          POINT pts[3];
          CRgn rgn1;
          CDC memdc;
          CBitmap cbm;
          BITMAP bmp;
         
          pts[0].x=10;
          pts[0].y=100;
         
          pts[1].x=60;
          pts[1].y=20;
         
          pts[2].x=100;
          pts[2].y=100;
         
          //dc.Polygon(pts,3);
          rgn1.CreatePolygonRgn(pts,3,ALTERNATE);
          dc.SelectClipRgn(&rgn1);
          memdc.CreateCompatibleDC(&dc);
         
          cbm.LoadBitmap(IDB_BITMAP1);
          cbm.GetBitmap(&bmp);
          CBitmap *tbmp=memdc.SelectObject(&cbm);
          dc.BitBlt(0,0,bmp.bmWidth,bmp.bmHeight,&memdc,0,0,SRCCOPY);
         
          memdc.SelectObject(tbmp);


Thx a Lot..Still one more question , i have the following attached bitmap , when i use the code u gave me, it doesn't fit this bitmap in Each hex, it spread it along as many hex i am drawing... check" Result.jpg" to see what i mean.
how can i fit this bitmap in one hex, because i want to fit other bitmaps in the other hexes
thank you for the help.

Gene Poole 11Nov2009 21:23

Re: Urgent: Coloring Drawn Hexagons
 
Between drawing each hexagon, call SelectClipRgn(NULL) to reset the clipping region, then call it again with the new hex region.

chadz 16Nov2009 05:20

Re: Urgent: Coloring Drawn Hexagons
 
Quote:

Originally Posted by Gene Poole (Post 60096)
Between drawing each hexagon, call SelectClipRgn(NULL) to reset the clipping region, then call it again with the new hex region.

thx a lot for ur help... but i tried that and it didnt work...
if u dun mind ill show u my code tell me how exactly should i do it , and thx in advance but its just i need to fix it before wednesday and its not working...

i have a class called childview.cpp it has sthg like:
.
.
.
.//code
.
.
Code:

void CChildView::drawMap(CDC * pdc)
{
  Hexagon obj;


  CPoint point(600, 150);
 
  CClientDC dc(this);
  Dimensions dStep;
  double hexagonSide = 40;//side of one edge
  double r=((cos(30*PI/180))*hexagonSide);
  int r2=int (ceil(r));
  int NbOfHexes=3;
    int shiftByX=hexagonSide+r2;
   
   
      CBitmap test;
    test.LoadBitmapW(IDB_BITMAP7);//IDB_BITMAP2
   

    COLORREF RGB=RGB(255,0,255);//RGB object
  //**** Starting hex
    dStep = obj.draw(pdc, point, hexagonSide,test,RGB,RandColorsVec);
..//then changing coordinate of points then drawing again
  dStep = obj.draw(pdc, point, hexagonSide,test,RGB,RandColorsVec);
//etc....


//and the method .draw is in a class called hexagons.cpp and is as follows:
Dimensions Hexagon::draw(CDC * pdc,
    CPoint crdSouthEast, double hexagonSide,CBitmap& test,COLORREF RGB,vector <COLORREF> *RandColorsVec)
{   


 
  Dimensions dResult;
  CPoint m_StartPoint = crdSouthEast;//(100,100)
  CPoint m_EndPoint = crdSouthEast;
  CPoint Temp;
  computeHexagonQuantities(hexagonSide);//

    POINT pts[6];//set of vertices of the hex
   
   
   
//Drawing
    m_StartPoint.x -= int(ceil(r));

    int temp=int(ceil(r));
    m_EndPoint.x =m_StartPoint.x+temp;
    m_EndPoint.y -= int(ceil(r));
 



    pts[0]=m_StartPoint;
    pts[1]=m_EndPoint;

    m_EndPoint.x=m_StartPoint.x;
    m_EndPoint.y-= int(ceil(r));

   
    pts[2]=m_EndPoint;
 

    m_EndPoint.x-=int(ceil(s));
   
    pts[3]=m_EndPoint;

   
    Temp.x=m_EndPoint.x;
    m_EndPoint.x-=int(ceil(r));

    m_EndPoint.y+= int(ceil(r));
    //dc.LineTo(m_EndPoint);

    pts[4]=m_EndPoint;


    m_EndPoint.x = Temp.x;
   
    m_EndPoint.y+= int(ceil(r));
    //dc.LineTo(m_EndPoint);

    pts[5]=m_EndPoint;



    m_EndPoint.x =m_StartPoint.x;
    m_EndPoint.y =m_StartPoint.y;
   

  pdc->Polygon(pts,6);
   

  dResult.height = int(ceil(b));
  dResult.width = int(ceil(a));
  dResult.h = int(ceil(h));
  dResult.r = int(ceil(r));
 
 
  return dResult;
 
}


//so can u add the codes for me plz? thx again


Gene Poole 16Nov2009 19:40

Re: Urgent: Coloring Drawn Hexagons
 
Sorry, I can't do much with that code. There are several classes that I have no idea what they do and I don't know how or where you are calling this function. I don't see any use of CRgn or SetClipRgn in this code snippit either.


All times are GMT +5.5. The time now is 21:21.