今天白天作程序的时候出现一个问题,具体如下:
我做的一个基于对话框的程序,程序的主要元素有:
主窗口:mainDlg,
继承的按钮类:CMyButton从CButton
如果,按照下列步骤
1)在mainDlg中拉一个按钮,从ClassWizard将增加的按钮指定为CMyButton类的m_button
2)在CMyButton 的preSubClassWindow中用GetClientRect(&rect)
这是rect.left和rect.top为零,而rect.right,rect.bottom分别为按钮的宽和高.但是用一下方法
1)在CMainDlg类中添加:CMyButton m_button;
在mainDlg的OnInitDialog中写m_button.create("",WS_CHILD|WS_VISIBLE|WS_OWNERDRAW,CRect(100,100,300,300),this,2001);
2)在CMyButton 的preSubClassWindow中用GetClientRect(&rect)
这是rect的四个值都是零
现在,我的程序有一百多个按钮,所以不可能拉一百多个按钮控件上来,只能采用后一种方法动态生成按钮,但这是在步骤2中无法取得rect的四个值,所以没有办法给按钮制定新的边界(制定边界是需要用的这四个数)同时DrawItem中也要用到这四个数.不知道有没有什么好的方法解决这个问题.谢谢

解决方案 »

  1.   

    拉一百多个按钮控件也不是不可以,可以用Ctrl_C + Ctrl_V。如果控制方面操作相近,还可以用在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间利用ON_CONTROL_RANGE定义响应函数,但是需要Resource.h内的相关控件ID相连利用((CButton*)GetDlgItem(nID))可得到相应ID的控件指针
      

  2.   

    我觉得你用指针试一试,CMyButton button=new CMyButton(this);
    button->Create(...)
    前两天我业遇到一个类似的问题,只是结果和你的不一样,我就是这样处理的,不知道行不行,我现在也没有搞清楚,在这里指针和对象的区别.
      

  3.   

    首先,你的思想是错的。我告诉step;
    1.
    在mainDlg.h中
    #define BUTTONCOUNTS   1000
    #define BUTTONSSTARTID    5555//最好大一些,不要重复2.
    mainDlg的成员变量
    CMyButton m_buts[BUTTONCOUNTS]3.在mainDlg的oncreate中
    for(int i=0;i<BUTTONCOUNTS   ;i))
    {
    m_buts[i].create("",WS_CHILD|WS_VISIBLE|WS_OWNERDRAW,CRect(0,0,1,1),this,BUTTONSSTARTID  + i);}
    4.在mainDlg的onsize中
    得到mainDlg客户区大小Getclientrect();
    安排每个 button的位置。你自己计算。
    5.增回消息响应。
    在mainDlg.cpp中用on_command_range宏
    在mainDlg.h中回响应函数,可以参照msdn上的sample至此工作基本完成,但最重要的是要测试。
      

  4.   

    感觉 wwwllg(wwwllg)的方法有戏