我在一开始 让 id为 (IDC_ShowPassWord)的 cedit 隐藏,不让显示
  在我按某个键 一定时间后显示出来,现在我怎么 它业不显示,大侠帮忙看看代码如下BOOL CEnCryptDlg::PreTranslateMessage(MSG* pMsg) 
{
// TODO: Add your specialized code here and/or call the base class
int temp(pMsg->wParam);

if(pMsg->message==WM_KEYDOWN || pMsg->message==WM_KEYUP || pMsg->message == WM_ACTIVATE)
{
if (pMsg->message==WM_KEYDOWN)
{
if (temp==83)
{
m_dwTimeStarted =0;
m_dwTimeStoped =0;
m_dwTimeStarted = GetTickCount();
}
}

if (pMsg->message==WM_KEYUP)
{
if(temp==83)
{
m_dwTimeStoped = GetTickCount();
if ((m_dwTimeStoped - m_dwTimeStarted) >=1000)
{
this->GetDlgItem(IDC_ShowPassWord)->ShowWindow(SW_SHOW);
this->SetDlgItemText(IDC_ShowPassWord,m_showpassword);
Invalidate();
}
}
} }
return CDialog::PreTranslateMessage(pMsg);
}但是我用 一个button 测试 却可以显示
void CEnCryptDlg::OnButton222() 
{
// TODO: Add your control notification handler code here
this->GetDlgItem(IDC_ShowPassWord)->ShowWindow(SW_SHOW);
this->SetDlgItemText(IDC_ShowPassWord,m_showpassword);
}这是为什么?

解决方案 »

  1.   

    重新贴一下代码吧,以代码的方式贴。
    eg:BOOL CEnCryptDlg::PreTranslateMessage(MSG* pMsg)
    {
    // TODO: Add your specialized code here and/or call the base class
    int temp(pMsg->wParam);if(pMsg->message==WM_KEYDOWN ¦ ¦ pMsg->message==WM_KEYUP ¦ ¦ pMsg->message == WM_ACTIVATE)
    {
    if (pMsg->message==WM_KEYDOWN)
    {
    if (temp==83)
    {
    m_dwTimeStarted =0;
    m_dwTimeStoped =0;
    m_dwTimeStarted = GetTickCount();
    }
    }if (pMsg->message==WM_KEYUP)
    {
    if(temp==83)
    {
    m_dwTimeStoped = GetTickCount();
    if ((m_dwTimeStoped - m_dwTimeStarted) >=1000)
    {
    this->GetDlgItem(IDC_ShowPassWord)->ShowWindow(SW_SHOW);
    this->SetDlgItemText(IDC_ShowPassWord,m_showpassword);
    Invalidate();
    }
    }
    }}
    return CDialog::PreTranslateMessage(pMsg);
    }但是我用 一个button 测试 却可以显示
    void CEnCryptDlg::OnButton222()
    {
    // TODO: Add your control notification handler code here
    this->GetDlgItem(IDC_ShowPassWord)->ShowWindow(SW_SHOW);
    this->SetDlgItemText(IDC_ShowPassWord,m_showpassword);

      

  2.   

    你把invalidate去掉或换成只重绘按钮区域试试。
      

  3.   

    代码贴出来 变成这样的,在程序中不是这样的
    BOOL CEnCryptDlg::PreTranslateMessage(MSG* pMsg) 
    {
    // TODO: Add your specialized code here and/or call the base class
    int temp(pMsg->wParam);

    if(pMsg->message==WM_KEYDOWN || pMsg->message==WM_KEYUP || pMsg->message == WM_ACTIVATE) {
    if (pMsg->message==WM_KEYDOWN)
    {
    if (temp==83)
    {
    m_dwTimeStarted =0;
    m_dwTimeStoped =0;
    m_dwTimeStarted = GetTickCount();
    }
    }

    if (pMsg->message==WM_KEYUP)
    {
    if(temp==83)
    {
    m_dwTimeStoped = GetTickCount();
    if ((m_dwTimeStoped - m_dwTimeStarted) >=1000)
    {
    this->GetDlgItem(IDC_ShowPassWord)->ShowWindow(SW_SHOW);
    this->SetDlgItemText(IDC_ShowPassWord,m_showpassword);
    Invalidate();
    }
    }
    } }
    return CDialog::PreTranslateMessage(pMsg);
    }void CEnCryptDlg::OnButton222() 
    {
    // TODO: Add your control notification handler code here
    this->GetDlgItem(IDC_ShowPassWord)->ShowWindow(SW_SHOW);
    this->SetDlgItemText(IDC_ShowPassWord,m_showpassword);
    }
      

  4.   

    代码如下BOOL CEnCryptDlg::PreTranslateMessage(MSG* pMsg) 
    {
    // TODO: Add your specialized code here and/or call the base class
    int temp(pMsg->wParam);

    if(pMsg->message==WM_KEYDOWN || pMsg->message==WM_KEYUP || pMsg->message == WM_ACTIVATE) {
    if (pMsg->message==WM_KEYDOWN)
    {
    if (temp==83)
    {
    m_dwTimeStarted =0;
                    m_dwTimeStoped =0;
    m_dwTimeStarted = GetTickCount();
    }
    }

    if (pMsg->message==WM_KEYUP)
    {
    if(temp==83)
    {
    m_dwTimeStoped = GetTickCount();
    if ((m_dwTimeStoped - m_dwTimeStarted) >=1000)
    {
    this->GetDlgItem(IDC_ShowPassWord)->ShowWindow(SW_SHOW);
    this->SetDlgItemText(IDC_ShowPassWord,m_showpassword);
    Invalidate();
    }
    }
    } }
    return CDialog::PreTranslateMessage(pMsg);
    }void CEnCryptDlg::OnButton222() 
    {
    // TODO: Add your control notification handler code here
    this->GetDlgItem(IDC_ShowPassWord)->ShowWindow(SW_SHOW);
    this->SetDlgItemText(IDC_ShowPassWord,m_showpassword);
    }
      

  5.   

    调试跟踪一下看看能不能执行到ShowWindow那里,不过Invalidate确实不需要。
      

  6.   

    没有为83(即0x53)的虚拟键码!!!
    将83改为VK_RETURN,然后按下Enter键1秒试试。
      

  7.   

    代码没有问题,主要是代码条件的判断上有点点问题。楼主的代码中m_dwTimeStoped的值比m_dwTimeStarted的值大大约10~50左右,这个时间是键盘按下再起来的反应时间,这是因为在键盘按下的过程中m_dwTimeStarted被不断赋予了新的值。
    参考修改代码如下:BOOL CTestDlgDlg::PreTranslateMessage(MSG* pMsg) 
    {
    // TODO: Add your specialized code here and/or call the base class static BOOL bGetTickCount = TRUE;
    int temp(pMsg->wParam);
        
        if(pMsg->message==WM_KEYDOWN || pMsg->message==WM_KEYUP || pMsg->message == WM_ACTIVATE)    {    
            if (pMsg->message==WM_KEYDOWN)
            {
                if (temp==83)
                {
    if(bGetTickCount)
    {
    m_dwTimeStarted =0;
    m_dwTimeStoped =0;
    m_dwTimeStarted = GetTickCount();
    bGetTickCount=FALSE;
    }
                }
            }
            
            if (pMsg->message==WM_KEYUP)
            {
                if(temp==83)
                {
                    m_dwTimeStoped = GetTickCount();
                    if ((m_dwTimeStoped - m_dwTimeStarted) >=1000)
                    {
                        this->GetDlgItem(IDC_ShowPassWord)->ShowWindow(SW_SHOW);
                        this->SetDlgItemText(IDC_ShowPassWord,m_showpassword);
                    }
    bGetTickCount = TRUE;
                }
            }    } return CDialog::PreTranslateMessage(pMsg);
    }
    判断键盘按下83对应的键超过1秒钟,上面代码应该可行。
    不知83对应键盘上那个键,没有进行测试,楼主可否告知83对应的键?
      

  8.   

    呵呵,原来83对应VK_RETURN,那在对话框中作这样的测试判断好危险,缺省按钮和获得焦点的控件都会优先捕获VK_RETURN键盘消息,如果对话框上没有其他控件估计还行
      

  9.   

    83对应的是S键,但是按下不放的话,会一直产生WM_KEYDOWN事件,所以那个开始时间
    在不停的变化,我用spy++看了下。
      

  10.   

    maomaoxiong添加的bGetTickCount是很必要的