当我移动轨迹栏时

当我移动轨迹栏时

本文介绍了当我移动轨迹栏时,如何使用Windows公共控件6.0防止控件(选项卡)闪烁和消失?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

滑动轨迹栏并释放鼠标按钮时,整个窗口闪烁,并且标签消失.

When sliding the trackbar and release the mouse button, the whole window flashes and the tabs dissappear.

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

When I use the old version, everything works properly!

当我使用新的Microsoft Windows公共控件6.0版时,发现此问题!!!

When I use the new Microsoft Windows Common Controls ver.6.0, this problem is observed !!!

#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;
}

这就是整个程序.

我举一个紧凑的例子.

如果运行它,您将看到问题.

If you run it, you will see the problem.

如果您评论新控件,问题将消失.

If you comment the new controls, the problem will disappear.

推荐答案

选项卡控件的通用控件不会为您管理单独的内容窗格,因此,如果您希望该跟踪栏成为有效的选项卡控件的子代按照我们期望标签控件起作用的方式,您需要自己管理子窗格.

The tab control common control is not going to manage separate content panes for you, so if you want that track bar to be a child of the tab control that works in the way we expect a tab control to work, you need to manage child panes yourself.

您可以使用"TabCtrl_AdjustRect"来确定子窗格需要多大.例如,请参见对代码的以下修改:

You can use "TabCtrl_AdjustRect" to figure out how big the child panes need to be. See the following modification of your code, for example:

#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;
}

这篇关于当我移动轨迹栏时,如何使用Windows公共控件6.0防止控件(选项卡)闪烁和消失?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-01 17:16