2012-01-16 32 views
0

我需要構建一個設計爲與此完全相同的窗口(它具有白色區域內的控件,但與現在不相關):將CDialog劃分爲不同背景的兩個區域(內部物鏡圖片)

http://dl.dropbox.com/u/3432167/example.png
我的問題是定義這兩個不同背景的獨立「區域」。
最接近我預期的樣子是用一個空的ListBox來代表白色區域,但結果是不一樣的(這是一個糟糕的黑客攻擊)。

關於如何實現這一點的任何想法?

回答

0

經過一番挖掘,我發現一個很好的方法是覆蓋OnPaint函數。
以下是用於上述問題的對話框的示例。矩形維度是硬編碼的,因爲此特定對話框不可調整大小。

不要忘記將ON_WM_PAINT()添加到消息映射中。

void CTestDlg::OnPaint() 
{ 
    if (IsIconic()) 
    { 
     (...) 
    } 
    else 
    { 
     CPaintDC dc(this); // device context for painting 
     dc.FillSolidRect(0,0,612,376, RGB(255,255,255)); 
     dc.FillSolidRect(0,376,612,60, ::GetSysColor(COLOR_3DFACE)); 
     CDialog::OnPaint(); 
    } 
} 

該解決方案結束了很簡單,但我想分享無論如何有用。

1

如果對話框不需要調整大小,最簡單的方法就是創建一個具有所需背景的bmp(如果您可以使用CDialogEx而不是CDialog - 只需調用SetBackgroundImage,則很容易)。

如果你不能使用位圖,那麼你將不得不創建自己的控件來繪製這個背景。

+0

我可以!謝謝你,先生,那美妙地服務我的目的。 – baderous 2012-01-16 22:56:29

+0

嘗試此解決方案後,我遇到了一些問題。它需要在所有控件插入「覆蓋它」但高於原始背景的位置下維護位圖。這是一種額外的不必要的資源;這是一個「骯髒」的解決方案...我已經發布了一個解決方案的答案,以更「自然」的方式解決問題。謝謝! – baderous 2012-01-17 21:14:15

+0

我還沒有嘗試過自己,但我真的不認爲你的解決方案更好或更自然。如果你需要更復雜的背景怎麼辦?你打算用GDI來畫嗎?你甚至沒有使用雙緩衝區,所以你會有閃爍的問題。但我很高興知道你找到了解決問題的辦法。 – 2012-01-18 08:02:52