1. Наш канал codeby в telegram. Пишем об информационной безопасности, методах защиты информации, о программировании. Не пропускай новости с кодебай, будь в тренде ! Подробнее ...

    Скрыть объявление

Winapi Controls Richedit

Тема в разделе "С и С++", создана пользователем alekssgor, 26 янв 2012.

  1. alekssgor

    alekssgor Well-Known Member

    Репутация:
    0
    Регистрация:
    26 май 2008
    Сообщения:
    118
    Симпатии:
    0
    Подскажите кто знает класс RichEdit на уровне операционной системы не обрабатывает правую кнопку мыши (я про контекстное меню копировать, вставить, вырезать).
     
  2. lazybiz

    lazybiz Well-Known Member

    Репутация:
    0
    Регистрация:
    3 ноя 2010
    Сообщения:
    1.339
    Симпатии:
    0
    Поиск подсказывает что его нужно создавать отдельно.
    Вот пример вызова системного меню в RichEdit правой кнопкой мыши:
    Код:
    #include <windows.h>
    #include <richedit.h>
    
    static HINSTANCE	g_hRichEdit;
    static char			g_szWindowName[]	= "RE";
    static char			g_szWindowClass[]	= "RE32";
    static HWND			g_hWnd;
    static HWND			g_hRE;
    static HMENU		g_hMenu;
    
    LRESULT CALLBACK wnd_proc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
    {
    CREATESTRUCT *	cs;
    MSGFILTER * 	pMF;
    
    switch ( uMsg ) {
    
    case WM_CREATE:
    cs = (LPCREATESTRUCT)lParam;
    
    g_hRE = CreateWindowEx( WS_EX_STATICEDGE,
    RICHEDIT_CLASS, "test", WS_CHILD | WS_VISIBLE,
    10, 10, 300, 200, hWnd, NULL, cs->hInstance, NULL );
    
    g_hMenu = GetSystemMenu( hWnd, FALSE );
    
    SendMessage( g_hRE, EM_SETEVENTMASK, (WPARAM)0, (LPARAM)ENM_MOUSEEVENTS );
    return 0;
    
    case WM_NOTIFY:
    pMF = (MSGFILTER *)lParam;
    if ( pMF->nmhdr.hwndFrom == g_hRE ) {
    if ( pMF->msg == WM_RBUTTONDOWN ) {
    
    POINT	pt;
    pt.x = LOWORD( pMF->lParam );
    pt.y = HIWORD( pMF->lParam );
    
    ClientToScreen( g_hRE, (LPPOINT)&pt );
    
    TrackPopupMenu(
    g_hMenu,
    TPM_LEFTALIGN | TPM_RIGHTBUTTON,
    pt.x,
    pt.y,
    0,
    g_hWnd,
    NULL );
    }
    }
    return 0;
    
    case WM_DESTROY:
    PostQuitMessage( 0 );
    return 0;
    }
    return DefWindowProc( hWnd, uMsg, wParam, lParam );
    }
    
    int APIENTRY WinMain( HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
    {
    MSG			msg;
    WNDCLASS	wc;
    
    g_hRichEdit = LoadLibrary( "riched32.dll" );
    
    ZeroMemory( &wc, sizeof( WNDCLASS ) );
    wc.style			= CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc		= wnd_proc;
    wc.hInstance		= hInst;
    wc.hCursor			= LoadCursor( NULL, IDC_ARROW );
    wc.hbrBackground	= (HBRUSH)GetStockObject( LTGRAY_BRUSH );
    wc.lpszClassName	= g_szWindowClass;
    RegisterClass( &wc );
    
    g_hWnd = CreateWindow(
    g_szWindowClass, g_szWindowName, WS_OVERLAPPEDWINDOW | WS_VISIBLE,
    100, 100, 400, 300, NULL, NULL, hInst, NULL );
    
    while ( GetMessage( &msg, NULL, 0, 0 ) ) {
    TranslateMessage( &msg );
    DispatchMessage( &msg );
    }
    
    DestroyWindow( g_hWnd );
    UnregisterClass( g_szWindowClass, hInst );
    return 0;
    }
     
Загрузка...

Поделиться этой страницей