想实现,是10个按钮按圆形排列。
下面是我自己写的一个函数,但有点问题,就是2和3,7和8是平行排列的
我是想没有平行的按钮,都是错开的,成一个圆形。
求高手帮我修改一下谢谢~~~~
const int NUM = 10;
const int FIRST_BUTTON_ID = 1000;
const double PI = 3.1415926;const int CENTER_X = 350;
const int CENTER_Y = 150;
const int RADIUS = 100;const int BUTTON_W = 50;
const int BUTTON_H = 20;
void CMiBaoDlg::IniNum()
{
CButton *pBn = NULL;
char strNum[MAX_PATH] = {0};
int iAngle = 0;
CRect rect;
int iOffsetAngle = 360 / NUM;
int iOffsetX = 0;
int iOffsetY = 0; for ( int iNum = 0; iNum < NUM; iNum++ )
{
pBn = new CButton;
sprintf_s( strNum, "%d", iNum ); memset( &rect, 0, sizeof(rect) );
rect.left = LONG(CENTER_X + RADIUS * cos(PI*iAngle/180) + iOffsetX);
rect.top = LONG(CENTER_Y + RADIUS * sin(PI*iAngle/180) + iOffsetY);
rect.right = rect.left + BUTTON_W;
rect.bottom = rect.top + BUTTON_H; int iID = FIRST_BUTTON_ID + iNum;
pBn->Create( strNum, WS_VISIBLE|WS_CHILD, rect, this, iID );
iAngle += iOffsetAngle; }
}

解决方案 »

  1.   

    如果是10个按钮的话可得固定值18角度。按这个角度逆时针旋转就可以。(即把你的start角度初始化为- 18)
    这个角度d可以预先这样计算。
    for(int iNum = 0; iNum < NUM; iNum++ )
    {
       iAngle += iOffsetAngle;
       if(iAngle == 90)
       {
          d = 0;
          break;
       }
       else if(iAngle > 90)
       {
          d = iAngle - 90;
          break;
       }
    }
      

  2.   

    谢谢 j8daxue 比我那个排列好看多了还有一个问题,想点一个按钮,可以让这10个按钮旋转起来
    其实也就是0按钮用1按钮的坐标移动即可
    但貌似没有移动的效果
    为什么?
    按钮必须是动态创建的!!!!
    void CMiBaoDlg::OnBnClickedButton1()
    {
    for ( int i = 0; i < (int)m_vecButton.size(); i++ )
    {
    stBnCycle *pBnCycleFront = m_vecButton[i];
    if ( NULL == pBnCycleFront )
    continue;
    CButton *pBnFront = pBnCycleFront->m_pBn;
    if ( NULL == pBnFront )
    continue; if ( i == 9 )
    i = -1;
    stBnCycle *pBnCycleBack = m_vecButton[i+1];
    if ( NULL == pBnCycleBack )
    continue;
    CRect rtBack = pBnCycleBack->m_rectBn;

    pBnFront->MoveWindow( rtBack );
    }
    }
      

  3.   

    你坐标对不?或者你调用了DestroyWindow,delete删除了??
      

  4.   

    不知道你里面的存储是怎样的,m_rectBn要通过每个button得到GetWindowRect后再ScreenToClient才是对的。