当另一个控件覆盖时,如何防止编辑控件显示出来?

停留

我创建了一个编辑框和一个列表框。当它们重叠时,列表框位于顶部,当光标位于列表框的一部分(覆盖编辑框的一部分)上方时,鼠标光标将变为I型梁,并显示编辑框的轮廓:

鼠标悬停之前:

鼠标悬停之前

鼠标悬停后:

在此处输入图片说明

用于创建控件的代码:

    HWND hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, WC_EDIT, "xxx", WS_CHILD | WS_VISIBLE| ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL,
        50, 100, 200, 100, hWnd, (HMENU)IDC_MAIN_EDIT, GetModuleHandle(NULL), NULL);

    HWND hList = CreateWindowEx(WS_EX_CLIENTEDGE, WC_LISTVIEW, _T(""), WS_VISIBLE | WS_CHILD | LVS_REPORT | LVS_EDITLABELS,
        70, 150, 200, 100, hWnd, (HMENU)ID_LIST_VIEW, GetModuleHandle(NULL), NULL);

我已经尝试过使用SetWindowPos修改x顺序,但是它不会改变行为。无论如何,我认为控件顺序的创建应将列表框置于编辑控件上方。

为什么要这样做,更重要的是,我如何解决它,使编辑不受影响?

若要进行复制,请在VS2015中创建一个win32项目。将以上两行以及适当的包含定义等添加到WM_CREATE中。以下代码未将任何项目添加到中listview

更新:流行的需求是完整的代码:

#include "stdafx.h"
#include "Win32Project3.h"
#include <commctrl.h>

#define MAX_LOADSTRING 100
#define IDC_MAIN_EDIT   140
#define ID_LIST_VIEW 143

#pragma comment( lib, "comctl32.lib")
#pragma comment(linker, "\"/manifestdependency:type='Win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")

#define MAX_LOADSTRING 100

// Global Variables:
HINSTANCE hInst;                                // current instance
WCHAR szTitle[MAX_LOADSTRING];                  // The title bar text
WCHAR szWindowClass[MAX_LOADSTRING];            // the main window class name

// Forward declarations of functions included in this code module:
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                 _In_opt_ HINSTANCE hPrevInstance,
                 _In_ LPWSTR    lpCmdLine,
                 _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // Initialize global strings
    LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadStringW(hInstance, IDC_WIN32PROJECT3, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance);

    // Perform application initialization:
    if (!InitInstance (hInstance, nCmdShow))
    {
        return FALSE;
    }

    HACCEL hAccelTable = LoadAccelerators(hInstance,MAKEINTRESOURCE(IDC_WIN32PROJECT3));

    MSG msg;

    // Main message loop:
    while (GetMessage(&msg, nullptr, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
    return (int) msg.wParam;
}

ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEXW wcex;
    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WIN32PROJECT3));
    wcex.hCursor        = LoadCursor(nullptr, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName   = MAKEINTRESOURCEW(IDC_WIN32PROJECT3);
    wcex.lpszClassName  = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

    return RegisterClassExW(&wcex);
}

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   hInst = hInstance; // Store instance handle in our global variable
   HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
  CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_CREATE:
    {
        HWND hList = CreateWindowEx(WS_EX_CLIENTEDGE, WC_LISTBOX, _T(""), WS_VISIBLE | WS_CHILD | LVS_REPORT | LVS_EDITLABELS,
        70, 150, 200, 100, hWnd, (HMENU)ID_LIST_VIEW, GetModuleHandle(NULL),NULL);

        HWND hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, WC_EDIT, _T("xxx"), WS_VISIBLE | WS_CHILD | ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL,
        50, 100, 200, 160, hWnd, (HMENU)IDC_MAIN_EDIT, GetModuleHandle(NULL), NULL);
    }
    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // Parse the menu selections:
            switch (wmId)
            {
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
        break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
我检查

效果是由一个控件在处理WM_PAINT消息时呈现到另一个控件的客户区引起的

为了防止这种情况发生,需要裁剪渲染,以便排除其他控件占用的区域。在控件上设置WS_CLIPSIBLINGS 窗口样式可指示系统应用适当的剪切区域:

相对于彼此剪辑子窗口;也就是说,当特定的子窗口接收到WM_PAINT消息时,WS_CLIPSIBLINGS样式会将所有其他重叠的子窗口剪切到要更新的子窗口区域之外。如果未指定WS_CLIPSIBLINGS并且子窗口重叠,则在子窗口的客户区域内进行绘制时,可以在相邻子窗口的客户区域内进行绘制。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使获得的 1 个得分点显示出来?

来自分类Dev

单击时如何将用户控件置于另一个控件的前面

来自分类Dev

如何从另一个控件调用另一个控件的LostFocus事件

来自分类Dev

当用户单击另一个控件时,如何结束单元格的编辑并提交新值?

来自分类Dev

在另一个控件上显示错误验证

来自分类Dev

WPF C#Databind:在C#中,突出显示另一个控件时更改控件颜色

来自分类Dev

WPF C#Databind:在C#中,突出显示另一个控件时更改控件颜色

来自分类Dev

为什么在触发另一个控件事件时无法更新 ComboBox 显示?

来自分类Dev

如何防止角度渲染页面直到所有数据都显示出来?

来自分类Dev

如何访问另一个控件的viewModel

来自分类Dev

如何与另一个类的Form控件通信?

来自分类Dev

当鼠标输入用户控件时,如何使控件移动到另一个位置?

来自分类Dev

当另一个控件具有焦点时,窗体如何检测KeyDown事件?

来自分类Dev

当另一个控件的值改变时如何执行转换器?

来自分类Dev

C# WPF - 发生另一个控件事件时更改控件内容

来自分类Dev

如何防止strcpy也覆盖另一个变量?

来自分类Dev

如何为更改另一个控件的宽度的控件编写样式?

来自分类Dev

如何将控件的属性绑定到另一个控件的属性

来自分类Dev

如何获得另一个控件下面的控件?

来自分类Dev

如何将控件的属性绑定到另一个控件的属性

来自分类Dev

如何从添加到另一个控件的子控件访问变量?

来自分类Dev

如何将控件放在另一个控件的底部?

来自分类Dev

如何将ActiveX控件复制到另一个工作表中以防止控件名称更改

来自分类Dev

页面加载时基于另一个控件的ASP.NET加载和显示DataGrid

来自分类Dev

如何将数据绑定从一个控件复制到另一个控件?

来自分类Dev

在Wpf GridView中,如何将控件绑定到一个项目中的另一个控件

来自分类Dev

如何通过单击另一个用户控件中的按钮在用户控件中的文本框中显示一些文本?

来自分类Dev

如何使程序选中一个图片框与另一个控件相交?

来自分类Dev

如何在更大尺寸的另一个控件中显示列表框所选项目(图像)

Related 相关文章

  1. 1

    如何使获得的 1 个得分点显示出来?

  2. 2

    单击时如何将用户控件置于另一个控件的前面

  3. 3

    如何从另一个控件调用另一个控件的LostFocus事件

  4. 4

    当用户单击另一个控件时,如何结束单元格的编辑并提交新值?

  5. 5

    在另一个控件上显示错误验证

  6. 6

    WPF C#Databind:在C#中,突出显示另一个控件时更改控件颜色

  7. 7

    WPF C#Databind:在C#中,突出显示另一个控件时更改控件颜色

  8. 8

    为什么在触发另一个控件事件时无法更新 ComboBox 显示?

  9. 9

    如何防止角度渲染页面直到所有数据都显示出来?

  10. 10

    如何访问另一个控件的viewModel

  11. 11

    如何与另一个类的Form控件通信?

  12. 12

    当鼠标输入用户控件时,如何使控件移动到另一个位置?

  13. 13

    当另一个控件具有焦点时,窗体如何检测KeyDown事件?

  14. 14

    当另一个控件的值改变时如何执行转换器?

  15. 15

    C# WPF - 发生另一个控件事件时更改控件内容

  16. 16

    如何防止strcpy也覆盖另一个变量?

  17. 17

    如何为更改另一个控件的宽度的控件编写样式?

  18. 18

    如何将控件的属性绑定到另一个控件的属性

  19. 19

    如何获得另一个控件下面的控件?

  20. 20

    如何将控件的属性绑定到另一个控件的属性

  21. 21

    如何从添加到另一个控件的子控件访问变量?

  22. 22

    如何将控件放在另一个控件的底部?

  23. 23

    如何将ActiveX控件复制到另一个工作表中以防止控件名称更改

  24. 24

    页面加载时基于另一个控件的ASP.NET加载和显示DataGrid

  25. 25

    如何将数据绑定从一个控件复制到另一个控件?

  26. 26

    在Wpf GridView中,如何将控件绑定到一个项目中的另一个控件

  27. 27

    如何通过单击另一个用户控件中的按钮在用户控件中的文本框中显示一些文本?

  28. 28

    如何使程序选中一个图片框与另一个控件相交?

  29. 29

    如何在更大尺寸的另一个控件中显示列表框所选项目(图像)

热门标签

归档