最近要完成个任务。在一个对话框下建15-20个按钮(我准备动态生成),然后右键出现菜单可选择显示或者不显示某个按钮(叫它按钮定制不知道准不准确?),我不知道选了一个按钮之后,所有的按钮怎么重新排列位置(貌似用隐藏是行不通的),是用WM_COMPAREITEM和WM_DELETEITEM消息来实现吗?  然后我又想不显示某个按钮,再怎么排...大虾们, 怎么实现...

解决方案 »

  1.   

    对按钮 MoveWindow
    使用 ShowWindow隐藏按钮.
      

  2.   

       ..晕  我刚才6点的没回复成功啊..    楼上的哥子,我是要生成15个按钮(就先按15个来说),加入我现在要显示其中的第3 6 9 10个,那么MoveWindow将按钮怎么移呢?加入我又加了一个呢. 那菜单中的对应项中的每个消息处理不是非常复杂吗? 就像古代的 皇帝赔麦子给数学家一样呈指数增长了...我的想法是用链表类似的来存每个按钮,然后右键菜单添加一个的话,那么后面的按钮就按顺序后移;删除一个按钮的话,后面的按钮就前移,但是不知道怎么实现。   我是新手,说的可能不对,还望大虾们不惜赐教  嘿嘿
      

  3.   

    做个结构
    struct BTNINFO
    {
        CWnd*  m_pWnd;
        BOOL   m_bIsShow;
    };
    让后用一个CArray存这个结构
    创建按钮的时候把按钮的指针赋给m_pWnd
    每次更新显示的时候就通过设置m_bIsShow的值
    然后重排的话就从头遍历数组
    m_bIsShow为真就显示
    是假就隐藏
      

  4.   

    1. 首先把按钮在界面上按顺序排好,计算按钮位置,按顺序把CRect存入CList1中,把按钮窗口指针存入CList2中。2. 根据命令选择显示的按钮:比如3,6,9   CWnd *pWnd = CList2.GetAt(3);
       CRect rc1 = CList1.GetAt(0);//注意序号
       pWnd->MoveWindow(rc1);
       pWnd->ShowWindow(SW_SHOW);   pWnd = CList2.GetAt(6);
       CRect rc2 = CList1.GetAt(1);//注意序号
       pWnd->MoveWindow(rc2);
       pWnd->ShowWindow(SW_SHOW);   ........
      

  5.   

      5楼的方案好像不行啊,我还要删除按钮呢,那个按序号来设置RECT也不行,太复杂吧... 
       4楼的应该可以,不过需要加一个RECT,在结构体中能加吧应该?  我用
             struct BTNINFO

    CButtonST   *m_pWnd;
    BOOL m_bIsShow;
    };  CArray <BTNINFO,BTNINFO&> MyArray;
      然后 CButtonST *pButton = new CButtonST[11];
               MyArray.SetSize(11);   if (pButton[0].Create("", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(rect.left + 12, rect.top + 15, rect.left + 51, rect.top + 54), this, IDC_BTN_DOCUMENT))
          MyArray[0].m_pWnd = &pButton[0];//这一句不对.. 我也知道不对,但是不知道怎么按你说的创建按钮的时候把按钮的指针赋给m_pWnd...  大虾们,我新手,帮帮忙,顺便给加个RECT, 最重要的RECT排序怎么弄..
      

  6.   

    右键响应菜单后重新排列button的位置,可以使用MoveWindow/SetWindowPos();
    vector<HWND> vec;来保存你动态创建button的HWND
      

  7.   

       好的 谢谢各位,估计到星期一才能试的,先结贴吧 不知道做不做的出来...总觉得有点问题,没这么简单..   假如我连续删除几个按钮在那个菜单响应里怎么写?我感觉我会吧菜单响应写死.. 那个RECT一定要用链表来存,不然SetWindowPos会成功不了吧...