方法调用问题。 请问,如果我窗体上有个按钮,请问程序中,单机这个按钮和 程序某块调用此单机按钮的方法,这个方法内处理的结果是否一样?如果不一样有什么区别 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 单机这个按钮 是通过MFC宏发送点击消息执行你的程序,这和 程序某块直接调用 是一样的,你可以看宏定义中传递的参数。 好的,代码如下void CDlgContactOther::OnBnClickedBtnAddtool(){ // TODO: 在此添加控件通知处理程序代码 //m_nControlId++; m_nControlCount++; CRect rect; int count = m_arrControls.GetSize(); if(m_nControlCount>5) { m_vsb_Info.ShowWindow(SW_SHOW); m_vsb_Info.SetScrollRange(0,m_nControlCount-5); m_vsb_Info.SetScrollPos(m_vsb_Info.GetScrollPos()+1); for(int i=0;i<count;i++) { if(m_arrControls.ElementAt(i) == GetDlgItem(IDC_BTN_ADDWEB)||m_arrControls.ElementAt(i) == GetDlgItem(IDC_BTN_ADDADDR)||m_arrControls.ElementAt(i)==GetDlgItem(IDC_BTN_ADDTOOL)) continue; m_arrControls.ElementAt(i)->GetWindowRect(&rect); ScreenToClient(&rect); m_arrControls.ElementAt(i)->SetWindowPos(NULL,rect.left,rect.top-32,rect.Width(),rect.Height(),SWP_NOZORDER|SWP_NOSIZE); m_arrControls.ElementAt(i)->GetWindowRect(&rect); ScreenToClient(&rect); } } m_arrControls.ElementAt(count-1)->GetWindowRect(&rect); ScreenToClient(&rect); CWDComboBox* cmb = new CWDComboBox(); cmb->Create(WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST,CRect(35,rect.top+32,35+99,rect.top+32+20),this,m_nControlId++); cmb->SetBorderColor(RGB(200,255,255)); cmb->SetFont(&thePrefs.m_font1); cmb->AddString("MSN"); cmb->AddString("QQ"); cmb->SetDroppedWidth(100); cmb->MoveWindow(35,rect.top+32,99,rect.top+32); cmb->SetCurSel(0); CWDEdit* edt = new CWDEdit; edt->Create(WS_CHILD|WS_VISIBLE|WS_TABSTOP,CRect(147,rect.top+32,147+277,rect.top+32+20),this,m_nControlId++); edt-> ModifyStyleEx(0, WS_EX_CLIENTEDGE, SWP_DRAWFRAME); edt->SetBorderColor(RGB(200,255,255)); edt->SetFont(&thePrefs.m_font1); m_arrControls.Add(cmb); m_arrControls.Add(edt); m_arrCmbTool.Add(cmb); m_arrEdtTool.Add(edt); Invalidate(false); } 点击的时候可以生成控件并显示,但是在别的地方调用这方法可以new可以create 就是显示不出来。 然后从m_arrControls里往出取的话可以取到,在GetWindowRect()时 崩溃。 是这样的,这个是联系人信息窗体。首先:我添加联系人的时候,我单击这个按钮是要增加联系人的一条属性。可以实现。 这个窗体也是服务器返回联系人信息的载体,将数据显示其中,当属性不够时就调用这个方法进行增加相应数量的控件,在这个过程中,可以创建,走完都没什么问题,但是直接F5却显示不出来。而且当我再按这个按钮的时候程序走到wnd->GetWindowRect(&rect)时崩溃。 说的应该够详细了吧? 两次调试 int count = m_arrControls.GetSize();count值一样吗 嗯,手动调用的时候这个count也是会增加的 。 你好好调试一下看看,直接F5就不行,肯定是有值没获取到,用outputdebugstring(); 非常有关系,MFC窗口类一般不要跨线程使用请用postmessage(WM_COMMAND,你的按钮ID,0); 如何同步打开任意一个文件,等它关闭后,我继续执行别的代码? 获取的网络时间不正确 两键同时按下的处理函数是OnKeyDown()吗? VC新手求助!将程序改为界面操作! 请教:如何用最快速的方法得到一个16位或24位BMP文件到底包含多少种RGB色彩?仅说思路即可 vc 枚举窗口问题 ,请高手帮忙! 怎么打开声音文件? 关于VxD的问题? 关于setsystemcursor 的参数的问题,急................. 怎样从com中传递一个对象或结构出来??(VC) Windows Socket的服务器端,问题。 写完之后,有点错误,错误排除
程序某块直接调用 是一样的,你可以看宏定义中传递的参数。
void CDlgContactOther::OnBnClickedBtnAddtool()
{
// TODO: 在此添加控件通知处理程序代码
//m_nControlId++;
m_nControlCount++;
CRect rect;
int count = m_arrControls.GetSize();
if(m_nControlCount>5)
{
m_vsb_Info.ShowWindow(SW_SHOW);
m_vsb_Info.SetScrollRange(0,m_nControlCount-5);
m_vsb_Info.SetScrollPos(m_vsb_Info.GetScrollPos()+1);
for(int i=0;i<count;i++)
{
if(m_arrControls.ElementAt(i) == GetDlgItem(IDC_BTN_ADDWEB)||m_arrControls.ElementAt(i) == GetDlgItem(IDC_BTN_ADDADDR)||m_arrControls.ElementAt(i)==GetDlgItem(IDC_BTN_ADDTOOL))
continue;
m_arrControls.ElementAt(i)->GetWindowRect(&rect);
ScreenToClient(&rect);
m_arrControls.ElementAt(i)->SetWindowPos(NULL,rect.left,rect.top-32,rect.Width(),rect.Height(),SWP_NOZORDER|SWP_NOSIZE);
m_arrControls.ElementAt(i)->GetWindowRect(&rect);
ScreenToClient(&rect);
}
}
m_arrControls.ElementAt(count-1)->GetWindowRect(&rect);
ScreenToClient(&rect); CWDComboBox* cmb = new CWDComboBox();
cmb->Create(WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST,CRect(35,rect.top+32,35+99,rect.top+32+20),this,m_nControlId++);
cmb->SetBorderColor(RGB(200,255,255));
cmb->SetFont(&thePrefs.m_font1);
cmb->AddString("MSN");
cmb->AddString("QQ");
cmb->SetDroppedWidth(100);
cmb->MoveWindow(35,rect.top+32,99,rect.top+32);
cmb->SetCurSel(0); CWDEdit* edt = new CWDEdit;
edt->Create(WS_CHILD|WS_VISIBLE|WS_TABSTOP,CRect(147,rect.top+32,147+277,rect.top+32+20),this,m_nControlId++);
edt-> ModifyStyleEx(0, WS_EX_CLIENTEDGE, SWP_DRAWFRAME);
edt->SetBorderColor(RGB(200,255,255));
edt->SetFont(&thePrefs.m_font1); m_arrControls.Add(cmb);
m_arrControls.Add(edt); m_arrCmbTool.Add(cmb);
m_arrEdtTool.Add(edt);
Invalidate(false);
}
m_arrControls里往出取的话可以取到,在GetWindowRect()时 崩溃。
可以实现。 这个窗体也是服务器返回联系人信息的载体,将数据显示其中,当属性不够时就调用这个方法进行增加相应数量的控件,在这个过程中,可以创建,走完都没什么问题,但是直接F5却显示不出来。而且当我再按这个按钮的时候程序走到wnd->GetWindowRect(&rect)时崩溃。 说的应该够详细了吧?
count值一样吗
非常有关系,MFC窗口类一般不要跨线程使用请用postmessage(WM_COMMAND,你的按钮ID,0);