Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Перехват нажатия Enter


Автор: radow 6.4.2009, 22:58
Всем привет. Есть такая проблемка. На форме есть  ListBox, у него есть оброботчик двойного клика. По нажатию клавиши Enter программа закрываеться а я хочу чтобы вызывалась ф-ция обработчика двойного клика ListBox. 
Код

switch(pMsg->message)//здесь я отлавливаю нажатие enter
    {
    case WM_KEYDOWN:
        if(pMsg->wParam==13)
        {
            NMHDR        *pNmhdr;
            LRESULT        *pResult;
            HWND        *h;
        
            pNmhdr = new NMHDR;
            pResult = new LRESULT;
            pNmhdr->hwndFrom = pListControl.m_hWnd;
            pNmhdr->code = NM_DBLCLK;
            pNmhdr->idFrom = 1000;
            OnNMDblclkListFile(pNmhdr, pResult);//обработчик ListBox
            return true;

Код

void CWorkWithWinrarDlg::OnNMDblclkListFile(NMHDR *pNMHDR, LRESULT *pResult)//обработчик ListBox
{
    LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
    
    CString            NameFile,
                    MaskOne,
                    MaskTwo,
                    CSRar,
                    CSTmp;
    CFileFind        CurrentFile;
    bool            bWorking;
    int                k,
                    StartPos;
    HWND            *handle;

    handle = new HWND;
    CSRar.Insert(0,_T("rar"));
    NameFile =  pListControl.GetItemText(pNMItemActivate->iItem,0);[size=6]//проблема в том что это поле           //NMItemActivate->iItem  содержит не правельное значение[/size]
    MaskOne = this->RootFolder+NameFile;
    MaskTwo.Insert(0,_T("*"));
    MaskTwo = this->RootFolder+MaskTwo;// для перехода если найденый файл папка
    bWorking = CurrentFile.FindFile(MaskTwo.GetBuffer());
    while(bWorking)
    {
        bWorking = CurrentFile.FindNextFileA();
        if(MaskOne==CurrentFile.GetFilePath())
        {
            if(CurrentFile.IsDirectory())
            {
                MaskOne.Insert(MaskOne.GetLength(), _T("\\"));
                this->RootFolder=MaskOne;
                FillListControl();
                break;
            }
            else
            {
                StartPos = 0;
                CSTmp = MaskOne.Tokenize(_T("."),StartPos);
                CSTmp = MaskOne.Tokenize(_T("."),StartPos);
                if(CSTmp==CSRar)
                {
                    break;
                }
                else
                {
                    ShellExecute(*handle,"open",MaskOne.GetBuffer(),NULL,NULL,SW_SHOW);
                    break;
                }
            }
        }
    }
    CurrentFile.Close();
    *pResult = 0;
}


Может есть какой-то другой способ это реализовать

Автор: Earnest 7.4.2009, 08:05
Цитата(radow @  6.4.2009,  23:58 Найти цитируемый пост)
void CWorkWithWinrarDlg::OnNMDblclkListFile(NMHDR *pNMHDR, LRESULT *pResult)//обработчик ListBox

Это не обработчик лист-бокс. Лист-бокс не посылает WM_NOTIFY, он посылает WM_COMMAND. Если ты, конечно, не называешь лист-боксом лист вью. Уведомление называется LBN_DBLCLK.

Автор: radow 7.4.2009, 21:47
Ты прав это не ListBox а List Control (sorry за ошибку). Что мне делать с эти уведомлением.

Автор: Earnest 8.4.2009, 07:51
Первый фрагмент кода - это откуда? Из PretranslateMessage? Ты туда попадаешь?

Автор: radow 8.4.2009, 08:59
Да. Первый фрагмент из PretranslateMessage. По события срабатывает это ф-ция OnNMDblclkListFile в нее я и попадаю только нечего непроисходит т.к. pNMItemActivate->iItem содержит неправельое значение.  Может быть я неправельно эту структуру NMHDR        *pNmhdr заполняю.


Автор: Earnest 8.4.2009, 11:42
Заполняешь ты, конечно, неправильно. Во-первых - ты выдеяяешь NMHDR, а должно быть NMITEMACTIVATE, или что там в DBCLICK приходит. И с какой радости pNMItemActivate->iItem будет правильно заполнен, если его вообще никто не заполняет? Я уж молчу о том, что вся эта выделенная радость остается висеть до посинения - никто ее не чистит. Глазом моргуть не успеешь, всю память засрешь...
И вообще, не надо вызывать из обработчика клавиши обработчик клика только потому, что сделать нужно тоже самое. Правильно написать отдельную функцию с ясными параметрами (номер итема и что там еще надо), которую и вызывать как из обаботчика клика, так и из PreTranslate, а не мутить с упаковкой никому не нужного NMHDR.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)