在 Win32 编辑控件上设置扩展样式

Iva*_*kov 0 c c++ winapi editcontrol

是否可以在编辑控件上设置扩展样式(简单编辑,而不是丰富编辑)?例如我想将扩展样式设置为WS_EX_ZOOMABLE | WS_EX_ALLOWEOL_ALL. 控件的创建如下:

HWND hEdit = CreateWindowExW(
        ES_EX_ZOOMABLE | ES_EX_ALLOWEOL_ALL,
        L"EDIT",
        L"",
        WS_BORDER | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL,
        0, 0, 100, 100,
        hWndMain, (HMENU)ID_EDIT, hInstance, NULL
    );
Run Code Online (Sandbox Code Playgroud)

问题是所有扩展样式都不起作用。是EOL静止的CR LF并且控件不可缩放。

zet*_*t42 7

如评论中所述,编辑控件扩展样式是通过向控件发送消息来设置的EM_SETEXTENDEDSTYLE

HWND hEdit = ::CreateWindow(
        L"EDIT",
        L"",
        WS_BORDER | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL,
        0, 0, 100, 100,
        hWndMain, (HMENU)ID_EDIT, hInstance, NULL
    );

DWORD exStyles = ES_EX_ZOOMABLE | ES_EX_ALLOWEOL_ALL;
::SendMessage( hEdit, EM_SETEXTENDEDSTYLE, exStyles, exStyles );
Run Code Online (Sandbox Code Playgroud)

您将要修改的样式位作为wParam参数(掩码)传递,并将这些位的新值作为参数传递lParam。这允许您使用单个调用来设置和清除样式,而无需查询这些样式的先前值。这是许多 API 使用的非常常见的模式。

如果您只想启用这些样式,请将wParam和设置lParam相同的值,就像我在上面的代码示例中所做的那样。

如果要清除样式位,请忽略要从lParam参数中清除的样式位。例如 设置ES_EX_ZOOMABLE但清除ES_EX_ALLOWEOL_ALL

::SendMessage( hEdit, EM_SETEXTENDEDSTYLE, ES_EX_ZOOMABLE | ES_EX_ALLOWEOL_ALL, ES_EX_ZOOMABLE );
Run Code Online (Sandbox Code Playgroud)

要清除这两个位:

::SendMessage( hEdit, EM_SETEXTENDEDSTYLE, ES_EX_ZOOMABLE | ES_EX_ALLOWEOL_ALL, 0 );
Run Code Online (Sandbox Code Playgroud)

舱单要求

为了使扩展样式真正起作用,您需要在应用程序清单中指定公共控件的版本 6.0。最简单的方法之一是在代码中插入以下编译器指令,通常在预编译头文件中:

#pragma comment(linker,"\"/manifestdependency:type='win32' \
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
Run Code Online (Sandbox Code Playgroud)

背景资料

这可能是控件处理按位运算EM_SETEXTENDEDSTYLE的方式:

auto newExStyle = currentExStyle & ~wParam | lParam;
Run Code Online (Sandbox Code Playgroud)
  • wParam使用逐位 NOT ( )反转 的所有位~
  • currentExStyle使用按位 AND ( )将结果作为掩码应用到&currentExStyle这将清除最初设置的所有这些位wParam
  • 使用按位 OR ( |),设置传递给 的位lParam