Как покрасить фон статического контроля в диалоге выбора папки?

Я имею в виду раскрасить диалоговое окно описания, которое находится чуть ниже строки заголовка. Мне удалось изменить шрифт там, но фон сделан совершенно по-другому.

Поскольку я читаю везде, это делается путем захвата сообщения WM_CTLCOLORSTATIC, но никто не поместил полный код, где я должен перехватить это сообщение, этот код, как я понимаю, я поместил его в процедуру обратного вызова диалога.

Проблема в том, что WM_CTLCOLORSTATIC никогда не вызывается.

#include <windows.h>
#include <iostream>
#include <shlobj.h> //for Shell API, dir dialog
#include <commctrl.h>

int CALLBACK BrowseCallBackProc( HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData) {
switch(uMsg) {
case BFFM_INITIALIZED: {
HWND static_control = NULL;
char szClassName[_MAX_PATH];
for (HWND hChild = GetWindow(hwnd, GW_CHILD); hChild != NULL; hChild =  GetNextWindow(hChild, GW_HWNDNEXT))
{
if ((GetWindowLong(hChild, GWL_STYLE) & WS_VISIBLE) == 0) continue;
GetClassName(hChild, szClassName, _countof(szClassName));
if (!strcmp("Static",szClassName)) {
static_control = hChild;
break;
}
}
HFONT hFont = CreateFont (13, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, TEXT("Fixedsys"));
SendMessage(static_control, WM_SETFONT, (WPARAM)hFont, TRUE);
break;
}
case WM_CTLCOLORSTATIC: {
std::cout << "WM_CTLCOLORSTATIC fired!" << std::endl;
break;
}
}
}

int main() {
using namespace std;
BROWSEINFOW bi;
LPITEMIDLIST pidl;
LPMALLOC pMalloc;
if (SUCCEEDED (::SHGetMalloc (&pMalloc))) {
::ZeroMemory (&bi,sizeof(bi));
bi.hwndOwner = NULL;
bi.lpszTitle = L"ok, now how to make my background... yellow for example ?";
bi.pszDisplayName = 0;
bi.pidlRoot = 0;
bi.ulFlags = BIF_NEWDIALOGSTYLE | BIF_VALIDATE | BIF_USENEWUI | BIF_UAHINT;
bi.lpfn = BrowseCallBackProc;
bi.lParam = (LPARAM)L"d:\\";
pidl = ::SHBrowseForFolderW(&bi);
}
system("pause");
}

0

Решение

Вы можете создать подкласс диалогового окна, используя SetWindowSubclass функция.

В указанной функции обратного вызова вы получите WM_CTLCOLORSTATIC Сообщения.

1

Другие решения

Документация MSDN упоминает, что процедура обратного вызова, которую вы передаете ::SHBrowseForFolder предназначен только для получения событий четырех типов:

  • BFFM_INITIALIZED
  • BFFM_IUNKNOWN
  • BFFM_SELCHANGED
  • BFFM_VALIDATEFAILE

Все эти события не связаны с WM_CTLCOLORSTATIC сообщение, которое отправляется в оконную процедуру родительского окна.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector