2013-02-04 9 views
0

我的意思是給標題欄下面的描述對話框着色。我成功地在那裏改變字體,但背景完全不同。如何在select-for-folder對話框中爲靜態控件的背景着色?

在我到處讀取時,它是通過捕獲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"); 
} 

回答

1

您可以使用SetWindowSubclass函數子類化對話窗口。

在指定的回調函數中,您將收到WM_CTLCOLORSTATIC消息。

0

MSDN documentation提到,你傳遞給::SHBrowseForFolder回調過程只是爲了獲得四種類型的事件:

  • BFFM_INITIALIZED
  • BFFM_IUNKNOWN
  • BFFM_SELCHANGED
  • BFFM_VALIDATEFAILE

這些事件都與WM_CTLCOLORSTATIC消息無關,該消息被髮送到父窗口的窗口過程。

相關問題