Winapi Controls Richedit

  • Автор темы Автор темы alekssgor
  • Дата начала Дата начала
A

alekssgor

Подскажите кто знает класс RichEdit на уровне операционной системы не обрабатывает правую кнопку мыши (я про контекстное меню копировать, вставить, вырезать).
 
Поиск подсказывает что его нужно создавать отдельно.
Вот пример вызова системного меню в RichEdit правой кнопкой мыши:
C++:
#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;
}
 
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab

🚀 Первый раз на Codeby?
Гайд для новичков: что делать в первые 15 минут, ключевые разделы, правила
Начать здесь →
🔴 Свежие CVE, 0-day и инциденты
То, о чём ChatGPT ещё не знает — обсуждаем в реальном времени
Threat Intel →
💼 Вакансии и заказы в ИБ
Pentest, SOC, DevSecOps, bug bounty — работа и проекты от проверенных компаний
Карьера в ИБ →

HackerLab