绘制矩形
The Rectangle function draws a rectangle. The rectangle is outlined by using the current pen and filled by using the current brush.
BOOL Rectangle( _In_ HDC hdc, _In_ int nLeftRect, _In_ int nTopRect, _In_ int nRightRect, _In_ int nBottomRect );
Parameters
-
hdc [in]
-
A handle to the device context.
nLeftRect [in]
-
The x-coordinate, in logical coordinates, of the upper-left corner of the rectangle.
nTopRect [in]
-
The y-coordinate, in logical coordinates, of the upper-left corner of the rectangle.
nRightRect [in]
-
The x-coordinate, in logical coordinates, of the lower-right corner of the rectangle.
nBottomRect [in]
-
The y-coordinate, in logical coordinates, of the lower-right corner of the rectangle.
Return value
If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero.
其中Rectangle函数会使用当前的画笔和笔刷来绘制矩形。下面的代码绘制了min(20,20)到max(120,120)的矩形。
HBRUSH hbrush = CreateSolidBrush(RGB(rand()%256,rand()%256,rand()%256)); HPEN hpen = CreatePen(PS_SOLID,0,RGB(255,255,255));
SelectObject(hdc,hpen); SelectObject(hdc,hbrush); Rectangle(hdc, 20,20,120,120); DeleteObject(hbrush); DeleteObject(hpen);
因为我们使用了brush来绘制,其中pen的宽度取0,得到的结果如下,颜色随机。
其中Rectangle的位置如下:
另外介绍两个函数FillRect和FrameRect
The FillRect function fills a rectangle by using the specified brush. This function includes the left and top borders, but excludes the right and bottom borders of the rectangle.
int FillRect( _In_ HDC hDC, _In_ const RECT *lprc, _In_ HBRUSH hbr );
Parameters
-
hDC [in]
-
A handle to the device context.
lprc [in]
-
A pointer to a RECT structure that contains the logical coordinates of the rectangle to be filled.
hbr [in]
-
A handle to the brush used to fill the rectangle.
Return value
If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero.
The FrameRect function draws a border around the specified rectangle by using the specified brush. The width and height of the border are always one logical unit.
int FrameRect( _In_ HDC hDC, _In_ const RECT *lprc, _In_ HBRUSH hbr );
Parameters
-
hDC [in]
-
A handle to the device context in which the border is drawn.
lprc [in]
-
A pointer to a RECT structure that contains the logical coordinates of the upper-left and lower-right corners of the rectangle.
hbr [in]
-
A handle to the brush used to draw the border.
Return value
If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero.
下面的完整代码给出了上面的两个函数的使用方法。
// INCLUDES /// #define WIN32_LEAN_AND_MEAN // just say no to MFC #include <windows.h> // include all the windows headers #include <windowsx.h> // include useful macros #include <mmsystem.h> // very important and include WINMM.LIB too! #include <stdio.h> #include <stdlib.h> #include <math.h> // DEFINES // defines for windows #define WINDOW_CLASS_NAME "WINCLASS1" #define WINDOW_WIDTH 400 #define WINDOW_HEIGHT 300 // MACROS / #define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0) #define KEYUP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1) // GLOBALS HWND main_window_handle = NULL; // globally track main window HINSTANCE hinstance_app = NULL; // globally track hinstance char buffer[80]; // general printing buffer // FUNCTIONS // LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { // this is the main message handler of the system PAINTSTRUCT ps; // used in WM_PAINT HDC hdc; // handle to a device context char buffer[80]; // used to print strings // what is the message switch(msg) { case WM_CREATE: { // do initialization stuff here // return success return(0); } break; case WM_PAINT: { // simply validate the window hdc = BeginPaint(hwnd,&ps); // end painting EndPaint(hwnd,&ps); // return success return(0); } break; case WM_DESTROY: { // kill the application, this sends a WM_QUIT message PostQuitMessage(0); // return success return(0); } break; default:break; } // end switch // process any messages that we didn't take care of return (DefWindowProc(hwnd, msg, wparam, lparam)); } // end WinProc // WINMAIN int WINAPI WinMain( HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow) { WNDCLASSEX winclass; // this will hold the class we create HWND hwnd; // generic window handle MSG msg; // generic message HDC hdc; // graphics device context // first fill in the window class stucture winclass.cbSize = sizeof(WNDCLASSEX); winclass.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW; winclass.lpfnWndProc = WindowProc; winclass.cbClsExtra = 0; winclass.cbWndExtra = 0; winclass.hInstance = hinstance; winclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); winclass.hCursor = LoadCursor(NULL, IDC_ARROW); winclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); winclass.lpszMenuName = NULL; winclass.lpszClassName = WINDOW_CLASS_NAME; winclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION); // save hinstance in global hinstance_app = hinstance; // register the window class if (!RegisterClassEx(&winclass)) return(0); // create the window if (!(hwnd = CreateWindowEx(NULL, // extended style WINDOW_CLASS_NAME, // class "Rectangle Drawing Demo", // title WS_OVERLAPPEDWINDOW | WS_VISIBLE, 0,0, // initial x,y WINDOW_WIDTH, // initial width WINDOW_HEIGHT,// initial height NULL, // handle to parent NULL, // handle to menu hinstance,// instance of this application NULL))) // extra creation parms return(0); // save main window handle main_window_handle = hwnd; // enter main event loop, but this time we use PeekMessage() // instead of GetMessage() to retrieve messages while(TRUE) { // test if there is a message in queue, if so get it if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { // test if this is a quit if (msg.message == WM_QUIT) break; // translate any accelerator keys TranslateMessage(&msg); // send the message to the window proc DispatchMessage(&msg); } // end if // draw a random line // get the graphics device context hdc = GetDC(hwnd); RECT rect; // used to hold rect info // create a random rectangle rect.left = rand()%WINDOW_WIDTH; rect.top = rand()%WINDOW_HEIGHT; rect.right = rand()%WINDOW_WIDTH; rect.bottom = rand()%WINDOW_HEIGHT; // create a random brush HBRUSH hbrush = CreateSolidBrush(RGB(rand()%256,rand()%256,rand()%256)); // draw either a filled rect or a wireframe rect if ((rand()%2)==1) FillRect(hdc,&rect,hbrush); else FrameRect(hdc,&rect,hbrush); // now delete the brush DeleteObject(hbrush); // release the device context ReleaseDC(hwnd,hdc); // main game processing goes here if (KEYDOWN(VK_ESCAPE)) SendMessage(hwnd, WM_CLOSE, 0,0); } // end while // return to Windows like this return(msg.wParam); } // end WinMain
绘制的结果如下: