Когда в главном окне слишком много дескрипторов дочерних окон и размер окна изменяется, панель инструментов мерцает, хотя я использовал WS_CLIPCHILDREN в родительском окне.
В некоторых других обычных приложениях также имеется множество дочерних окон. Например, Navicat, панель инструментов Navicat не мерцает при изменении размера окна. Я думаю, что в программах Win32 должен быть способ сделать это, но я не знаю, как это сделать.
Мой код:
#include
#include
#include
#include
#include
#include
// Enabling Visual Styles
#pragma comment(linker,"\"/manifestdependency:type='win32' \
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#pragma comment(lib, "comctl32")
#define IDB_TOOLBAR_START 301
#define IDB_TOOLBAR_STOP 302
#define IDB_TOOLBAR_TDSET 303
#define IDB_TOOLBAR_XTSET 304
#define IDB_TOOLBAR_HELP 306
HWND m_hToolBar = nullptr;
LRESULT CreateToolBar(HWND hWnd)
{
LPITEMIDLIST pidl;
SHGetSpecialFolderLocation(hWnd, CSIDL_DESKTOP, &pidl);
SHFILEINFO sfi = { 0 };
HIMAGELIST hImageList = (HIMAGELIST)::SHGetFileInfo((LPCTSTR)pidl, 0, &sfi, sizeof(sfi), SHGFI_PIDL | SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
m_hToolBar = CreateWindow(TOOLBARCLASSNAME, NULL,
WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN, 0, 0, 0, 0, hWnd, (HMENU)1,
NULL, NULL);
::SendMessage(m_hToolBar, TB_SETIMAGELIST, 0, (LPARAM)hImageList);
srand((unsigned int)time(NULL));
const UINT uButtonNums = 5;
UINT uImgCount = ImageList_GetImageCount(hImageList);
TBBUTTON tbButtons[uButtonNums] = {
{MAKELONG(rand() % uImgCount, 0), IDB_TOOLBAR_START, TBSTATE_ENABLED, TBSTYLE_BUTTON | BTNS_AUTOSIZE, {0}, 0, (INT_PTR)TEXT("aaa")},
{MAKELONG(rand() % uImgCount, 0), IDB_TOOLBAR_STOP, TBSTATE_ENABLED, TBSTYLE_BUTTON | BTNS_AUTOSIZE, {0}, 0, (INT_PTR)TEXT("bbb")},
{MAKELONG(rand() % uImgCount, 0), IDB_TOOLBAR_TDSET, TBSTATE_ENABLED, TBSTYLE_BUTTON | BTNS_AUTOSIZE, {0}, 0, (INT_PTR)TEXT("ccc")},
{MAKELONG(rand() % uImgCount, 0), IDB_TOOLBAR_XTSET, TBSTATE_ENABLED, TBSTYLE_BUTTON | BTNS_AUTOSIZE, {0}, 0, (INT_PTR)TEXT("ddd")},
{MAKELONG(rand() % uImgCount, 0), IDB_TOOLBAR_HELP, TBSTATE_ENABLED, TBSTYLE_BUTTON | BTNS_AUTOSIZE, {0}, 0, (INT_PTR)TEXT("eee")} };
::SendMessage(m_hToolBar, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);
::SendMessage(m_hToolBar, TB_ADDBUTTONS, (WPARAM)uButtonNums, (LPARAM)&tbButtons);
::SendMessage(m_hToolBar, TB_AUTOSIZE, 0, 0);
::SendMessage(m_hToolBar, TB_SETSTYLE, 0, TBSTYLE_FLAT | CCS_TOP);
//::GetWindowRect(m_hToolBar, &m_rcToolBar);
::ShowWindow(m_hToolBar, true);
return 0;
}
std::vector hWndBtn;
LRESULT CALLBACK WinProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
switch (uMsg) {
case WM_CREATE:
{
CreateToolBar(hWnd);
for (int i = 0; i < 100; i++)
{
hWndBtn.push_back(CreateWindow(TEXT("BUTTON"), TEXT("ButtonN"), WS_VISIBLE | WS_CHILD, 100, 100, 300, 200, hWnd, NULL, NULL, NULL));
}
break;
}
case WM_PAINT:
{
break;
}
case WM_SIZE:
{
SendMessage(m_hToolBar, uMsg, wParam, lParam);
INT width = max(0, LOWORD(lParam));
INT height = max(0, HIWORD(lParam));
int y = 100;
int spacing = 30;
HDWP hDWP = BeginDeferWindowPos((int)hWndBtn.size());
for (int i = 0; i < hWndBtn.size(); ++i)
{
height = 50;
DeferWindowPos(
hDWP,
hWndBtn,
NULL,
100, y,
width - 200, height,
SWP_NOZORDER
);
y = y + height + spacing;
}
EndDeferWindowPos(hDWP);
break;
}
case WM_CLOSE:
DestroyWindow(hWnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, BOOL) {
WNDCLASS wc = { 0 };
wc.lpszClassName = TEXT("wndclass");
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.lpfnWndProc = WinProc;
RegisterClass(&wc);
HWND hWnd = CreateWindow(wc.lpszClassName, TEXT("Window"), WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN, CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, 0, 0, hInstance, 0);
if (hWnd == NULL) return 1;
ShowWindow(hWnd, SW_SHOWNORMAL);
MSG msg = { 0 };
while (GetMessage(&msg, 0, 0, 0)) {
DispatchMessage(&msg);
}
return 0;
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... ain-window
Панель инструментов мерцает, когда в главном окне слишком много дочерних окон [закрыто] ⇐ C++
Программы на C++. Форум разработчиков
1736912116
Anonymous
Когда в главном окне слишком много дескрипторов дочерних окон и размер окна изменяется, панель инструментов мерцает, хотя я использовал WS_CLIPCHILDREN в родительском окне.
В некоторых других обычных приложениях также имеется множество дочерних окон. Например, Navicat, панель инструментов Navicat не мерцает при изменении размера окна. Я думаю, что в программах Win32 должен быть способ сделать это, но я не знаю, как это сделать.
Мой код:
#include
#include
#include
#include
#include
#include
// Enabling Visual Styles
#pragma comment(linker,"\"/manifestdependency:type='win32' \
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#pragma comment(lib, "comctl32")
#define IDB_TOOLBAR_START 301
#define IDB_TOOLBAR_STOP 302
#define IDB_TOOLBAR_TDSET 303
#define IDB_TOOLBAR_XTSET 304
#define IDB_TOOLBAR_HELP 306
HWND m_hToolBar = nullptr;
LRESULT CreateToolBar(HWND hWnd)
{
LPITEMIDLIST pidl;
SHGetSpecialFolderLocation(hWnd, CSIDL_DESKTOP, &pidl);
SHFILEINFO sfi = { 0 };
HIMAGELIST hImageList = (HIMAGELIST)::SHGetFileInfo((LPCTSTR)pidl, 0, &sfi, sizeof(sfi), SHGFI_PIDL | SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
m_hToolBar = CreateWindow(TOOLBARCLASSNAME, NULL,
WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN, 0, 0, 0, 0, hWnd, (HMENU)1,
NULL, NULL);
::SendMessage(m_hToolBar, TB_SETIMAGELIST, 0, (LPARAM)hImageList);
srand((unsigned int)time(NULL));
const UINT uButtonNums = 5;
UINT uImgCount = ImageList_GetImageCount(hImageList);
TBBUTTON tbButtons[uButtonNums] = {
{MAKELONG(rand() % uImgCount, 0), IDB_TOOLBAR_START, TBSTATE_ENABLED, TBSTYLE_BUTTON | BTNS_AUTOSIZE, {0}, 0, (INT_PTR)TEXT("aaa")},
{MAKELONG(rand() % uImgCount, 0), IDB_TOOLBAR_STOP, TBSTATE_ENABLED, TBSTYLE_BUTTON | BTNS_AUTOSIZE, {0}, 0, (INT_PTR)TEXT("bbb")},
{MAKELONG(rand() % uImgCount, 0), IDB_TOOLBAR_TDSET, TBSTATE_ENABLED, TBSTYLE_BUTTON | BTNS_AUTOSIZE, {0}, 0, (INT_PTR)TEXT("ccc")},
{MAKELONG(rand() % uImgCount, 0), IDB_TOOLBAR_XTSET, TBSTATE_ENABLED, TBSTYLE_BUTTON | BTNS_AUTOSIZE, {0}, 0, (INT_PTR)TEXT("ddd")},
{MAKELONG(rand() % uImgCount, 0), IDB_TOOLBAR_HELP, TBSTATE_ENABLED, TBSTYLE_BUTTON | BTNS_AUTOSIZE, {0}, 0, (INT_PTR)TEXT("eee")} };
::SendMessage(m_hToolBar, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);
::SendMessage(m_hToolBar, TB_ADDBUTTONS, (WPARAM)uButtonNums, (LPARAM)&tbButtons);
::SendMessage(m_hToolBar, TB_AUTOSIZE, 0, 0);
::SendMessage(m_hToolBar, TB_SETSTYLE, 0, TBSTYLE_FLAT | CCS_TOP);
//::GetWindowRect(m_hToolBar, &m_rcToolBar);
::ShowWindow(m_hToolBar, true);
return 0;
}
std::vector hWndBtn;
LRESULT CALLBACK WinProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
switch (uMsg) {
case WM_CREATE:
{
CreateToolBar(hWnd);
for (int i = 0; i < 100; i++)
{
hWndBtn.push_back(CreateWindow(TEXT("BUTTON"), TEXT("ButtonN"), WS_VISIBLE | WS_CHILD, 100, 100, 300, 200, hWnd, NULL, NULL, NULL));
}
break;
}
case WM_PAINT:
{
break;
}
case WM_SIZE:
{
SendMessage(m_hToolBar, uMsg, wParam, lParam);
INT width = max(0, LOWORD(lParam));
INT height = max(0, HIWORD(lParam));
int y = 100;
int spacing = 30;
HDWP hDWP = BeginDeferWindowPos((int)hWndBtn.size());
for (int i = 0; i < hWndBtn.size(); ++i)
{
height = 50;
DeferWindowPos(
hDWP,
hWndBtn[i],
NULL,
100, y,
width - 200, height,
SWP_NOZORDER
);
y = y + height + spacing;
}
EndDeferWindowPos(hDWP);
break;
}
case WM_CLOSE:
DestroyWindow(hWnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, BOOL) {
WNDCLASS wc = { 0 };
wc.lpszClassName = TEXT("wndclass");
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.lpfnWndProc = WinProc;
RegisterClass(&wc);
HWND hWnd = CreateWindow(wc.lpszClassName, TEXT("Window"), WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN, CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, 0, 0, hInstance, 0);
if (hWnd == NULL) return 1;
ShowWindow(hWnd, SW_SHOWNORMAL);
MSG msg = { 0 };
while (GetMessage(&msg, 0, 0, 0)) {
DispatchMessage(&msg);
}
return 0;
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79356873/the-toolbar-flickers-when-there-are-too-many-child-windows-in-the-main-window[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия