【问题标题】:how to color background of static control in select-for-folder dialog?如何在选择文件夹对话框中为静态控件的背景着色?
【发布时间】:2013-02-04 00:01:31
【问题描述】:

我的意思是为标题栏下方的描述对话框着色。我在那里成功更改了字体,但背景完全不同。

当我到处阅读时,它是通过捕获 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");
}

【问题讨论】:

    标签: c++ winapi styles controls


    【解决方案1】:

    您可以使用SetWindowSubclass 函数对对话窗口进行子类化。

    在指定的回调函数中你会收到WM_CTLCOLORSTATIC消息。

    【讨论】:

      【解决方案2】:

      MSDN documentation 提到您传递给::SHBrowseForFolder 的回调过程仅用于接收四种类型的事件:

      • BFFM_INITIALIZED
      • BFFM_IUNKNOWN
      • BFFM_SELCHANGED
      • BFFM_VALIDATEFAILE

      这些事件都与WM_CTLCOLORSTATIC消息无关,发送给父窗口的窗口过程。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-04
        • 1970-01-01
        • 2017-11-30
        • 2020-11-24
        • 1970-01-01
        • 2011-04-29
        • 2015-11-29
        • 1970-01-01
        相关资源
        最近更新 更多