当我移动轨迹栏时,如何防止 Windows 通用控件 6.0 中的控件(选项卡)闪烁和消失?

2024-04-03

滑动滑动条并释放鼠标按钮时,整个窗口都会闪烁,并且选项卡会消失。

当我使用旧版本时,一切正常!

当我使用新的 Microsoft Windows Common Controls ver.6.0 时,出现此问题!

#include <windows.h>
#include <commctrl.h>
#include <tchar.h>

#pragma comment(lib,"comctl32.lib")
HWND hWin, hTab;

#if defined _M_X64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_IA64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_IX86
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#else
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#endif

LRESULT CALLBACK WndProcedure( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam ) {
    switch( Msg ) {
        case WM_CREATE:{
            HINSTANCE hInst = GetModuleHandle( NULL );
            RECT rc;
            int dx, dy;

            GetClientRect( hWnd, &rc );
            dx = rc.right - rc.left;
            dy = rc.bottom - rc.top;

            TCITEM tie = { TCIF_TEXT | TCIF_IMAGE, 0, 0, NULL, 0, -1, 0 };

            hTab = CreateWindowEx( NULL, WC_TABCONTROL, _T(""), WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS, 0, 0, dx, dy, hWnd, ( HMENU )( DWORDLONG )1001, hInst, NULL );

            tie.pszText = _T("Tab One");
            TabCtrl_InsertItem( hTab, 0, &tie );
            tie.pszText = _T("Tab Two");
            TabCtrl_InsertItem( hTab, 1, &tie );

            CreateWindowEx( NULL, TRACKBAR_CLASS, _T(""), WS_VISIBLE | WS_CHILD | WS_TABSTOP, 50, 50, 200, 40, hTab, ( HMENU )1002, hInst, NULL );
        }
        break;

        case WM_NOTIFY: {
            LPNMHDR ns = (LPNMHDR)lParam;
            if( (ns->idFrom == 1001) && (ns->code == TCN_SELCHANGING) )
                return FALSE;
        }
        break;

        case WM_DESTROY:
            PostQuitMessage(0);
            break;

        default:
            return (DefWindowProc(hWnd, Msg, wParam, lParam));
    }

    return FALSE;
}

INT WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) {
    INITCOMMONCONTROLSEX icc = { sizeof( INITCOMMONCONTROLSEX ), ICC_WIN95_CLASSES };
    WNDCLASSEX  WndClsEx;
    MSG         Msg;

    ZeroMemory( &WndClsEx, sizeof( WNDCLASSEX ) );
    WndClsEx.cbSize        = sizeof(WNDCLASSEX);
    WndClsEx.style         = CS_HREDRAW | CS_VREDRAW;
    WndClsEx.lpfnWndProc   = WndProcedure;
    WndClsEx.hIcon         = LoadIcon( NULL, IDI_APPLICATION );
    WndClsEx.hCursor       = LoadCursor(NULL, IDC_ARROW );
    WndClsEx.hbrBackground = (HBRUSH)COLOR_BTNSHADOW;
    WndClsEx.lpszClassName = _T("Trackbar_Tester");
    WndClsEx.hInstance     = hInstance;

    RegisterClassEx(&WndClsEx);
    InitCommonControlsEx( &icc );

    if( !(hWin = CreateWindow( WndClsEx.lpszClassName, _T("TB_Tester"), WS_OVERLAPPEDWINDOW, 0, 0, 600, 400, NULL, NULL, hInstance, NULL )) )
        return 0;

    ShowWindow( hWin, SW_SHOWNORMAL );
    UpdateWindow( hWin );

    while( GetMessage(&Msg, NULL, 0, 0) ) {
        TranslateMessage( &Msg );
        DispatchMessage( &Msg );
    }

    return (int)Msg.wParam;
}

这就是整个计划。

我举一个紧凑的例子。

如果你运行它,你就会看到问题。

如果您评论新控件,问题就会消失。


选项卡控件通用控件不会为您管理单独的内容窗格,因此如果您希望该跟踪栏成为选项卡控件的子项,并按照我们期望选项卡控件的工作方式工作,则需要管理子窗格你自己。

您可以使用“TabCtrl_AdjustRect”来计算子窗格需要有多大。请参阅对代码进行以下修改,例如:

#define TAB_ID 2000

HWND hWin, hTab;
HWND g_tabPanes[2];

HWND CreateTabPane(HWND tabctrl, int id, HINSTANCE instance)
{
    RECT rcTab;
    GetClientRect(tabctrl, &rcTab);
    TabCtrl_AdjustRect(tabctrl, FALSE, &rcTab);
    int wd = rcTab.right - rcTab.left;
    int hgt = rcTab.bottom - rcTab.top;
    return CreateWindow(
        L"static", L"", 
        WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS, 
        rcTab.left, rcTab.top, wd, hgt, 
        tabctrl, 
        (HMENU) id, 
        instance, 
        NULL
    );
}

LRESULT CALLBACK WndProcedure(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) {
    switch (Msg) {
    case WM_CREATE: {
            HINSTANCE hInst = GetModuleHandle(NULL);
            RECT rc; int dx, dy;

            GetClientRect(hWnd, &rc);
            dx = rc.right - rc.left;
            dy = rc.bottom - rc.top;

            TCITEM tie = {
                TCIF_TEXT | TCIF_IMAGE,
                0, 0,
                NULL,
                0, -1, 0
            };

            hTab = CreateWindowEx(NULL, WC_TABCONTROL, _T(""),
                WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS,
                0, 0, dx, dy, hWnd,
                (HMENU)1001, hInst, NULL
            );

            tie.pszText = (LPWSTR)_T("Tab One");
            TabCtrl_InsertItem(hTab, 0, &tie);

            tie.pszText = (LPWSTR)_T("Tab Two");
            TabCtrl_InsertItem(hTab, 1, &tie);

            for (int i = 0; i < 2; i++)
                g_tabPanes[i] = CreateTabPane(hTab, TAB_ID + i, hInst);

            CreateWindowEx(NULL, TRACKBAR_CLASS, _T(""), WS_VISIBLE | WS_CHILD | WS_TABSTOP, 
                50, 50, 200, 40, g_tabPanes[0], (HMENU)1002, hInst, NULL);
        }
        break;

        case WM_NOTIFY: {   
            LPNMHDR ns = (LPNMHDR)lParam; 
            if ((ns->idFrom == 1001) && (ns->code == TCN_SELCHANGE)) {
                int pane = TabCtrl_GetCurSel(hTab);
                for (int i = 0; i < 2; i++)
                    if (pane == i)
                        ShowWindow(g_tabPanes[i], SW_SHOW);
                    else
                        ShowWindow(g_tabPanes[i], SW_HIDE);
            }
        } break;


        case WM_DESTROY: 
            PostQuitMessage(0); 
            break;
        default: return (DefWindowProc(hWnd, Msg, wParam, lParam));
        }
    return FALSE;
}

INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    INITCOMMONCONTROLSEX icc = { 
        sizeof(INITCOMMONCONTROLSEX), 
        ICC_WIN95_CLASSES 
    };

    WNDCLASSEX  WndClsEx;
    MSG         Msg;

    ZeroMemory(&WndClsEx, sizeof(WNDCLASSEX));
    WndClsEx.cbSize = sizeof(WNDCLASSEX);
    WndClsEx.style = CS_HREDRAW | CS_VREDRAW;
    WndClsEx.lpfnWndProc = WndProcedure;
    WndClsEx.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    WndClsEx.hCursor = LoadCursor(NULL, IDC_ARROW);
    WndClsEx.hbrBackground = (HBRUSH)COLOR_BTNSHADOW;
    WndClsEx.lpszClassName = _T("Trackbar_Tester");
    WndClsEx.hInstance = hInstance;
    RegisterClassEx(&WndClsEx);

    InitCommonControlsEx(&icc);

    if (!(hWin = CreateWindow(WndClsEx.lpszClassName, _T("TB_Tester"), WS_OVERLAPPEDWINDOW| WS_CLIPSIBLINGS, 0, 0, 600, 400, NULL, NULL, hInstance, NULL)))
        return 0;

    ShowWindow(hWin, SW_SHOWNORMAL);
    UpdateWindow(hWin);

    while (GetMessage(&Msg, NULL, 0, 0))  { 
        TranslateMessage(&Msg); 
        DispatchMessage(&Msg); 
    }
    return (int)Msg.wParam;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当我移动轨迹栏时,如何防止 Windows 通用控件 6.0 中的控件(选项卡)闪烁和消失? 的相关文章

  • WPF DataGrid 多选

    我读过几篇关于这个主题的文章 但很多都是来自 VS 或框架的早期版本 我想做的是从 dataGrid 中选择多行并将这些行返回到绑定的可观察集合中 我尝试创建一个属性 类型 并将其添加到可观察集合中 它适用于单个记录 但代码永远不会触发多个
  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 为什么 isnormal() 说一个值是正常的,而实际上不是?

    include
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐