Вы не должны писать абсолютно новый контейнерный класс. Можно придерживаться контейнеров STL, но изменить второй параметр, например std::vector
, чтобы дать ему пользовательское средство выделения, которое выделяет от буфера стека. Авторы хрома записали средство выделения только для этого:
https://chromium.googlesource.com/chromium/chromium / +/master/base/stack_container.h
Это работает путем выделения буфера, где Вы говорите, насколько большой это. Вы создаете контейнер и вызов container.reserve(buffer_size);
. При переполнении того размера средство выделения автоматически получит элементы от "кучи" (так как это получено от std::allocator
, это будет в этом случае просто использовать средства стандартного средства выделения). Я не попробовал его, но похоже, что это от Google, таким образом, я думаю, что это стоит попытки.
Использование похоже на это:
StackVector s;
s->push_back(42); // overloaded operator->
s->push_back(43);
// to get the real std::vector.
StackVector::ContainerType & v = s.container();
std::cout << v[0] << " " << v[1] << std::endl;
CMFCButton
имеет BS_OWNERDRAW
, установленный по умолчанию - вы можете удалить его в OnInitDialog ()
для вашего диалога:
mfcButton.ModifyStyle(BS_OWNERDRAW, 0, 0);
Однако удаление стиля рисования владельца приводит к тому, что многие методы CMFCButton становятся бесполезными (например, SetTextColor ). Вы можете настроить рендеринг кнопки с использованием текущей темы Windows, настроив визуальный менеджер:
CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));
Это делается вместо ModifyStyle
выше, в результате чего кнопки соответствуют стилю по умолчанию, но все еще имеют более новый функции рендеринга.