BeginPaint

BeginPaint

BeginPaint函數準備指定的窗口來重繪並將繪畫相關的信息放到一個PAINTSTRUCT結構中。

說明


BeginPaint函數為指定窗口進行繪圖工作的準備,並用將和繪圖有關的信息填充到一個
paintstruct結構中。

函數原型


HDC BeginPaint(
HWND hwnd, // 窗口的句柄
LPPAINTSTRUCT lpPaint // 繪製信息
);

參數


hwnd:[輸入]被重繪的窗口句柄
lpPaint:[輸出]指向一個用來接收繪畫信息的PAINTSTRUCT結構

返回值


如果函數成功,返回值是指定窗口的“顯示設備描述表”句柄。
如果函數失敗,返回值是NULL,表明沒有得到顯示設備的內容。
Windows NT/2000/XP: 使用GetLastError得到更多的錯誤信息。

備註


BeginPaint函數自動設置顯示設備內容的剪切區域,而排除任何更新區域外的區域。該更新區域可以通過InvalidateRect或InvalidateRgn函數設置,也可以是系統在改變大小、移動、創建、滾動後設置的,
亦是其他的影響客戶區的操作來設置的。如果更新區域被標記為可擦除的,BeginPaint發送一個WM_ERASEBKGND消息給窗口。
一個應用程序除了響應WM_PAINT消息外,不應該調用BeginPaint。每次調用BeginPaint都應該有相應的EndPaint函數。
如果被繪畫的客戶區中有一個caret(caret:插入符。是窗口客戶區中的一個閃爍的線,塊,或點陣圖。插入符通常表示文本或圖形將被插入的地方。即一閃一閃的游標),BeginPaint自動隱藏該符號,而保證它不被擦除。
如果窗口類有一個背景刷,BeginPaint使用這個刷子來擦除更新區域的背景。

例子代碼


1. 你使用BeginPaint和EndPaint函數來準備和完成客戶區的繪畫。BeginPaint返回一個用來繪畫的客戶區的顯示設備內容的HANDLE,EndPaint終止繪畫請求,並釋放設備內容。
下面的例子中,窗口程序寫HELLO WINDOWS消息到窗口的客戶區。為了使字元串在窗口第一次創建的時候可見,WinMain函數在創建和顯示窗口之後立即調用UpdateWindow,這導致一個WM_PAINT消息被立即發送到窗口程序中。
LRESULT APIENTRY WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
TextOut(hdc, 0, 0, "Hello, Windows!", 15);
EndPaint(hwnd, &ps);
return 0;
// Process other messages.
}
}
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
HWND hwnd;
hwnd = CreateWindowEx(
// parameters
);
ShowWindow(hwnd, SW_SHOW);
UpdateWindow(hwnd);
return msg.wParam;
}
2.BeginPaint在GDI,GDI+中的具體代碼示例
採用GDI繪圖
HDC hdc;//設備場景DC
PAINTSTRUCT ps;
HEPN hPen;
HPEN hPenOld;
hdc = BeginPaint( hWnd , &ps );
hPen = CreatePen( PS_SOLID , 3 , RGB( 255 , 0 , 0 );
hPenOld = ( HPEN )SelectObject ( hdc , hPen );
MoveToEx ( hdc , 20 , 10 , NULL );
LineTo( hdc , 200 ,100);
SelectObject (hdc , hOldPen);
DeleteObject ( hPen );
EndPaint ( hWnd , &ps );]
採用GDI+繪圖
HDC hdc ;
Graphics *myGraphics = new Graphics ( hdc );
Pen *myPen = new Pen (Color( 255 , 255 , 0 , 0) , 3 );
PANINTSTRUCT ps;
hdc = BeginPaint( hWnd , &ps );
myGraphics ->DrawLine ( myPen , 20 ,10 ,200 ,100);
delete myGraphics ;
delete myPen ;
EndPaint (hWnd , hdc);