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并且控件不可缩放。
如评论中所述,编辑控件扩展样式是通过向控件发送消息来设置的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。|),设置传递给 的位lParam。| 归档时间: |
|
| 查看次数: |
659 次 |
| 最近记录: |