如果我們只想在某個空間窗口內繪圖的話,則應避免重復繪制對話框元素。如果只想顯示一些文本,我們可以利用對話框編輯器來創建一個具有特殊ID的空靜態控件,然后在對話框的成員函數中調用CWnd::SetDlgItemText函數,以便在該控件中顯示文本。
如果想顯示圖形的話,必須利用ClassWizard相對話框中加入OnPaint成員函數,該函數必須將靜態控件的ID轉換CWnd指針,然后在得到他的設備環境。這里的一個技巧就在於我們既要在控件窗口繪圖,又要防止Windows對他進行重復繪制。我們可以通過利用Invalidate/UpdateWindow這一調用序列來達到這一效果。
例: CWnd * pWnd = GetDlgItem(IDC_STATIC); //IDC_STATIC1 specified in the dialog editor
CDC * pControlDC = pWnd->GetDC();
pWnd->Invalidate();
pWnd->UpdateWindow();
pControlDC->SelectStockObject(BLACK_BRUSH);
pControlDC->Rectangle(0,0,10,10);
pWnd->ReleaseDC(pControlDC);
我們可以利用以下語句在對話框的其他成員函數中強行調用OnPaint函數
Invalidate();
也可以:
響應WM_PAINT消息 在OnPaint函數里面定義CPaintDC dc(this); 然后用這個dc進行繪圖就是了,跟在視圖類中繪圖中一樣。
或者:
我現在是在對話框內放了一個靜態文本, 用 CWnd pwnd=GetDlgItem(IDC_STATIC); CDC *pDC=GetDc(); 再在pDC繪圖,現在遇到的問題是,在靜態文本內繪圖,它是以像素為基本單位的,和實際有些區別,比如說我要畫的是一個半徑為1的圓,如果以一個像素為基本單位,根本就是一個很小的點, 問題二,就是我畫點是以Rectangle(250,150,252,152)實際上是一個長度為2像素的矩形,想問問有沒有畫點更好的方法。
// 設置窗口大小
SetWindowPos(0, 0, 0, 500, 500, SWP_NOMOVE);