Từ 1 tới 9 trên tổng số 9 kết quả

Đề tài: MFC shortcut key trong nôi bộ ứng dụng

  1. #1
    Ngày gia nhập
    02 2009
    Bài viết
    88

    Red face MFC shortcut key trong nôi bộ ứng dụng

    Mình đọc bài của Zcoder ở đây

    Mình có làm theo nhưng không được,mình muốn làm kiểu như là ấn phím Ctrl + F9 thì nó bấm Button1 mà không được

    Attached Files Attached Files

  2. #2
    Ngày gia nhập
    11 2008
    Bài viết
    73

    Làm như sau : Lấy project của bạn Zcoder luôn nhé.

    Đầu tiên, quan trọng nhất là bạn nên xem về ON_MESSAGE(), WM_HOTKEY trong MSDN để biết và hiểu thêm.

    Nào bắt đầu nào.

    Trong file SetHotKeyDlg.cpp:

    Bước 1 :

    Code:
    CSetHotKeyDlg::OnInitDialog()
    Bạn thấy

    Code:
    m_nIDHotKey = ::GlobalAddAtom(L"SetHotKey");
    ::RegisterHotKey(::FindWindow(NULL,L"SetHotKey"), m_nIDHotKey, MOD_CONTROL, 'M');
    Chú giải :
    1) The GlobalAddAtom function adds a character string to the global atom table and returns a unique value (an atom) identifying the string.
    2) RegisterHotKey : Ở đây bạn tìm Hwnd của Dialog mà bạn muốn set hotkey cho nó. Với ví dụ này là SetHotKey.
    Các tham số của nó :
    -MOD_CONTROL : cho phép nhấn CTRL
    -'M': Character của bàn phím mà bạn nhấn kèm với CTRL. Ở đây với yêu cầu của bạn thì bạn thêm vào như sau :

    Code:
    ::RegisterHotKey(::FindWindow(NULL,L"SetHotKey"), m_nButtonKey, MOD_CONTROL, VK_F9);
    Chú ý : Nhớ khai báo trong SetHotKeyDlg.h

    Code:
    UINT m_nButtonKey
    Bước 2 : Thực hiện theo yều của bạn
    Trong :
    Code:
    void CSetHotKeyDlg::OnBnClickedButton1()
    {
    	ShowWindow(SW_HIDE);
    	// TODO: Add your control notification handler code here
    	
    }
    Bạn sửa lại theo yêu cầu của công việc của bạn, giả sư như mình :

    Code:
    void CSetHotKeyDlg::OnBnClickedButton1()
    {
    	//ShowWindow(SW_HIDE);
    	// TODO: Add your control notification handler code here
    	MessageBox(_T("A"),_T("B"),MB_OK);
    }

    Trong :
    Code:
    LRESULT CSetHotKeyDlg::OnHotKey(WPARAM wp, LPARAM lp)
    {
    	TRACE(_T("CMyDialog::OnHotKey\n"));
    	if (wp==m_nIDHotKey && !IsWindowVisible()) {
    		ShowWindow(SW_SHOW);
    	};
    	return 0;
    }
    Bạn sửa lại như sau để nói Button1 hãy CLICK khi bạn nhấn tổ hợp phím CTRL+F9 đi nào

    Code:
    LRESULT CSetHotKeyDlg::OnHotKey(WPARAM wp, LPARAM lp)
    {
    	TRACE(_T("CMyDialog::OnHotKey\n"));
    	
    	if (wp==m_nButtonKey) 
    	{
    	     CSetHotKeyDlg::OnBnClickedButton1();
    	};
    	return 0;
    }
    Chú giải :
    - wp sẽ nhận lấy HotKey nào được gọi trong Dialog của bạn.

    -----------------------------------------------------------------

    Lời kết : Để có thể hiểu rõ và biết thêm về các hàm trên (GlobalAddAtom, RegisterHotKey) cũng như virtual-key code (VK_F1,VK_F2,'M',...) thì bạn hãy tham khảo thêm MSDN.

    Nguồn : Được chỉnh sửa thêm từ code của ZCoder
    Đã được chỉnh sửa lần cuối bởi VaT : 09-03-2009 lúc 01:54 AM.

  3. #3
    Ngày gia nhập
    10 2006
    Nơi ở
    In Your Bugs
    Bài viết
    823

    PHP Code:
    Lời kết Để có thể hiểu rõ và biết thêm về các hàm trên (GlobalAddAtomRegisterHotKeycũng như virtual-key code (VK_F1,VK_F2,'M',...) thì bạn hãy tham khảo thêm MSDN.

    Nguồn Được chỉnh sửa thêm từ code của ZCoder 
    Cả bài viết chấm được mỗi cái lời kết. ( 10/10 )

  4. #4
    Ngày gia nhập
    01 2009
    Bài viết
    201

    Cậu hiểu nhầm ý Bạn kia nè
    bài ở đây nè
    Phím nóng thì MFC nó có trong resource rồi. Mở cái bảng Accelerator Table rồi thêm Phím nóng = ID của menu, button vào là chạy.


    Accelerator Table thêm khi run time cũng được nhưng hơi phức tạp.
    Cậu xem thêm chỗ này đi:
    http://msdn.microsoft.com/en-us/libr...ating_rt_table
    Ý là đặt Hotkey cho nội bộ ứng dụng
    Nguồn : Được chỉnh sửa thêm từ code của ZCoder
    Coder_gate chứ
    Đã được chỉnh sửa lần cuối bởi AdminPro : 11-03-2009 lúc 05:41 PM.

  5. #5
    Ngày gia nhập
    10 2008
    Nơi ở
    sài gòn
    Bài viết
    422

    chạy cái này,ấn F2 thử xem
    Code:
    // *********************
    #include <windows.h>
    
    LRESULT APIENTRY MainWndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam);
    
    HINSTANCE g_hInst;
    
    HWND testwin;
    
    HMENU principal;
    
    HICON d;
    
    HACCEL h_hotkey;
    
    ACCEL hotkey[2];
    
    // ***************** WINMAIN ****************************
    
    int APIENTRY WinMain(HINSTANCE hInst,HINSTANCE hPrev,LPSTR line,int CmdShow) {
    
    g_hInst = hInst;
    MSG msg;
    WNDCLASS wc;
    
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hbrBackground = NULL;
    wc.hInstance = hInst;
    wc.hIcon = NULL; //LoadIcon(hInst,MAKEINTRESOURCE(IDI_ICON1));
    wc.hCursor = LoadCursor(NULL,IDC_ARROW);
    wc.lpfnWndProc = (WNDPROC)MainWndProc;
    wc.lpszClassName = "jlb";
    wc.lpszMenuName = NULL;
    wc.style = CS_HREDRAW | CS_VREDRAW;
    
    RegisterClass(&wc);
    
    testwin = CreateWindowEx(WS_EX_CLIENTEDGE,"jlb","YaSP SOFTWARE 2002",WS_OVERLAPPEDWINDOW,0,0,800,600,0,0,hInst,0);
    
    hotkey[0].fVirt = FVIRTKEY;
    hotkey[0].key = VK_F1;
    hotkey[0].cmd = 1001;
    
    hotkey[1].fVirt = FVIRTKEY;
    hotkey[1].key = VK_F2;
    hotkey[1].cmd = 1002;
    
    // if i use the nect line everithing works ok !!
    // h_hotkey = LoadAccelerators(hInst,MAKEINTRESOURCE(1));
    
    /* here is the resource script for the accelerators
    
    luciano ACCELERATORS
    {
    VK_F1, 1001, VIRTKEY
    VK_F2, 1002, VIRTKEY
    }
    
    */
    
    h_hotkey = CreateAcceleratorTable(&(hotkey[0]),2);
    
    if (h_hotkey == NULL) return 0;
    
    ShowWindow(testwin,SW_SHOWMAXIMIZED);
    UpdateWindow(testwin);
    
    while(GetMessage(&msg,0,0,0)) {
    if (! TranslateAccelerator(msg.hwnd,h_hotkey,&msg)) {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    }
    
    return msg.wParam;
    }
    
    // ***************** WINMAIN ****************************
    
    
    // ***************** PROC ****************************
    
    LRESULT APIENTRY MainWndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam){
    HDC dc;
    PAINTSTRUCT ps;
    HBRUSH pincel,pincel2;
    RECT area;
    int divi;
    
    MENUITEMINFO itmenu;
    
    HMENU hMenu;
    
    char teclado[KL_NAMELENGTH];
    
    switch(msg) {
    
    case WM_PAINT: {
    
    pincel = CreateSolidBrush(RGB(110, 0, 255));
    pincel2 = CreateSolidBrush(RGB(255, 255, 255));
    dc = BeginPaint(hwnd, &ps);
    
    GetClientRect(hwnd, &(ps.rcPaint));
    
    divi = ps.rcPaint.bottom / 3;
    area = ps.rcPaint;
    area.bottom = divi;
    FillRect(dc, &area , pincel);
    area.top = divi;
    area.bottom = divi * 2;
    FillRect(dc, &area, pincel2);
    area.top = divi*2;
    area.bottom = divi * 3;
    FillRect(dc, &area, pincel);
    EndPaint(hwnd, &ps);
    
    }
    
    break;
    
    case WM_DESTROY: {
    DestroyAcceleratorTable(h_hotkey);
    DestroyMenu(principal);
    PostQuitMessage(0);
    }
    break;
    
    case WM_CREATE:{
    principal = CreateMenu();
    
    // OPCIONES DEL MENU PRINCIPAL
    
    itmenu.cbSize = sizeof(MENUITEMINFO);
    
    itmenu.fMask = MIIM_DATA | MIIM_ID | MIIM_STATE | MIIM_TYPE ;
    itmenu.fType = MFT_STRING;
    itmenu.fState = MFS_ENABLED;
    itmenu.wID = 1001;
    itmenu.dwTypeData = "Opcisn &Uno";
    itmenu.cch = 10;
    InsertMenuItem(principal,0,true,&itmenu);
    
    
    itmenu.fMask = MIIM_DATA | MIIM_ID | MIIM_STATE | MIIM_TYPE ;
    itmenu.fType = MFT_STRING;
    itmenu.fState = MFS_ENABLED;
    itmenu.wID = 1002;
    itmenu.dwTypeData = "Opcisn &Dos";
    itmenu.cch = 11;
    InsertMenuItem(principal,2,true,&itmenu);
    
    // FIN OPCIONES DEL MENU PRINCIPAL
    
    SetMenu(hwnd,principal);
    
    }
    break;
    
    case WM_COMMAND: {
    
    switch(LOWORD(wParam)) { // SWITCH BOTONES
    
    case 1001: {
    GetKeyboardLayoutName(teclado);
    MessageBox(hwnd,teclado,"AVISO",MB_OK);
    }
    break;
    
    case 1002: {
    MessageBeep(MB_OK);
    MessageBox(hwnd,"OPCISN DOS","AVISO",MB_OK);
    
    }
    break;
    } // SWITCH BOTONES
    
    }
    break;
    
    default: return DefWindowProc(hwnd,msg,wParam,lParam);
    }
    return 0;
    }
    
    
    //***********
    Win32 sethotkey bằng Accelerator Table

  6. #6
    Ngày gia nhập
    11 2008
    Bài viết
    73

    Mặc định MFC shortcut key trong nôi bộ ứng dụng

    Ý của bạn RadiRadic hay của bạn AdminPro vậy

  7. #7
    Ngày gia nhập
    11 2008
    Bài viết
    73

    Dùng Accelerator Table. Và tham khảo cách sử dụng nó trong MSDN. Nếu bạn chỉ có làm thao tác chỉnh sửa trong phần Resource thì tất nhiên không thể thực hiện được điều bạn yêu cầu đâu.

  8. #8
    Ngày gia nhập
    06 2010
    Bài viết
    4

    Mình làm như bạn VaT thì OK, nhưng khi mình RegisterHotKey thêm vài cái nữa thì chỉ dùng được 1 hoặc 2 tổ hợp phím tắt thôi. Bạn có thể giúp mình cách tạo nhiều tổ hợp phím tắt hơn không ? Thanks !

  9. #9
    Ngày gia nhập
    06 2010
    Bài viết
    4

    Các bạn giúp mình nhe. Mình đang rất cần !

Các đề tài tương tự

  1. Shortcut trong winform in C#
    Gửi bởi hoangvuong303 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 2
    Bài viết cuối: 09-11-2013, 04:26 PM
  2. Cách lấy Target của Shortcut trong C#?
    Gửi bởi QuangLinh trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 4
    Bài viết cuối: 20-03-2012, 08:15 PM
  3. Cách làm shortcut key như Visual Studio trong C#? ví dụ Ctrl+E,C
    Gửi bởi xinbat007 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 1
    Bài viết cuối: 03-11-2011, 09:56 AM
  4. C#: Làm thế nào tắt shortcut key trong menu strip khi đang chạy?
    Gửi bởi voicewithin trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 1
    Bài viết cuối: 18-11-2010, 03:51 PM
  5. Tạo shortcut kiểu shortcut của Internet Explorer trong MFC
    Gửi bởi Kevin Hoang trong diễn đàn Tutorials và Thủ thuật Visual C++
    Trả lời: 0
    Bài viết cuối: 17-11-2007, 04:40 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn