2013-07-02 39 views
0

我對MFC和Windows編程一般都比較陌生,我需要製作一種交互式圖形,在這裏我可以點擊圖形中的不同點畫布和點擊點之間的線條
到目前爲止,我已經能夠在靜態圖片框控件中繪製標準形狀
但是,問題是如果我拖動包含繪製圖形的對話框的部分在屏幕邊緣之外,當我把它帶回去的繪製圖得到擦除
我需要它永久保留在靜態控制
在閱讀幾個論壇問題後,我看到我需要派生我自己的靜態控制cl屁股從CStatic類,然後編寫我的代碼在這個新的靜態控制的OnPaint()函數,但我不明白如何正確地做到這一點,因爲正確使用OnPaint函數和WM_PAINT我需要使用一些嚮導中提供的嚮導函數工作室,但我無法找到任何簡單的教程,教如何做到這一點
任何想法,將不勝感激
這是我的代碼到目前爲止使用CClientDC在靜態控件上繪製永久圖片

void Cpaint_using_dcDlg::OnBnClickedDraw() 
{ 
    // TODO: Add your control notification handler code here 
    COLORREF black = RGB(255, 0, 0); 
    CPen pen(PS_SOLID, 1, black); 
    CClientDC Dc(GetDlgItem(IDC_CANVAS)); 
    // CClientDC Dc(this); 
    // Dc.MoveTo(0,0); 
    Dc.SelectObject(&pen); 
    CPoint point1(0,0); 
    point1.x = 0; 
    point1.y = 0; 
    CPoint point2(0,0); 
    point2.x = point1.x + 50; 
    point2.y = point1.y + 50; 
    Dc.Ellipse(CRect(point1, point2)); 
} 

這將導致一個橢圓形的IDC_CANVAS內要繪製這是一個靜態圖片框控件,每當按下命令按鈕時

---- UPD ATE ----
我能夠在的OnInitDialog()函數

BOOL Cpaint_using_dcDlg::OnInitDialog() 
{ 
    CDialogEx::OnInitDialog(); 

    // Set the icon for this dialog. The framework does this automatically 
    // when the application's main window is not a dialog 
    SetIcon(m_hIcon, TRUE);   // Set big icon 
    SetIcon(m_hIcon, FALSE);  // Set small icon 

    // TODO: Add extra initialization here 
    CRect rect; 
    CWnd *pWnd = GetDlgItem(IDC_CANVAS); 
    pWnd->GetWindowRect(&rect); 
    ScreenToClient(&rect); //optional step - see below 
    // my_canvas.Create(NULL, WS_CHILD|WS_VISIBLE|SS_BLACKFRAME|SS_BLACKRECT|SS_ETCHEDFRAME , rect, this, 0x1111); 
    my_canvas.Create(NULL, WS_CHILD|WS_VISIBLE|SS_BLACKFRAME, rect, this, 0x1111); 

    return TRUE; // return TRUE unless you set the focus to a control 
} 

下一步是要能夠借鑑這種靜態控制顯卡使用下面的代碼來創建我diaog箱靜態控制即使這個對話框被另一個對話框重疊也不會消失。對於這一點,在類我的自定義的靜電控制,我包括使用類嚮導一個OnPaint()函數,幷包括在代碼繪製橢圓,如下所示:

void CMy_Canvas::OnPaint() 
{ 
    CPaintDC dc(this); // device context for painting 
    // TODO: Add your message handler code here 
    // Do not call CStatic::OnPaint() for painting messages 
    CPen pen; 
    dc.SelectObject(&pen); 
    // CPoint curPos; 
    // GetCursorPos(&curPos); 
    CPoint point1(0,0); 
    point1.x = 0; 
    point1.y = 0; 
    CPoint point2(0,0); 
    point2.x = point1.x + 50; 
    point2.y = point1.y + 50; 
    dc.Ellipse(CRect(point1, point2)); 
} 

但是現在它繪製橢圓,但使用my_canvas.Create(NULL, WS_CHILD|WS_VISIBLE|SS_BLACKFRAME, rect, this, 0x1111);生成的靜態控件的輪廓消失。爲什麼會發生這種情況,我該如何避免它?另外,我真正需要做的是使這個圖形交互,這樣我就可以改變我將使用鼠標點擊在這個控件上顯示的曲線的結構。哪個WM_消息適合做這個?我假設它應該是WM_LBUTTONUPWM_LBUTTONDOWN但我不確定。另外,假設我需要在兩點之間畫一條線,我點擊畫布。我應該在哪裏放置繪製這條線的代碼?它應該在OnPaint()函數中還是在鼠標事件處理函數中進行?

+0

當您在論壇問題中閱讀時,您是否從CStatic派生出了自己的類?如果你這樣做,請使用MFC類wizzard創建類​​,這使添加OnPaint處理程序時更容易。 –

+0

我還沒弄清楚如何使用類嚮導來派生類,坦白地說,至此我不確定這是否正是我需要做的;例如,可以說我從CStatic派生出一個名爲CStatic_my的類,它的對象應該代表我的自定義靜態控件;我如何將它放在我的對話框中?它是否顯示爲工具箱中的圖標?或者我必須自己在OnInitDialog()中創建它,在這種情況下,我可能必須指定它的座標,我不知道該怎麼做 – user13267

+0

Class wizzard:右鍵單擊項目,然後Class Wizzard,然後添加類(MFC類),然後base class = CStatic。您可以使用對話框編輯器將靜態控件放入對話框中(併爲控件/子類添加一個變量),但您也可以自己動態創建控件。使用對話框編輯器是更簡單的方法。 –

回答

0

您不需要在OnInitDialog中創建自定義靜態控件。使用您在視覺設計器中創建的靜態控件(IDC_CANVAS)。在該設計器中,右鍵單擊該控件並添加一個控件成員變量。將該控件成員變量類型從CStatic更改爲CMyCanvas。現在您的自定義控件類應該接收OnPaint調用。

+0

哇,它的工作原理。非常感謝。我在'OnInitDialog()'函數中註釋了我用來創建控件的代碼。它用我的'CMy_Static'控件替換了我使用表單設計器放置的'CStatic'。我知道這是因爲我已經放置了代碼在'CMY_Static'的'OnPaint()'中繪製一個橢圓。然而,我從窗體設計器爲'CStatic'控件定義的邊框完全消失了。在哪裏以及如何爲CMy_Static指定外觀? – user13267