现在的位置: 首页 > 综合 > 正文

打点画线

2018年05月27日 ⁄ 综合 ⁄ 共 2999字 ⁄ 字号 评论关闭
#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int iCmdShow)
{
    
static TCHAR szAppName[] = TEXT("Bezier");
    HWND        hwnd;
    MSG            msg;
    WNDCLASS    wndclass;

    wndclass.style            
= CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc    
= WndProc;
    wndclass.cbClsExtra        
= 0;
    wndclass.cbWndExtra        
= 0;
    wndclass.hInstance        
= hInstance;
    wndclass.hIcon            
= LoadIcon(NULL, IDI_APPLICATION);
    wndclass.hCursor        
= LoadCursor(NULL, IDC_ARROW);
    wndclass.hbrBackground    
= (HBRUSH) GetStockObject(WHITE_BRUSH);
    wndclass.lpszMenuName    
= NULL;
    wndclass.lpszClassName    
= szAppName;

    
if(!RegisterClass(&wndclass))
    
{
        MessageBox(NULL, TEXT(
"Program requires Windows NT!"), szAppName, MB_ICONERROR);
        
return 0;
    }


    hwnd 
= CreateWindow(szAppName, TEXT("Bezier Splines"),
                        WS_OVERLAPPEDWINDOW,
                        CW_USEDEFAULT, CW_USEDEFAULT,
                        CW_USEDEFAULT, CW_USEDEFAULT,
                        NULL, NULL, hInstance, NULL);
    ShowWindow(hwnd, iCmdShow);
    UpdateWindow(hwnd);

    
while(GetMessage(&msg, NULL, 00))
    
{
        TranslateMessage(
&msg);
        DispatchMessage(
&msg);
    }

    
return msg.wParam;
}



LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    
static HDC        hdc;
    
static HPEN        hPen1, hPen2;
    
int                cxClient, cyClient;
    
static int        nCount = 0;
    
static int        crColor = RGB(25500);
    
static POINT    apt[256];
    PAINTSTRUCT        ps;

    
switch(message)
    
{
    
case WM_SIZE:

        cxClient 
= LOWORD(lParam);
        cyClient 
= HIWORD(lParam);
        hdc 
= GetDC(hwnd);

        crColor 
= RGB(00255);
        hPen1 
= CreatePen(PS_SOLID, 5, crColor);

        crColor 
= RGB(25500);
        hPen2 
= CreatePen(PS_SOLID, 1, crColor);

        
return 0;

    
case WM_LBUTTONDOWN:

        apt[nCount].x 
= LOWORD(lParam);
        apt[nCount].y 
= HIWORD(lParam);
        nCount
++;

        SelectObject(hdc, (HGDIOBJ) hPen1);

        MoveToEx(hdc, LOWORD(lParam), HIWORD(lParam), NULL);
        LineTo(hdc, LOWORD(lParam), HIWORD(lParam));

        
return 0;

    
case WM_RBUTTONDOWN:

        SelectObject(hdc, (HGDIOBJ) hPen2);

        apt[nCount].x 
= apt[0].x;
        apt[nCount].y 
= apt[0].y;
        Polyline(hdc, apt, nCount 
+ 1);
        nCount 
= 0;
        
return 0;
    
/*case WM_PAINT:
        InvalidateRect(hwnd, NULL, TRUE);

        hdc = BeginPaint(hwnd, &ps);

        SetPixel(hdc, mx, my, crColor); 

        EndPaint(hwnd, &ps);
        return 0;
*/


    
case WM_DESTROY:
        ReleaseDC(hwnd, hdc);
        DeleteObject(hPen1);
        DeleteObject(hPen2);
        PostQuitMessage(
0);
        
return 0;
    }

    
return DefWindowProc(hwnd, message, wParam, lParam);
}

一个比较简单的,画线的程序。
先用鼠标左键点画点,然后点一下鼠标右键。就会按顺序将这些点用连起来。
修改自《Windows程序设计》上的一个例子,刚刚学习Win32 SDK编程时做的
代码看起来挺笨拙的。

【上篇】
【下篇】

抱歉!评论已关闭.