HDC hdc = GetDC(hwnd);//客户区 hdc = GetWindowDC(hwnd) 或者 hdc = GetDC(NULL);
hdc = ps.hdc; //这个是一个RECT里的dc
ReleaseDC(hWnd,hdc);
1。 Lines-----------------------------------------------------------------------------------------------------------------------------------------------
LRESULT CALLBACK WindowProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { /************************************************************************/ /* 这里定义了两个静态整型变量来保存窗口客户区的尺寸。这样,显示图形就能够在用户改变窗口尺寸的时候进行相应的缩放 */ /************************************************************************/ static int cxClient, cyClient; switch (msg) { case WM_CREATE: { RECT rect; GetClientRect(hwnd, &rect); cxClient = rect.right; cyClient = rect.bottom; } break; case WM_SIZE: { cxClient = LOWORD(lParam); cyClient = HIWORD(lParam); } break; case WM_PAINT: { PAINTSTRUCT ps; BeginPaint (hwnd, &ps); //**this is where we do any drawing to the screen** const int NumLinesPerSide = 10; int yStep = cyClient/NumLinesPerSide; int xStep = cxClient/NumLinesPerSide; //Draw Lines for(int mult=1; mult<NumLinesPerSide; ++mult){ //bottom left MoveToEx(ps.hdc, xStep*mult, 0, 0); LineTo(ps.hdc, 0, cyClient-yStep*mult); //top right MoveToEx(ps.hdc, xStep*mult, cyClient, 0); LineTo(ps.hdc, cxClient, cyClient-yStep*mult); //bottom right MoveToEx(ps.hdc, xStep*mult, 0,0); LineTo(ps.hdc, cxClient, yStep*mult); //top left MoveToEx(ps.hdc, xStep*mult, cyClient, 0); LineTo(ps.hdc, 0, yStep*mult); } EndPaint (hwnd, &ps); } break; case WM_DESTROY: { // kill the application, this sends a WM_QUIT message PostQuitMessage (0); } break; }//end switch //this is where all the messages not specifically handled by our //winproc are sent to be processed return DefWindowProc (hwnd, msg, wParam, lParam); }
2。 lines2 ---------------------------------------------------------------------------------------------------------------
LRESULT CALLBACK WindowProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { /************************************************************************/ /* 这里定义了两个静态整型变量来保存窗口客户区的尺寸。这样,显示图形就能够在用户改变窗口尺寸的时候进行相应的缩放 */ /************************************************************************/ static int cxClient, cyClient; static HPEN BluePen = CreatePen(PS_SOLID, 1, RGB(0,0,255)); static HPEN GreenPen = CreatePen(PS_SOLID, 1, RGB(255,0,0)); static HPEN RedPen = CreatePen(PS_SOLID, 1, RGB(0,255,0)); static HPEN PurplePen = CreatePen(PS_SOLID, 1, RGB(255,0,255)); static HPEN OldPen = NULL; switch (msg) { case WM_CREATE: { RECT rect; GetClientRect(hwnd, &rect); cxClient = rect.right; cyClient = rect.bottom; } break; case WM_SIZE: { cxClient = LOWORD(lParam); cyClient = HIWORD(lParam); } break; case WM_PAINT: { PAINTSTRUCT ps; BeginPaint (hwnd, &ps); OldPen = (HPEN)SelectObject(ps.hdc, RedPen); //**this is where we do any drawing to the screen** const int NumLinesPerSide = 10; int yStep = cyClient/NumLinesPerSide; int xStep = cxClient/NumLinesPerSide; //Draw Lines for(int mult=1; mult<NumLinesPerSide; ++mult){ //bottom left SelectObject(ps.hdc, RedPen); MoveToEx(ps.hdc, xStep*mult, 0, 0); LineTo(ps.hdc, 0, cyClient-yStep*mult); //top right SelectObject(ps.hdc, BluePen); MoveToEx(ps.hdc, xStep*mult, cyClient, 0); LineTo(ps.hdc, cxClient, cyClient-yStep*mult); //bottom right SelectObject(ps.hdc, GreenPen); MoveToEx(ps.hdc, xStep*mult, 0,0); LineTo(ps.hdc, cxClient, yStep*mult); //top left SelectObject(ps.hdc, PurplePen); MoveToEx(ps.hdc, xStep*mult, cyClient, 0); LineTo(ps.hdc, 0, yStep*mult); } SelectObject(ps.hdc, OldPen); EndPaint (hwnd, &ps); } break; case WM_DESTROY: { // kill the application, this sends a WM_QUIT message DeleteObject(RedPen); DeleteObject(BluePen); DeleteObject(GreenPen); DeleteObject(PurplePen); DeleteObject(OldPen); PostQuitMessage (0); } break; }//end switch //this is where all the messages not specifically handled by our //winproc are sent to be processed return DefWindowProc (hwnd, msg, wParam, lParam); }
3。 Polygon--------------------------------------------------------------------------------------------------------
LRESULT CALLBACK WindowProc (HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam)
{
//create some pens to use for drawing
static HPEN BluePen = CreatePen(PS_SOLID, 1, RGB(0, 0, 255));
static HPEN OldPen = NULL;
//create a solid brush
static HBRUSH RedBrush = CreateSolidBrush(RGB(255, 0, 0));
static HBRUSH OldBrush = NULL;
//these hold the dimensions of the client window area
static int cxClient, cyClient;
//this will hold the vertices of the polygons we create
static POINT verts[NUM_VERTS];
static int iNumVerts = NUM_VERTS;
switch (msg)
{
//A WM_CREATE msg is sent when your application window is first
//created
case WM_CREATE:
{
//to get get the size of the client window first we need to create
//a RECT and then ask Windows to fill in our RECT structure with
//the client window size. Then we assign to cxClient and cyClient
//accordingly
RECT rect;
GetClientRect(hwnd, &rect);
cxClient = rect.right;
cyClient = rect.bottom;
//seed random number generator
srand((unsigned) time(NULL));
//now lets create some random vertices
for (int v=0; v<iNumVerts; ++v)
{
verts[v].x = RandInt(0, cxClient);
verts[v].y = RandInt(0, cyClient);
}
}
break;
case WM_KEYUP:
{
switch(wParam)
{
case VK_SPACE:
{
//create some new points for our polygon
//now lets create some random vertices
for (int v=0; v<iNumVerts; ++v)
{
verts[v].x = RandInt(0, cxClient);
verts[v].y = RandInt(0, cyClient);
}
//refresh the display so we can see our
//new polygon
InvalidateRect(hwnd, NULL, TRUE);
UpdateWindow(hwnd);
}
break;
case VK_ESCAPE:
{
PostQuitMessage(0);
}
break;
}
}
case WM_PAINT:
{
PAINTSTRUCT ps;
BeginPaint (hwnd, &ps);
//first select a pen to draw with and store a copy
//of the pen we are swapping it with
OldPen = (HPEN)SelectObject(ps.hdc, BluePen);
//do the same for our brush
OldBrush = (HBRUSH)SelectObject(ps.hdc, RedBrush);
//draw the polygon
Polygon(ps.hdc, verts, iNumVerts);
//replace the original pen
SelectObject(ps.hdc, OldPen);
//and brush
SelectObject(ps.hdc, OldBrush);
EndPaint (hwnd, &ps);
}
break;
//has the user resized the client area?
case WM_SIZE:
{
//if so we need to update our variables so that any drawing
//we do using cxClient and cyClient is scaled accordingly
cxClient = LOWORD(lParam);
cyClient = HIWORD(lParam);
//create a new polygon
for (int v=0; v<iNumVerts; ++v)
{
verts[v].x = RandInt(0, cxClient);
verts[v].y = RandInt(0, cyClient);
}
}
break;
case WM_DESTROY:
{
//delete the pens
DeleteObject(BluePen);
DeleteObject(OldPen);
//and the brushes
DeleteObject(RedBrush);
DeleteObject(OldBrush);
// kill the application, this sends a WM_QUIT message
PostQuitMessage (0);
}
break;
}//end switch
//this is where all the messages not specifically handled by our
//winproc are sent to be processed
return DefWindowProc (hwnd, msg, wParam, lParam);
}
出自: 《游戏编程中的人工智能技术》