Win32编程---实现点,线,面的绘制

来源:互联网 发布:i5和i7的区别知乎 编辑:程序博客网 时间:2024/06/06 11:02
#include <windows.h>#include   <string>   using   namespace   std;//----------函数声明---------------void init(HWND hWnd,HINSTANCE hInstance);void pix(HWND &hWnd,HDC &hDC,HBRUSH &NewBrush,PAINTSTRUCT &Ps);//画点,也就是像素输出void rect(HWND &hWnd,HDC &hDC,HBRUSH &NewBrush,PAINTSTRUCT &Ps);//----画矩形----void fillrect(HWND &hWnd,HDC &hDC,HBRUSH &NewBrush,RECT &r,PAINTSTRUCT &Ps);//填充矩形void linerect(HWND &hWnd,HDC &hDC,HBRUSH &NewBrush,RECT &r,PAINTSTRUCT &Ps);//线框矩形void triangle(HWND &hWnd,HDC &hDC,HBRUSH &NewBrush,POINT Pt[3],PAINTSTRUCT &Ps);//三角形void ellipse(HWND &hWnd,HDC &hDC,HBRUSH &NewBrush,RECT &r,PAINTSTRUCT &Ps);//椭圆void DrawContent(HWND hWnd);//-----回调函数-----------------LRESULT CALLBACK WindProcedure(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,                   LPSTR lpCmdLine, int nCmdShow){    WNDCLASSEX  WndCls;    MSG         Msg;    WndCls.cbSize        = sizeof(WndCls);    WndCls.style         = CS_OWNDC | CS_VREDRAW | CS_HREDRAW;    WndCls.lpfnWndProc   = WindProcedure;    WndCls.cbClsExtra    = 0;    WndCls.cbWndExtra    = 0;    WndCls.hInstance     = hInstance;    WndCls.hIcon         = LoadIcon(NULL, IDI_APPLICATION);    WndCls.hCursor       = LoadCursor(NULL, IDC_ARROW);    WndCls.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);    WndCls.lpszMenuName  = NULL;    WndCls.lpszClassName = TEXT("MAIN");    WndCls.hIconSm       = LoadIcon(hInstance, IDI_APPLICATION);    RegisterClassEx(&WndCls);   HWND  hWnd=CreateWindowEx(WS_EX_OVERLAPPEDWINDOW,                   TEXT("MAIN"),TEXT( "陈琦"),                   WS_OVERLAPPEDWINDOW | WS_VISIBLE,                   CW_USEDEFAULT, CW_USEDEFAULT, 820, 820,                   NULL, NULL, hInstance, NULL);    init(hWnd,hInstance);UpdateWindow(hWnd);    while( GetMessage(&Msg, NULL, 0, 0) )    {        TranslateMessage(&Msg);        DispatchMessage( &Msg);    }    return static_cast<int>(Msg.wParam);}     void init(HWND hWnd,HINSTANCE hInstance){ CreateWindow(  TEXT("BUTTON"),  TEXT("画点"),  WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, 0, 0, 150,80, hWnd,NULL, hInstance, NULL);CreateWindow(   TEXT("BUTTON"),  TEXT("矩形"),  WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, 0, 90, 150,80, hWnd,NULL, hInstance, NULL);  CreateWindow(   TEXT("BUTTON"),  TEXT("填充矩形"),  WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, 0, 180, 150,80, hWnd,NULL, hInstance, NULL);CreateWindow(   TEXT("BUTTON"),  TEXT("线框矩形"),  WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, 0, 270, 150,80, hWnd,NULL, hInstance, NULL);CreateWindow(   TEXT("BUTTON"),  TEXT("三角形"),  WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, 0, 360, 150,80, hWnd,NULL, hInstance, NULL);CreateWindow(   TEXT("BUTTON"),  TEXT("椭圆"),  WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, 0, 450, 150,80, hWnd,NULL, hInstance, NULL);}LRESULT CALLBACK WindProcedure(HWND hWnd, UINT Msg,WPARAM wParam, LPARAM lParam){HDC         hDC;    PAINTSTRUCT Ps;HBRUSH      NewBrush;RECTr;POINT Pt[3];switch(Msg){case WM_COMMAND:    HWND h;h=FindWindowEx(hWnd ,NULL,TEXT("BUTTON"),TEXT("画点"));if(DWORD(lParam)==int(h)){pix(hWnd,hDC,NewBrush,Ps);break;}h=FindWindowEx(hWnd ,NULL,TEXT("BUTTON"),TEXT("矩形"));if(DWORD(lParam)==int(h)){rect(hWnd,hDC,NewBrush,Ps);break;}h=FindWindowEx(hWnd ,NULL,TEXT("BUTTON"),TEXT("填充矩形"));if(DWORD(lParam)==int(h)){fillrect(hWnd,hDC,NewBrush,r,Ps);break;}h=FindWindowEx(hWnd ,NULL,TEXT("BUTTON"),TEXT("线框矩形"));if(DWORD(lParam)==int(h)){linerect(hWnd,hDC,NewBrush,r,Ps);break;}h=FindWindowEx(hWnd ,NULL,TEXT("BUTTON"),TEXT("三角形"));if(DWORD(lParam)==int(h)){triangle(hWnd,hDC,NewBrush,Pt,Ps);break;}h=FindWindowEx(hWnd ,NULL,TEXT("BUTTON"),TEXT("椭圆"));if(DWORD(lParam)==int(h)){ellipse(hWnd,hDC,NewBrush,r,Ps);break;}case WM_PAINT:DrawContent(hWnd);//为什么加了这一句后开始按钮就会显示,而不加的话按钮需要重绘以后显示 break;case WM_DESTROY:PostQuitMessage(WM_QUIT);break;default:return DefWindowProc(hWnd, Msg, wParam, lParam);}return 0;}//画点void pix(HWND &hWnd,HDC &hDC,HBRUSH &NewBrush,PAINTSTRUCT &Ps){//hDC = BeginPaint(hWnd, &Ps);//用BeginPaint的话消息一定要WM_PAINT响应,但是WM_PAINT里面只有DrawContent(hWnd);                              //所以用getDChDC=GetDC(hWnd);NewBrush=CreateSolidBrush(RGB(255,0,0));//SelectObject(hDC, NewBrush);for(int x=500;x<600;x++)//由于一个点太小了,所以这里花了100个点构成线段SetPixel(hDC,x,50,RGB(255,0,0));//DeleteObject(NewBrush);//EndPaint(hWnd, &Ps);ReleaseDC(hWnd,hDC);}//矩形void rect(HWND &hWnd,HDC &hDC,HBRUSH &NewBrush,PAINTSTRUCT &Ps){//hDC = BeginPaint(hWnd, &Ps);hDC=GetDC(hWnd);NewBrush=CreateSolidBrush(RGB(255,0,0));SelectObject(hDC, NewBrush);Rectangle(hDC,400,400,500,500);DeleteObject(NewBrush);ReleaseDC(hWnd,hDC);//EndPaint(hWnd, &Ps);}//填充矩形void fillrect(HWND &hWnd,HDC &hDC,HBRUSH &NewBrush,RECT &r,PAINTSTRUCT &Ps){//hDC = BeginPaint(hWnd, &Ps);hDC=GetDC(hWnd);NewBrush = CreateSolidBrush(RGB(25, 25, 5));SelectObject(hDC, NewBrush);SetRect (&r, 200, 200,250, 250);    FillRect(hDC, &r, NewBrush);DeleteObject(NewBrush);//EndPaint(hWnd, &Ps);ReleaseDC(hWnd,hDC);}//线框矩形void linerect(HWND &hWnd,HDC &hDC,HBRUSH &NewBrush,RECT &r,PAINTSTRUCT &Ps){//hDC = BeginPaint(hWnd, &Ps);hDC=GetDC(hWnd);NewBrush = CreateSolidBrush(RGB(25, 25, 5));SelectObject(hDC, NewBrush);SetRect (&r, 250, 250,400, 400);FrameRect(hDC, &r, NewBrush);    DeleteObject(NewBrush);DeleteObject(NewBrush);//EndPaint(hWnd, &Ps);ReleaseDC(hWnd,hDC);}//三角形void triangle(HWND &hWnd,HDC &hDC,HBRUSH &NewBrush,POINT Pt[3],PAINTSTRUCT &Ps){//hDC = BeginPaint(hWnd, &Ps);hDC=GetDC(hWnd);NewBrush = CreateSolidBrush(RGB(50, 50, 50)); SelectObject(hDC, NewBrush);Pt[0].x = 425; Pt[0].y = 40;Pt[1].x = 395; Pt[1].y = 70;Pt[2].x = 455; Pt[2].y = 70;Polygon(hDC, Pt, 3); DeleteObject(NewBrush);NewBrush = CreateSolidBrush(RGB(0, 255, 0)); SelectObject(hDC, NewBrush);Pt[0].x = 365; Pt[0].y = 110;Pt[1].x = 395; Pt[1].y = 80;Pt[2].x = 395; Pt[2].y = 140;Polygon(hDC, Pt, 3);     DeleteObject(NewBrush);NewBrush = CreateSolidBrush(RGB(255, 0, 0)); SelectObject(hDC, NewBrush);Pt[0].x = 485; Pt[0].y = 110;Pt[1].x = 455; Pt[1].y = 80;Pt[2].x = 455; Pt[2].y = 140;Polygon(hDC, Pt, 3);     DeleteObject(NewBrush);NewBrush = CreateSolidBrush(RGB(0, 0, 255)); SelectObject(hDC, NewBrush);Pt[0].x = 425; Pt[0].y = 180;Pt[1].x = 455; Pt[1].y = 150;Pt[2].x = 395; Pt[2].y = 150;Polygon(hDC, Pt, 3);     DeleteObject(NewBrush);//EndPaint(hWnd, &Ps);ReleaseDC(hWnd,hDC);}//椭圆void ellipse(HWND &hWnd,HDC &hDC,HBRUSH &NewBrush,RECT &r,PAINTSTRUCT &Ps)//椭圆{//hDC = BeginPaint(hWnd, &Ps);hDC=GetDC(hWnd);NewBrush = CreateSolidBrush(RGB(255, 0, 0)); SelectObject(hDC, NewBrush);Ellipse(hDC,500,500,600,600);DeleteObject(NewBrush);//EndPaint(hWnd, &Ps);ReleaseDC(hWnd,hDC);}void DrawContent(HWND hWnd){HDC         hDC;PAINTSTRUCT Ps; hDC = BeginPaint(hWnd, &Ps);//用BeginPaint的话消息一定要WM_Paint响应EndPaint(hWnd, &Ps);}