关于线段的绘制

这里我们主要使用两个函数来完成MoveToEx函数和LineTo函数。

MoveToEx

The MoveToEx function updates the current position to the specified point and optionally returns the previous position.

BOOL MoveToEx(
  _In_   HDC hdc,
  _In_   int X,
  _In_   int Y,
  _Out_  LPPOINT lpPoint
);
Parameters
hdc [in]   Handle to a device context.
X [in]   Specifies the x-coordinate, in logical units, of the new position, in logical units.
Y [in]   Specifies the y-coordinate, in logical units, of the new position, in logical units.
lpPoint [out]    Pointer to a POINT structure that receives the previous current position. If this parameter is a NULL pointer, the previous position is not returned.
Return value

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero.

 

LineTo

The LineTo function draws a line from the current position up to, but not including, the specified point.

BOOL LineTo(
  _In_  HDC hdc,
  _In_  int nXEnd,
  _In_  int nYEnd
);
Parameters
hdc [in]  Handle to a device context.
nXEnd [in]  Specifies the x-coordinate, in logical units, of the line's ending point.
nYEnd [in]  Specifies the y-coordinate, in logical units, of the line's ending point.
Return value

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero.

下面的代码给出了绘制矩形的。起点的位置为(20,20)。代码如下:

MoveToEx(hdc, 20, 20, NULL);
LineTo(hdc,200,20);
LineTo(hdc,200,200);
LineTo(hdc,20,200);
LineTo(hdc,20,20);

下面的完整的例子给出了随机直线的绘制。

// 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
                            "Line 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);

       // create a random colored pen
       HPEN hpen = CreatePen(PS_SOLID,1,RGB(rand()%256,rand()%256,rand()%256));

       // select the pen into context
       HPEN old_hpen = (HPEN)SelectObject(hdc,hpen);

       // move to a random postion
       MoveToEx(hdc, rand()%WINDOW_WIDTH, rand()%WINDOW_HEIGHT, NULL);

       // draw a line
       LineTo(hdc,rand()%WINDOW_WIDTH, rand()%WINDOW_HEIGHT);
       // now delete the pen
       SelectObject(hdc,old_hpen);
       DeleteObject(hpen);
    
       // 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

绘制的结果如下:

image

posted on 2013-02-19 21:39  GreenLight  阅读(222)  评论(0编辑  收藏  举报