Как добиться эффекта типа кнопки с помощью растровых изображений

Здравствуйте, у меня проблема, связанная с использованием диалогового окна с включенным растровым изображением. Я создал раскладку типа клавиатуры и хочу также получать ввод с клавиатуры. Когда я использую мышь, я могу получить кнопки (кнопки) нажаты, а также все кнопки работают нормально - другие изображения DEFAULT,SELECTED,DISABLED .. все загружаются и работают, так как я использую функцию здесь m_BtnBtn1Ctrl.LoadBitmaps, но тогда любая клавиша, нажатая на клавиатуре, и соответствующий символ на экране не могут сделать так же, как я смог сделать это, щелкнув мышью (и используя функцию Loadbitmaps()).

Я использую эти 3 функции для достижения того же действия и эффекта, что и при использовании мыши
LoadBitmap()
SetBitmap()
Invalidate()

Я также пробовал этот кусок кода

HBITMAP hbm = (HBITMAP)LoadImage(NULL, "\\res\\Selected\\bitmap21.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

а также

bitmap.Attach((HBITMAP)LoadImage(NULL, "\\res\\Selected\\bitmap21.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION));

но они, похоже, не дают эффекта нажатой кнопки, хотя внутри они работают. Может кто-нибудь, пожалуйста, помогите мне с этим

Спасибо и с уважением Сайони

Крах

BOOL KeyBoard_press::PreTranslateMessage(MSG* pMsg)
{
    // TODO: Add your specialized code here and/or call the base class
    CString strTemp;
    if (pMsg->message == WM_KEYDOWN)
    {
        if ( pMsg->wParam == 0x41 || pMsg->wParam == 0x61) //check for both 'a' and 'A'
            OnBtnBtn1();
        if (pMsg->wParam == VK_RETURN || pMsg->wParam == VK_DELETE ||
            pMsg->wParam == VK_ESCAPE || pMsg->wParam == VK_TAB ||
            pMsg->wParam == VK_UP || pMsg->wParam == VK_DOWN || GetKeyState (VK_CONTROL))
            {
                ::TranslateMessage (pMsg);
                ::DispatchMessage (pMsg);
                return TRUE;                // DO NOT process further
            }
    }
    return CDialog::PreTranslateMessage(pMsg);
}

person linuxstack    schedule 27.08.2010    source источник
comment
привет, Керидо, большое спасибо за ответ о том, как смоделировать виртуальную клавиатуру ... извините за столь поздний ответ, потому что я думал, что не смогу получить ответ / помощь по этому вопросу ...   -  person linuxstack    schedule 12.01.2011
comment
но я все еще застрял, когда дело доходит до обработки сообщений WM_LBUTTONDOWN и WM_LBUTTONUP, это сообщения, которые должны обрабатываться, поскольку без предварительного нажатия на виртуальную клавиатуру я не могу получить эффект pushdown на виртуальной клавиатуре.   -  person linuxstack    schedule 12.01.2011
comment
и, кроме того, когда я щелкаю мышью, как обычный пользователь, кнопка появляется естественным образом, но когда я снова нажимаю конкретную клавишу, она не дает эффекта кнопки, вместо этого она остается ВВЕРХ, и граница выглядит так, как если бы она была выбрана..... Я застрял здесь, не могли бы вы сообщить мне, как действовать дальше, и, честно говоря, я новичок в VC++... еще раз спасибо за всю помощь   -  person linuxstack    schedule 12.01.2011


Ответы (1)


Насколько я понимаю, у вас есть ряд кнопок, которые имитируют раскладку клавиатуры компьютера. всякий раз, когда пользователь нажимает клавишу на клавиатуре, вам необходимо имитировать нажатие кнопки в диалоговом окне. Вы предоставили растровые изображения для каждого состояния каждой кнопки.

Для этого я бы обработал сообщения WM_KEYDOWN и WM_KEYUP. В обработчиках используйте некоторое сопоставление ключа с фактическим экземпляром кнопки. Затем отправьте BM_SETSTATE на кнопку управления.

Затем обработайте сообщение WM_COMMAND от каждой из кнопок и проверьте код BN_CLICKED.

person Kerido    schedule 27.08.2010
comment
привет, Керидо, большое спасибо, но я не могу получить эффект нажатия на виртуальную клавиатуру ... и, кроме того, когда я щелкаю мышью, как обычный пользователь, кнопка появляется естественным образом, но когда я снова нажимаю ту же клавишу, она не дает эффект кнопки, вместо этого он остается ВВЕРХ, и линия границы выглядит так, как будто она была выбрана ..... Я застрял здесь, не могли бы вы сообщить мне, как действовать дальше, и, честно говоря, я новичок в VC ++ ... еще раз спасибо за всю помощь - person linuxstack; 12.01.2011
comment
Привет, Керидо, извините за поздний ответ, и я отправил вам электронное письмо с подробным описанием моей проблемы ... я могу получить эффект кнопки при нажатии любой буквы, такой как клавиша A ... но теперь сразу, если я нажму кнопку с помощью растровое изображение A и снова, если я нажму клавишу A на клавиатуре, эффекта кнопки не будет ... любые предложения, пожалуйста, дайте мне знать ... еще раз спасибо - person linuxstack; 12.01.2011
comment
@Keridohello Керидо огромное спасибо за ответ о том, как имитировать виртуальную клавиатуру ... извините за столь поздний ответ, потому что я думал, что не смогу получить какой-либо ответ / помощь по этому вопросу ... но я все еще застрял, когда он приходит к обработке сообщений WM_LBUTTONDOWN и WM_LBUTTONUP, это сообщения, которые должны обрабатываться без предварительного нажатия на виртуальную клавиатуру - person linuxstack; 01.07.2011
comment
я не могу получить эффект нажатия на виртуальную клавиатуру ... и, кроме того, когда я щелкаю мышью, как обычный пользователь, кнопка появляется естественным образом, но когда я снова нажимаю конкретную клавишу, она не дает эффект кнопки, вместо этого она остается ВВЕРХ и линия границы выглядит так, как будто она была выбрана ..... Я застрял здесь, не могли бы вы сообщить мне, как действовать дальше, и, честно говоря, я новичок в VC ++ ... еще раз спасибо за всю помощь - person linuxstack; 01.07.2011