当我移动跟踪栏时,如何防止控件(选项卡)闪烁和消失与Windows通用控件6.0?
How to prevent controls( tabs ) from blinking and disappearing with windows common controls 6.0 when I move a trackbar?
滑动跟踪栏并释放鼠标按钮时,整个窗口闪烁,选项卡消失。
当我使用旧版本时,一切正常!
当我使用新的 Microsoft Windows 公共控件 v.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;
}
相关文章:
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- WinAPI 在单击第一个对话框上的按钮控件并销毁第一个对话框后创建第二个对话框
- 在编译时,C++项目抛出错误 C2228,这是预期的,因为控件在运行时未达到该点
- 如何更改窗体上所有控件的标题?[C++生成器]
- 双击更改 mfc 中列表控件中的行的颜色
- 派生的 wxPanel 控件如何访问其中包含 wxDialog 中的数据?
- 如何从代码本身向 wxwidgets 中的文本控件插入字符?
- 如何在MFC中的静态文本控件上插入图标?
- 我的主窗口在创建时或单击更新区域时是否会收到编辑控件?
- 如何在Qt C++中向自定义控件添加属性?
- C/C++ 检测双击 TVItem 的常用控件
- 从C++标头中导入常量而不是硬编码它们:扩展 .net 控件?
- 控件不会在选择函数旁边移动
- MFC:我们能否扩展CEditView中存在的CEdit控件类行为
- 通过嵌入式 IWebBrowser2 控件中的链接打开 youtube 搜索失败
- 查找素数:错误:控件到达非void函数的末尾
- C++ 获取"控件可能会到达约翰逊-特罗特代码上的非空函数的末尾
- C++WIN32-将RTF数据加载到Rich Edit控件
- 当我移动跟踪栏时,如何防止控件(选项卡)闪烁和消失与Windows通用控件6.0?
- 使用ScrollWindowEx在Cwnd中滚动后,控件将消失