计算机图形学第一次实验(续)

来源:互联网 发布:电视视频端口坏掉 编辑:程序博客网 时间:2024/05/16 12:11
这是我同学的做法
程序界面
计算机图形学第一次实验(续) - WorldsList - 风雨同舟路
 
// shiyan1.cpp : 定义应用程序的入口点。
//
#include "stdafx.h"
#include "shiyan1.h"
#include "math.h"
#include "windows.h"
#include<locale.h>
#define MAX_LOADSTRING 100
#define N 7
// 全局变量:
HINSTANCE hInst; // 当前实例
TCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本
TCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名

// 此代码模块中包含的函数的前向声明:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);

bool flag1,flag2,flag2_1,flag3;
RECT rectClient;

void DRAW1(HDC);
void DRAW2(HDC);
void DRAW2_1(HDC);
void DRAW3(HDC);
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR    lpCmdLine,
int       nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);

// TODO: 在此放置代码。
MSG msg;
HACCEL hAccelTable;

// 初始化全局字符串
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_SHIYAN1, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);

// 执行应用程序初始化:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}

hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_SHIYAN1));

// 主消息循环:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}

return (int) msg.wParam;
}



//
//  函数: MyRegisterClass()
//
//  目的: 注册窗口类。
//
//  注释:
//
//    仅当希望
//    此代码与添加到 Windows 95 中的“RegisterClassEx”
//    函数之前的 Win32 系统兼容时,才需要此函数及其用法。调用此函数十分重要,
//    这样应用程序就可以获得关联的
//    “格式正确的”小图标。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;

wcex.cbSize = sizeof(WNDCLASSEX);

wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_SHIYAN1));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = MAKEINTRESOURCE(IDC_SHIYAN1);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

return RegisterClassEx(&wcex);
}

//
//   函数: InitInstance(HINSTANCE, int)
//
//   目的: 保存实例句柄并创建主窗口
//
//   注释:
//
//        在此函数中,我们在全局变量中保存实例句柄并
//        创建和显示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
hInst = hInstance; // 将实例句柄存储在全局变量中
flag1=false;
flag2=false;
flag2_1=false;
flag3=false;

hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return FALSE;
}

ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

return TRUE;
}

//
//  函数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的: 处理主窗口的消息。
//
//  WM_COMMAND - 处理应用程序菜单
//  WM_PAINT - 绘制主窗口
//  WM_DESTROY - 发送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
GetClientRect(hWnd,&rectClient);
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;

switch (message)
{
case WM_COMMAND:
wmId    = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// 分析菜单选择:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
case ID_DRAW_TU1:
InvalidateRect(hWnd,&rectClient,true);
flag1=true;
break;
case ID_DRAW_TU2:
InvalidateRect(hWnd,&rectClient,true);
flag2=true;
break;
case ID_DRAW_TU2_1:
InvalidateRect(hWnd,&rectClient,true);
flag2_1=true;
break;
case ID_DRAW_TU3:
InvalidateRect(hWnd,&rectClient,true);
flag3=true;
break;
case ID_DRAW_ALL:
InvalidateRect(hWnd,&rectClient,true);
flag1=flag2=flag2_1=flag3=true;
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
TextOut(hdc,10,10,LPCTSTR("1234"),4);
DRAW1(hdc);
DRAW2(hdc);
DRAW2_1(hdc);
DRAW3(hdc);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}

// “关于”框的消息处理程序。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;

case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
return (INT_PTR)FALSE;
}
void wait(int a)
{
while(a)
{
a--;
}
return;
}
void DRAW1(HDC hdc)
{
if(flag1)
{
HPEN hNewPen,hOldPen;
hNewPen = CreatePen(PS_SOLID,2,RGB(0,0,255));
hOldPen = (HPEN)SelectObject(hdc,hNewPen); 
MoveToEx(hdc,160,240,NULL);
for(int x=160;x<=480;x+=20)
{
LineTo(hdc,  x,120);
LineTo(hdc,480,240);
LineTo(hdc,640-x,360);
LineTo(hdc,160,240);
}
DeleteObject(hNewPen);
flag1=!flag1;
}
}
void DRAW2(HDC hdc)
{
if(flag2)
{
HPEN hNewPen,hOldPen;
hNewPen = CreatePen(PS_SOLID,2,RGB(204,51,0));
hOldPen = (HPEN)SelectObject(hdc,hNewPen); 
int i;
int t;
double x[N],y[N];
double PI=3.14*2/N;
double r=100.0;
for(i=0;i<N;i++)
{
x[i]=r*cos(i*PI)+640;
y[i]=r*sin(i*PI)+140;   
}
MoveToEx(hdc,x[0],y[0],NULL);
for(t=1;t<N;t++)
{
for(i=t;;i=i+t)
{
if(i>N-1)
i=i-N;
if(i<N)
LineTo(hdc,x[i],y[i]);
if(i==0)
break;
}
}
DeleteObject(hNewPen);
flag2=!flag2;
}
}
void DRAW2_1(HDC hdc)
{
if(flag2_1)
{
HPEN hNewPen,hOldPen;
hNewPen = CreatePen(PS_SOLID,2,RGB(204,51,0));
hOldPen = (HPEN)SelectObject(hdc,hNewPen); 
int i,j;
double x[N],y[N];
double PI=3.14*2/N;
double r=100.0;
for(i=0;i<N;i++)
{
x[i]=r*cos(i*PI)+640;
y[i]=r*sin(i*PI)+340;   
}
for(i=0;i<=N-2;i++)
for(j=i+1;j<=N-1;j++)
{
MoveToEx(hdc,x[i],y[i],NULL);
LineTo(hdc,x[j],y[j]); 
}
DeleteObject(hNewPen);
flag2_1=!flag2_1;
}
}
void DRAW3(HDC hdc)
{
if(flag3)
{
int x;
HPEN hNewPen,hOldPen;
HBRUSH hBrush,hOldBrush;
int point1[]={100,0,128,0,48,80,150,80,170,100,0,100,100,0};
int point2[]={0,100,20,120,220,120,128,28,113,43,170,100,0,100};
int point3[]={76,80,128,28,220,120,228,100,128,0,48,80,76,80};


hNewPen = CreatePen(PS_SOLID,1,RGB(255,255,0));//设置画笔2黄
hOldPen = (HPEN)SelectObject(hdc,hNewPen);
hBrush = CreateSolidBrush(RGB(255,0,0));//设置画刷2
hOldBrush = (HBRUSH)SelectObject(hdc,hBrush);
MoveToEx(hdc,point2[0],point2[1],NULL);
for(int i=2;i<14;i+=2)
{
LineTo(hdc,point2[i],point2[i+1]);
}
for(x=0;x<=170;x++)
{
MoveToEx(hdc,x,100,NULL);
LineTo(hdc,x+20,120);
}
for(x=220;x>=190;x--)
{
MoveToEx(hdc,x,120,NULL);
LineTo(hdc,x-92,28);
}


hNewPen = CreatePen(PS_SOLID,1,RGB(0,0,255));//设置画笔3蓝
hOldPen = (HPEN)SelectObject(hdc,hNewPen); 
MoveToEx(hdc,point3[0],point3[1],NULL);
for(int i=2;i<14;i+=2)
{
LineTo(hdc,point3[i],point3[i+1]);
}
for(x=48;x<=76;x++)
{
MoveToEx(hdc,x,80,NULL);
LineTo(hdc,x+66,14);
}
for(x=248;x>=220;x--)
{
MoveToEx(hdc,x,120,NULL);
LineTo(hdc,x-120,0);
}
hNewPen = CreatePen(PS_SOLID,1,RGB(255,255,255));//设置画笔4白色,抹掉多画的一个三角形
hOldPen = (HPEN)SelectObject(hdc,hNewPen); 
hBrush = CreateSolidBrush(RGB(255,255,255));//设置画刷4
hOldBrush = (HBRUSH)SelectObject(hdc,hBrush);
for(x=220;x<=248;x++)
{
MoveToEx(hdc,x,120,NULL);
LineTo(hdc,x+20,100);
}

hNewPen = CreatePen(PS_SOLID,1,RGB(255,0,0));//设置画笔1红
hOldPen = (HPEN)SelectObject(hdc,hNewPen); 
hBrush = CreateSolidBrush(RGB(255,0,0));//设置画刷1
hOldBrush = (HBRUSH)SelectObject(hdc,hBrush);
MoveToEx(hdc,point1[0],point1[1],NULL);
for(int i=2;i<14;i+=2)
{
LineTo(hdc,point1[i],point1[i+1]);
}
for(x=150;x>=48;x--)
{
MoveToEx(hdc,x,80,NULL);
LineTo(hdc,x+20,100);
}
for(x=0;x<=28;x++)
{
MoveToEx(hdc,x,100,NULL);
LineTo(hdc,x+100,0);
}
for(x=28;x<=68;x++)
{
MoveToEx(hdc,x,100,NULL);
LineTo(hdc,x+20,80);
}

DeleteObject(hNewPen);
flag3=!flag3;
}
}

转载请注明