导航:  CWindow Class > Tutorial >

Keyboard accelerators

上一页返回章节概述下一页

加速器与菜单密切相关 - 两者都为用户提供对应用程序命令集的访问。 通常,用户依靠应用程序的菜单来学习命令集,然后在应用程序变得更加熟练时切换到使用加速器。 加速器比菜单提供更快,更直接的命令访问。 至少应用程序应为更常用的命令提供加速器。 虽然加速器通常生成作为菜单项存在的命令,但它们也可以生成不具有等效菜单项的命令。

 

使用CWindow创建加速表非常简单。 您只需要通过调用AddAccelerator方法构建表,然后调用CreateAcceleratorTable方法。 当窗口被破坏或应用程序结束时,加速器表将自动销毁。 如果需要更改加速器表,可以首先销毁它,调用CreateAcceleratorTable方法,使用AddAccelerator构建一个新表,然后调用CreateAcceleratorTable

 

' // Create a keyboard accelerator table

pWindow.AddAccelerator FVIRTKEY OR FCONTROL, "U", IDM_UNDO ' // Ctrl+U - Undo

pWindow.AddAccelerator FVIRTKEY OR FCONTROL, "R", IDM_REDO ' // Ctrl+R - Redo

pWindow.AddAccelerator FVIRTKEY OR FCONTROL, "H", IDM_HOME ' // Ctrl+H - Home

pWindow.AddAccelerator FVIRTKEY OR FCONTROL, "S", IDM_SAVE ' // Ctrl+S - Save

pWindow.CreateAcceleratorTable

 

示例

 

以下示例创建一个菜单和一个加速表。

 

' ########################################################################################

' Microsoft Windows

' Contents: CWindow with a menu

' Compiler: FreeBasic 32 & 64 bit

' Copyright (c) 2016 José Roca. Freeware. Use at your own risk.

' THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER

' EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF

' MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE.

' ########################################################################################

 

#INCLUDE ONCE "windows.bi"

#INCLUDE ONCE "Afx/CWindow.inc"

#INCLUDE ONCE "Afx/AfxMenu.inc"

' $FB_RESPATH = "FBTBRES.rc"

using Afx

 

' // Menu identifiers

#define IDM_UNDO     1001   ' Undo

#define IDM_REDO     1002   ' Redo

#define IDM_HOME     1003   ' Home

#define IDM_SAVE     1004   ' Save file

#define IDM_EXIT     1005   ' Exit

 

DECLARE FUNCTION WinMain (BYVAL hInstance AS HINSTANCE, _

                        BYVAL hPrevInstance AS HINSTANCE, _

                        BYVAL szCmdLine AS ZSTRING PTR, _

                        BYVAL nCmdShow AS LONG) AS LONG

 

 END WinMain(GetModuleHandleW(NULL), NULL, COMMAND(), SW_NORMAL)

 

' ========================================================================================

' Build the menu

' ========================================================================================

FUNCTION BuildMenu () AS HMENU

 

 DIM hMenu AS HMENU

 DIM hPopUpMenu AS HMENU

 

 hMenu = CreateMenu

 hPopUpMenu = CreatePopUpMenu

    AppendMenuW hMenu, MF_POPUP OR MF_ENABLED, CAST(UINT_PTR, hPopUpMenu), "&File"

       AppendMenuW hPopUpMenu, MF_ENABLED, IDM_UNDO, "&Undo" & CHR(9) & "Ctrl+U"

       AppendMenuW hPopUpMenu, MF_ENABLED, IDM_REDO, "&Redo" & CHR(9) & "Ctrl+R"

       AppendMenuW hPopUpMenu, MF_ENABLED, IDM_HOME, "&Home" & CHR(9) & "Ctrl+H"

       AppendMenuW hPopUpMenu, MF_ENABLED, IDM_SAVE, "&Save" & CHR(9) & "Ctrl+S"

       AppendMenuW hPopUpMenu, MF_ENABLED, IDM_EXIT, "E&xit" & CHR(9) & "Alt+F4"

 FUNCTION = hMenu

 

END FUNCTION

' ========================================================================================

 

' ========================================================================================

' 窗口处理程序

' ========================================================================================

FUNCTION WndProc (BYVAL hWnd AS HWND, BYVAL uMsg AS UINT, BYVAL wParam AS WPARAM, BYVAL lParam AS LPARAM) AS LRESULT

 

 SELECT CASE uMsg

 

    CASE WM_CREATE

       EXIT FUNCTION

 

    CASE WM_COMMAND

       SELECT CASE LOWORD(wParam)

          CASE IDCANCEL

             ' // If ESC key pressed, close the application sending an WM_CLOSE message

             IF HIWORD(wParam) = BN_CLICKED THEN

                SendMessageW hwnd, WM_CLOSE, 0, 0

                EXIT FUNCTION

             END IF

          CASE IDM_UNDO

             MessageBox hwnd, "Undo option clicked", "Menu", MB_OK

             EXIT FUNCTION

          CASE IDM_REDO

             MessageBox hwnd, "Redo option clicked", "Menu", MB_OK

             EXIT FUNCTION

          CASE IDM_HOME

             MessageBox hwnd, "Home option clicked", "Menu", MB_OK

             EXIT FUNCTION

          CASE IDM_SAVE

             MessageBox hwnd, "Save option clicked", "Menu", MB_OK

             EXIT FUNCTION

       END SELECT

 

         CASE WM_DESTROY

       PostQuitMessage(0)

       EXIT FUNCTION

 

 END SELECT

 

 FUNCTION = DefWindowProcW(hWnd, uMsg, wParam, lParam)

 

END FUNCTION

' ========================================================================================

 

' ========================================================================================

' Main

' ========================================================================================

FUNCTION WinMain (BYVAL hInstance AS HINSTANCE, _

                BYVAL hPrevInstance AS HINSTANCE, _

                BYVAL szCmdLine AS ZSTRING PTR, _

                BYVAL nCmdShow AS LONG) AS LONG

 

 ' // 设置处理DPI感知

 AfxSetProcessDPIAware

 

 DIM pWindow AS CWindow

 pWindow.Create(NULL, "CWindow with a menu", @WndProc)

 pWindow.SetClientSize(400, 250)

 pWindow.Center

 

 ' // Add a button

 DIM hButton AS HWND = pWindow.AddControl("Button", pWindow.hWindow, IDCANCEL, "&Close", 280, 180, 75, 23)

 SetFocus hButton

 

 ' // Module instance handle

 DIM hInst AS HINSTANCE = GetModuleHandle(NULL)

 

 ' // Create the menu

 DIM hMenu AS HMENU = BuildMenu

 SetMenu pWindow.hWindow, hMenu

 

 ' // Create a keyboard accelerator table

 pWindow.AddAccelerator FVIRTKEY OR FCONTROL, "U", IDM_UNDO ' // Ctrl+U - Undo

 pWindow.AddAccelerator FVIRTKEY OR FCONTROL, "R", IDM_REDO ' // Ctrl+R - Redo

 pWindow.AddAccelerator FVIRTKEY OR FCONTROL, "H", IDM_HOME ' // Ctrl+H - Home

 pWindow.AddAccelerator FVIRTKEY OR FCONTROL, "S", IDM_SAVE ' // Ctrl+S - Save

 pWindow.CreateAcceleratorTable

 

 ' // Process Windows messages

 FUNCTION = pWindow.DoEvents(nCmdShow)

 

END FUNCTION

' ========================================================================================