2012-12-27 170 views
0

在WINAPI,我喜歡創建一個按鈕:WINAPI按鈕背景

case WM_CREATE: 
{ 
    Start = CreateWindowEx(WS_EX_TRANSPARENT, "Button", "Start", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 20, 50, 75, 25, window, (HMENU)ID_START, hInstance, NULL); 
      break; 
} 

按鈕看起來像: enter image description here

但我需要它看起來像這樣的(我在.net一樣) :

enter image description here

我怎樣才能擺脫黑色邊框/背景?

回答

3
Start = CreateWindowEx(WS_EX_TRANSPARENT, ...); 

因爲您使用了WS_EX_TRANSPARENT樣式標誌,所以您得到了黑色輪廓。目前還不清楚你爲什麼使用它,當你使用Button控件時,你可以用它做很多事情。否則可能是least understood style flag。通過0來獲得正常的外觀按鈕。

這是一個失敗的原因得到一個.NET按鈕的外觀精確,Winforms不使用內置的按鈕控件。它創建自己的,使用自定義渲染器來獲得漸變效果。重現該本地代碼是很多工作。

+0

你能解釋一下WS_EX_TRANSPARENT如何改變邊界的外觀嗎?我不認爲這會對外觀產生任何影響。必須同意你對它的誤解。 –

+0

不知道,直到半小時前才考慮過嘗試。它看起來像跳過WM_ERASEBKGND,對於透明度模擬來說並不罕見。 –

+0

你說得對。當我刪除透明的標誌,它會把一個灰色的邊框,而不是..我讓它透明,以便它不會像這個圖像灰色:http://i.imgur.com/sgcE4.png – Brandon

0

編輯:我錯誤地將邊框標識爲默認按鈕邊框。正如David Hefferman所指出的那樣,事實並非如此。也就是說,我現在有reproduced that border effect;在程序啓動時沒有邊界,但剛過左鍵一點防脫至少在Windows 7

原來的答覆如下創建邊界–:


的黑色邊框是因爲它的默認。您不應該干擾系統默認按鈕的可視化等。用戶依賴這些提示。

要更改字體,也許就像WM_SETFONT?

聲明:我還沒有嘗試過。這可能是你需要處理WM_CTRLCOLOR或類似的東西。試試看,最後,如果默認按鈕不能爲你剪切,只需實現你自己的按鈕。

+0

不,由於非默認的擴展窗口樣式,黑色邊框存在 –

+0

@DavidHeffernan:看起來你是正確的。然而,如[在此演示](https://gist.github.com/4396146),只有將鼠標懸停在按鈕上方,或者單擊其他按鈕(可能還有其他方式),纔會顯示黑色邊框。所以它似乎是一個錯誤。我誤認爲它是默認的按鈕邊框。 –

0

我認爲你看到的邊框是因爲按鈕有「默認按鈕」屬性。如果你關閉它,那麼它將有一個正常的邊界。如果用戶在對話框/窗體上點擊ENTER,Default屬性只是告訴Win32哪個按鈕被激活。如果您只有一個按鈕,那麼它將始終具有默認屬性。如果你添加第二個,它不會。

的財產爲BS_DEFPUSHBUTTON屬性,所以在您的通話CreateWindowEx,你應該能夠做這樣的事情:

Start = CreateWindowEx(WS_EX_TRANSPARENT, "Button", "Start", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | ~BS_DEFPUSHBUTTON, 20, 50, 75, 25, window, (HMENU)ID_START, hInstance, NULL); 

如果不是這樣,你必須與ModifyStyle或將其設置ModifyStyleEx,並在「Remove」參數中傳遞它。我忘記了哪一種風格必須通過,但如果我記得正確的話,這是正常的風格參數,而不是EX參數。

0

我沒有測試過這一點,但嘗試創建按鈕這樣的:

Start = CreateWindowEx(0, WC_BUTTON, "Start", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_TEXT, 20, 50, 75, 25, window, (HMENU)ID_START, hInstance, NULL); 
     break; 

它可能還取決於您是如何創建的主窗口。你能發佈主窗口創建的代碼嗎?