C++ 自旋控制GetPos()值延迟
我有一个编辑控件和一个旋转控件,初始位置设置为0。单击向上箭头时,编辑框从0变为1,这很好。但是当我使用C++ 自旋控制GetPos()值延迟,c++,visual-studio-2015,mfc,controls,C++,Visual Studio 2015,Mfc,Controls,我有一个编辑控件和一个旋转控件,初始位置设置为0。单击向上箭头时,编辑框从0变为1,这很好。但是当我使用GetPos()时,MyValue为0。当自旋控件再次从1增加到2时,MyValue变为1。按下向下箭头时,编辑框从2变为1,但值变为2。似乎MyValue始终是自旋控件后面的一个操作 BOOL CAlphaDlg::OnInitDialog() { // default code left out to keep it short ... /
GetPos()
时,MyValue
为0。当自旋控件再次从1增加到2时,MyValue变为1。按下向下箭头时,编辑框从2变为1,但值变为2。似乎MyValue
始终是自旋控件后面的一个操作
BOOL CAlphaDlg::OnInitDialog()
{
// default code left out to keep it short ...
// TODO: Add extra initialization here
// set range and initial position
mSpinControl.SetRange(0, 3600); // range
mSpinControl.SetPos(0); // inital position
MyValue = mSpinControl.GetPos();
// display initial value in buddy editcontrol
mEditControlDisplay.Format("%d", MyValue);
UpdateData(false);
return TRUE;
}
void CAlphaDlg::OnDeltaposSpin1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMUPDOWN pNMUpDown = reinterpret_cast<LPNMUPDOWN>(pNMHDR);
// TODO: Add your control notification handler code here
UpdateData(true);
int MyValue= mSpinControl.GetPos();
std::cout << MyValue << std::endl;
*pResult = 0;
}
BOOL-CAlphaDlg::OnInitDialog()
{
//保留默认代码以保持简短。。。
//TODO:在此处添加额外的初始化
//设置范围和初始位置
mSpinControl.SetRange(03600);//范围
mSpinControl.SetPos(0);//初始位置
MyValue=mSpinControl.GetPos();
//在控件中显示初始值
mEditControlDisplay.Format(“%d”,MyValue);
更新数据(假);
返回TRUE;
}
无效CAlphaDlg::OnDeltaposSpin1(NMHDR*pNMHDR,LRESULT*pResult)
{
LPNMUPDOWN pNMUpDown=重新解释铸件(pNMHDR);
//TODO:在此处添加控件通知处理程序代码
更新数据(真);
int MyValue=mSpinControl.GetPos();
std::cout AppendMenu(MF_分隔符);
pSysMenu->AppendMenu(MF_字符串、IDM_ABOUTBOX、strAboutMenu);
}
}
//设置此对话框的图标。框架会自动执行此操作
//当应用程序的主窗口不是对话框时
设置图标(m_hIcon,真);//设置大图标
设置图标(m_hIcon,FALSE);//设置小图标
//TODO:在此处添加额外的初始化
mSpinControl.SetRange(0,10);
mSpinControl.SetPos(0);
int MyValue=mSpinControl.GetPos();
mEditControlDisplay.Format(“%d”,MyValue);
更新数据(假);
返回TRUE;//除非将焦点设置为控件,否则返回TRUE
}
void CAlphaDlg::OnSysCommand(UINT-nID,LPARAM-LPARAM)
{
if((nID&0xFFF0)=IDM_ABOUTBOX)
{
卡布特德尔加布特;
dlgAbout.DoModal();
}
其他的
{
CDialogEx::OnSysCommand(nID,lParam);
}
}
//如果在对话框中添加最小化按钮,则需要以下代码
//来绘制图标。对于使用文档/视图模型的MFC应用程序,
//这是框架自动为您完成的。
void CAlphaDlg::OnPaint()
{
if(IsIconic())
{
CPaintDC(this);//用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND,reinterpret_cast(dc.GetSafeHdc()),0);
//在客户端矩形中居中图标
int cxIcon=GetSystemMetrics(SM_cxIcon);
int cycon=GetSystemMetrics(SM_cycon);
正确无误;
GetClientRect(&rect);
intx=(rect.Width()-cxIcon+1)/2;
int y=(rect.Height()-cycon+1)/2;
//绘制图标
dc.DrawIcon(x,y,m_hIcon);
}
其他的
{
CDialogEx::OnPaint();
}
}
//系统调用此函数以获取用户拖动时要显示的光标
//最小化的窗口。
HCURSOR CAlphaDlg::OnQueryDragIcon()
{
返回静态_cast(m_hIcon);
}
无效CAlphaDlg::OnDeltaposSpin1(NMHDR*pNMHDR,LRESULT*pResult)
{
LPNMUPDOWN pNMUpDown=重新解释铸件(pNMHDR);
//TODO:在此处添加控件通知处理程序代码
*预设值=0;
更新数据(真);
int MyValue=mSpinControl.GetPos();
STD::CUT首先,考虑将编辑框映射到<代码> INT/COM>,然后不需要将其转换成字符串。默认值为0,开始旋转器就可以了。也可以关闭自动好友。
在deltapos处理程序中,可以执行以下操作:
void CMFCApplication1Dlg::OnDeltaposSpin1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMUPDOWN pNMUpDown = reinterpret_cast<LPNMUPDOWN>(pNMHDR);
// TODO: Add your control notification handler code here
*pResult = 0;
SetDlgItemInt(IDC_EDIT1, pNMUpDown->iPos);
UpdateData(TRUE);
CString a;
a.Format(_T("%d"), iNumberValue);
AfxMessageBox(a);
}
现在还不清楚您为什么要调用,然后继续手动填充控件,或者手动将它们读回。这就是UpdateData
应该为您做的。@i我的错误,UpdateData(true)在OnDeltaposSpin1中,当我试图从编辑控件中获取的值时,它被用来从编辑控件中检索数据,因为它显示了正确的值。它不起作用,并且具有相同的延迟行为。我删除了std::cout的行。但是,UpdateData
调用OnInitDialog
,这一行是不需要的,除非y您没有调用基类实现。您应该调用它。@IInspectable在OnInitDialog中调用的UpdateData用于在编辑控件框中显示初始值0。没有它,编辑控件框在单击旋转控件之前保持空白。这意味着您没有调用基类实现。没有调用基类实现阻止对话框正确初始化。这就是为什么要提供完整代码的原因。使用此实现,在首次按下spincontrol时,AfxMessageBox(a)显示int 0。在我确认“确定”后,编辑控件将递增为1。是否有办法使AfxMessageBox(a)保持不变要在初次按下时显示1而不是0?Thanks@TMa刚刚更新了我的答案,补充了一点信息。谢谢你接受。如果可以的话,别忘了对它进行投票。:)
void CMFCApplication1Dlg::OnDeltaposSpin1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMUPDOWN pNMUpDown = reinterpret_cast<LPNMUPDOWN>(pNMHDR);
// TODO: Add your control notification handler code here
*pResult = 0;
SetDlgItemInt(IDC_EDIT1, pNMUpDown->iPos);
UpdateData(TRUE);
CString a;
a.Format(_T("%d"), iNumberValue);
AfxMessageBox(a);
}
void CMFCApplication1Dlg::OnDeltaposSpin1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMUPDOWN pNMUpDown = reinterpret_cast<LPNMUPDOWN>(pNMHDR);
int iCurrentPos = pNMUpDown->iPos;
if (pNMUpDown->iDelta > 0)
iCurrentPos++;
else
iCurrentPos--;
CString strNewValue;
strNewValue.Format(_T("%d"), iCurrentPos);
AfxMessageBox(strNewValue);
*pResult = 0;
}
int iCurrentPos = pNMUpDown->iPos + pNMUpDown->iDelta;