1. 程式人生 > >Win32程式設計---實現點,線,面的繪製

Win32程式設計---實現點,線,面的繪製

#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;
	RECT	r;
	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);
	                              //所以用getDC
	hDC=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);

}