Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 自旋控制GetPos()值延迟_C++_Visual Studio 2015_Mfc_Controls - Fatal编程技术网

C++ 自旋控制GetPos()值延迟

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 ... /

我有一个编辑控件和一个旋转控件,初始位置设置为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 ...
           // 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;