Urgent: Coloring Drawn Hexagons

chadz's Avatar, Join Date: Nov 2009
Newbie Member
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
Attached Images
File Type: jpg hexagon.JPG (1.7 KB, 15 views)
0
Gene Poole's Avatar, Join Date: Nov 2009
Contributor
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.
0
chadz's Avatar, Join Date: Nov 2009
Newbie Member
Quote:
Originally Posted by Gene Poole View Post
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

Last edited by shabbir; 11Nov2009 at 09:45.. Reason: Code blocks
0
Gene Poole's Avatar, Join Date: Nov 2009
Contributor
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);
0
chadz's Avatar, Join Date: Nov 2009
Newbie Member
Quote:
Originally Posted by Gene Poole View Post
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.
Attached Images
File Type: bmp tile_wood.bmp (350.1 KB, 3 views)
File Type: jpg Result.JPG (32.3 KB, 2 views)
0
Gene Poole's Avatar, Join Date: Nov 2009
Contributor
Between drawing each hexagon, call SelectClipRgn(NULL) to reset the clipping region, then call it again with the new hex region.
0
chadz's Avatar, Join Date: Nov 2009
Newbie Member
Quote:
Originally Posted by Gene Poole View Post
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

Last edited by shabbir; 16Nov2009 at 09:18.. Reason: Code blocks
0
Gene Poole's Avatar, Join Date: Nov 2009
Contributor
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.