//-----------------------------------------------------------------------
//
// Name: HelloWorld4 example project
//
// Author: Mat Buckland 2002
//
// Desc: Code to demonstrate basic keyboard handling
//
// NOTE: Don't forget to include the library winmm.lib in your project
// settings.
//------------------------------------------------------------------------
#include <windows.h>
#include <time.h>
#include <math.h>
#include <stdlib.h>
#include "defines.h"
#include "resource.h"
//--------------------------------- Globals ------------------------------
//
//------------------------------------------------------------------------
char* g_szApplicationName = "HelloWorld";
char* g_szWindowClassName = "MyWindowClass";
//准备从每边画出几根线
static int iNumLinesPerSide=NUM_LINES;
//多边形的顶点个数
static int iNumVerts=NUM_VERTS;
//主窗口句柄的全局备份
HWND g_hwnd =NULL;
//--------------------------------- DialogProc ---------------------------
//
//------------------------------------------------------------------------
BOOL CALLBACK OptionsDialogProc(HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam
)
{
//取出编辑控件(edit controls)的句柄
HWND hwndiNumLines=GetDlgItem(hwnd,IDC_EDIT1);
HWND hwndiNumVerts=GetDlgItem(hwnd,IDC_EDIT2);
switch(msg)
{
case WM_INITDIALOG:
{
//使用当前的线数和边数显示在编辑框里
string s=itos(iNumLinesPerSide);
SetWindowText(hwndiNumLines,s.c_str());
s=itos(iNumVerts);
SetWindowText(hwndiNumVerts,s.c_str());
return true;
}
break;
case WM_COMMAND:
{
switch(LOWORD(wParam))
{
case IDOK:
{
//为每一个edit box收集信息,然后相应地改变对应的参数
char buffer[5];
//线数
GetWindowText(hwndiNumLines,buffer,5);
//转换成一个int
iNumLinesPerSide=atoi(buffer);
//多边形边数
GetWindowText(hwndiNumVerts,buffer,5);
//转换成一个int
iNumVerts=atoi(buffer);
//把一客户消息给WindowProc,这样新图形得到了
//PostMessage(g_hwnd,UM_SPAWN_NEW,NULL,NULL);
//撤消对话框
EndDialog(hwnd,0);
return true;
}
break;
}
}
break;
}//结束switch语句
return false;
}
BOOL CALLBACK AboutDialogProc(HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam
)
{
switch(msg)
{
case WM_INITDIALOG:
{
return true;
}
break;
case WM_COMMAND:
{
switch(LOWORD(wParam))
{
case IDOK:
{
EndDialog(hwnd,0);
return true;
}
break;
}
}
break;
}//结束switch语句
return false;
}
//---------------------------- WindowProc ---------------------------------
//
// This is the callback function which handles all the windows messages
//-------------------------------------------------------------------------
LRESULT CALLBACK WindowProc (HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam)
{
//create some pens
HPEN RedPen =CreatePen(PS_SOLID,1,RGB(255,0 ,0 ));
HPEN BluePen =CreatePen(PS_SOLID,1,RGB(0 ,0 ,255));
HPEN GreenPen =CreatePen(PS_SOLID,1,RGB(0 ,255,0 ));
HPEN PurplePen =CreatePen(PS_SOLID,1,RGB(255,0 ,255));
HPEN OldPen =NULL;//OldPen为初始画笔
//create some brush
HBRUSH RedBrush =CreateHatchBrush(HS_DIAGCROSS,RGB(255,0,0));
HBRUSH GreenBrush =CreateHatchBrush(HS_DIAGCROSS,RGB(0,255,0));
HBRUSH OldBrush =NULL;
//用来存放建立的多边形顶点
static POINT verts[NUM_VERTS];
//定义随机函数
//inline int RandInt(int x,int y) {return rand()%(y-x+1)+x;}
//自定义的函数要放在头文件
static int cxClient,cyClient;
//创建back buffeer
static HDC hdcBackBuffer;
static HBITMAP hBitmap;
static HBITMAP hOldBitmap;
static HINSTANCE hInstance;
switch (msg)
{
//A WM_CREATE msg is sent when your application window is first
//created
case WM_CREATE:
{
//取得hInstance
hInstance=((LPCREATESTRUCT)lParam)->hInstance;
PlaySound("window_open.wav", NULL, SND_FILENAME | SND_ASYNC);
RECT rect;
GetClientRect(hwnd,&rect);
cxClient=rect.right;
cyClient=rect.bottom;
//激活一个随机数发生器
srand((unsigned) time(NULL));
//随机创建一些顶点
for(int v=0;v<iNumVerts;v++)
{
verts[v].x=RandInt(0,cxClient);
verts[v].y=RandInt(0,cyClient);
}
//创建后备缓冲区
//先创建一个内存DC
hdcBackBuffer=CreateCompatibleDC(NULL);
//获取前置缓冲区的DC
HDC hdc=GetDC(hwnd);
hBitmap=CreateCompatibleBitmap(hdc,
cxClient,
cyClient);
//将bitmap装入内存DC
hOldBitmap=(HBITMAP)SelectObject(hdcBackBuffer,hBitmap);
//释放DC
ReleaseDC(hwnd,hdc);
}
break;
case WM_KEYUP:
{
switch(wParam)
{
case VK_SPACE:
{
//为多边形随机地创建一些新的顶点
for(int v=0;v<iNumVerts;v++)
{
verts[v].x=RandInt(0,cxClient);
verts[v].y=RandInt(0,cyClient);
}
//进行刷新,可以看到我们的新polygon
InvalidateRect(hwnd,NULL,TRUE);
UpdateWindow(hwnd);
//UpdateWindow(hwnd)将WM_PAINT消息直接发给WindowProc,使窗口更新,创建新的多边形
}
//如果按下了Escape键,就退出程序
// if(GetAsyncKeyState(VK_ESCAPE)) //此函数可以在任何地方来测试按键,不用麻烦消息循环
// PostQuitMessage(0);
break;
case VK_ESCAPE:
{
//如果按下了Escape键,就退出程序
PostQuitMessage(0);
}
break;
}
}
case WM_PAINT:
{
//***********************************************************//
//画图形
for(int v=0;v<iNumVerts;v++)
{
verts[v].x=RandInt(0,cxClient);
verts[v].y=RandInt(0,cyClient);
}
PAINTSTRUCT ps;
BeginPaint(hwnd, &ps);
//用白色填充backbuffer
BitBlt(hdcBackBuffer,
0,
0,
cxClient,
cyClient,
NULL,
NULL,
NULL,
WHITENESS);
//**this is where we do any drawing to the screen**
//draw q point at (200,200)
SetPixel(hdcBackBuffer,200,200,RGB(255,0,0));
//将OldPen选为红笔,作为初始画笔
OldPen=(HPEN)SelectObject(hdcBackBuffer,RedPen);
//将OldBrush选为红画刷,作为初始画刷
OldBrush=(HBRUSH)SelectObject(hdcBackBuffer,RedBrush);
//select a brush
SelectObject(hdcBackBuffer,RedBrush);
//select a pen
SelectObject(hdcBackBuffer,BluePen);
//draw an ellipse at (200,200)
Ellipse(hdcBackBuffer,300,300,500,500);
//根据窗口尺寸计算所画各线的步长(即间距)
int yStep=cyClient/iNumLinesPerSide;
int xStep=cxClient/iNumLinesPerSide;
//下面是画线的代码
for(int mult=1;mult<iNumLinesPerSide;++mult)
{
//select a pen
SelectObject(hdcBackBuffer,RedPen);
MoveToEx(hdcBackBuffer,xStep*mult,0,0);
LineTo(hdcBackBuffer,0,cyClient-yStep*mult);
//select a pen
SelectObject(hdcBackBuffer,GreenPen);
MoveToEx(hdcBackBuffer,xStep*mult,cyClient,0);
LineTo(hdcBackBuffer,cxClient,cyClient-yStep*mult);
//select a pen
SelectObject(hdcBackBuffer,PurplePen);
MoveToEx(hdcBackBuffer,xStep*mult,0,0);
LineTo(hdcBackBuffer,cxClient,yStep*mult);
//select a pen
SelectObject(hdcBackBuffer,BluePen);
MoveToEx(hdcBackBuffer,xStep*mult,cyClient,0);
LineTo(hdcBackBuffer,0,yStep*mult);
}
//select a pen & a brush and draw a polygon
SelectObject(hdcBackBuffer,PurplePen);
SelectObject(hdcBackBuffer,GreenB