如何使用位图实现按钮式效果

Posted

技术标签:

【中文标题】如何使用位图实现按钮式效果【英文标题】:How to achieve pushbutton type effect using bitmaps 【发布时间】:2010-08-27 05:45:23 【问题描述】:

您好,我有一个与启用位图的对话框窗口的使用有关的问题。我创建了一个键盘类型布局,我也希望通过键盘获得输入。当我使用鼠标时,我能够获得按钮(s)按下并且所有按钮都工作正常 - 其他图像DEFAULT,SELECTED,DISABLED ..all 都被加载并工作,因为我在这里使用了m_BtnBtn1Ctrl.LoadBitmaps 的功能,但是随后按下键盘上的任何键和相应的字符screen 无法像我通过单击鼠标(并使用 Loadbitmaps() 函数)所做的那样。

我正在使用这三个功能来实现与使用鼠标相同的动作和效果 加载位图() SetBitmap() 无效()

我也试过这段代码

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);

【问题讨论】:

你好 Kerido 非常感谢您对如何模拟虚拟键盘的回复...很抱歉这么晚才回复,因为我想我将无法获得有关此问题的任何回复/帮助... 但是在处理 WM_LBUTTONDOWN 和 WM_LBUTTONUP 消息时我仍然卡住了,这些是要处理的消息,因为如果不先点击虚拟键盘,我无法获得下推效果虚拟键盘.. 此外,当我以普通用户的身份使用鼠标单击时,按钮会自然而然地出现,但是当我再次按下特定键时,它不会产生按钮效果,而是保持向上,并且边框线看起来好像它已被选中.....我被困在这里,你能告诉我如何进一步进行吗?坦率地说,我是 VC++ 的新手......再次感谢所有帮助 【参考方案1】:

据我了解,您有一系列模拟计算机键盘布局的按钮。每当用户按下键盘上的键时,您都需要在对话框中模拟按钮单击。您已经为每个按钮的每个状态提供了位图。

为此,我将处理WM_KEYDOWNWM_KEYUP 消息。在处理程序中,使用键到实际按钮实例的一些映射。然后,将BM_SETSTATE 发送到按钮控件。

然后,处理来自每个按钮的WM_COMMAND 消息并检查BN_CLICKED 代码。

【讨论】:

你好 Kerido 非常感谢,但我无法在虚拟键盘上获得下推效果。此外,当我以普通用户的身份用鼠标单击时,按钮会自然而然地出现,但是当我按下时再次“相同”键它没有给出按钮效果而是保持UP并且边界线看起来好像它被选中了.....我被困在这里你能告诉我如何进一步进行并且坦率地说我我是 VC++ 的新手...再次感谢所有帮助 您好 Kerido 很抱歉回复晚了,我已经通过电子邮件向您详细说明了我遇到的问题...我能够在按下任何字母(例如 A 键)时获得按钮效果...但是现在,如果我单击带有位图 A 的按钮,然后再次单击键盘上的键 A,则立即没有按钮效果...任何建议请告诉我..再次感谢 @Keridohello Kerido 非常感谢您对如何模拟虚拟键盘的回复...很抱歉这么晚才回复,因为我想我将无法获得有关此问题的任何回复/帮助.. .但是在处理 WM_LBUTTONDOWN 和 WM_LBUTTONUP 消息时我仍然卡住了,这些是要处理的消息,因为没有先点击虚拟键盘 我无法在虚拟键盘上获得下推效果。此外,当我以普通用户的身份用鼠标单击时,按钮会自然而然地出现,但是当我再次按下特定键时它不会给出一个按钮效果,而不是它保持 UP 并且边界线看起来好像它被选中了......我被困在这里,你能告诉我如何继续前进,坦率地说我是 VC++ 的新手......再次感谢所有帮助

以上是关于如何使用位图实现按钮式效果的主要内容,如果未能解决你的问题,请参考以下文章

MFC按钮控件实现指示灯效果

如何在画布上移动两个位图图像

LWUIT 位图字体

猎豹MFC--Toolbar工具栏也是一种4位16色位图资源

如何将位图图像设置为按钮背景图像

如何更改MFC按钮的背景色