#include <Windows.h>
#include <stdio.h>
//#include "resource.h"
//#include <afxwin.h>
#include <math.h>
#define TWO_PI (2.0*3.1415926)
LRESULT CALLBACK MyWindowProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
void DrawRectangle(HWND hwnd);
int cxClient,cyClient;
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
HWND hwnd;
WNDCLASS wndclass;
MSG msg;
static TCHAR MyAppName[]=TEXT("My first windows app");
wndclass.style=CS_HREDRAW|CS_VREDRAW;
wndclass.lpfnWndProc=MyWindowProc;
wndclass.cbClsExtra=0;//预留的额外空间
wndclass.cbWndExtra=0;
wndclass.hInstance=hInstance;
wndclass.hIcon=::LoadIcon(NULL,IDI_INFORMATION);
wndclass.hCursor=::LoadCursor(NULL,IDC_ARROW);//::LoadCursor(hInstance,MAKEINTRESOURCE(IDC_CURSOR1));
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName=NULL;
wndclass.lpszClassName=TEXT("My first windows app");
if (!RegisterClass(&wndclass))
{
int i=GetLastError();
//char str[25]={0};
wchar_t chResult[128]={0};
_itow(i,chResult,10);
//sprintf(str,TEXT("%d"),i);
//sprintf(buffer,L"Key State = 0X%X ",key_state);
MessageBox(NULL,chResult,TEXT("Error"),MB_OK);
//AfxMessageBox(TEXT("Error") );
}
hwnd=CreateWindow( MyAppName,
TEXT("My first windows"),
WS_OVERLAPPEDWINDOW|WS_VSCROLL|WS_HSCROLL,
CW_USEDEFAULT ,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,NULL,
hInstance,
NULL
);
ShowWindow(hwnd,SW_SHOWNORMAL);
//ShowWindow(hwnd,iCmdShow);
UpdateWindow(hwnd);
while(TRUE)
{
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
if(msg.message==WM_QUIT)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
DrawRectangle(hwnd);
}
return msg.wParam;
}
LRESULT CALLBACK MyWindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
static HRGN hRgnClip;
//static int cxClient,cyClient;
double fAngle,fRadius;
HCURSOR hCursor;
HDC hdc;
HRGN hRgnTem[6];
int i;
PAINTSTRUCT ps;
switch(uMsg)
{
case WM_SIZE:
cxClient=LOWORD(lParam);
cyClient=HIWORD(lParam);
hCursor=SetCursor(LoadCursor(NULL,IDC_WAIT));
ShowCursor(TRUE);
if (hRgnClip)
{
DeleteObject(hRgnClip);
}
hRgnTem[0]=CreateEllipticRgn(0,cyClient/3,cxClient/2,2*cyClient/3);//创建椭圆区域
hRgnTem[1]=CreateEllipticRgn(cxClient/2,cyClient/3,cxClient,2*cyClient/3);
hRgnTem[2]=CreateEllipticRgn(cxClient/3,0,2*cxClient/3,cyClient/2);
hRgnTem[3]=CreateEllipticRgn(cxClient/3,cyClient/2,2*cxClient/3,cyClient);
hRgnTem[4]=CreateRectRgn(0,0,1,1);//初始化一个矩形区域
hRgnTem[5]=CreateRectRgn(0,0,1,1);
hRgnClip=CreateRectRgn(0,0,1,1);
CombineRgn(hRgnTem[4],hRgnTem[0],hRgnTem[1],RGN_XOR);//合并并赋给hRgnTem[4]
CombineRgn(hRgnTem[5],hRgnTem[2],hRgnTem[3],RGN_XOR);
CombineRgn(hRgnClip,hRgnTem[4],hRgnTem[5],RGN_XOR);
for (i=0;i<6;i++)
{
DeleteObject(hRgnTem[i]);
}
SetCursor(hCursor);
ShowCursor(FALSE);
return 0;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
SetViewportOrgEx(hdc,cxClient/2,cyClient/2,NULL);//将视点坐标移至客户区中心位置
SelectClipRgn(hdc,hRgnClip);//将区域选入DC
fRadius=_hypot(cxClient/2.0,cyClient/2.0);
for (fAngle=0.0;fAngle<TWO_PI;fAngle+=TWO_PI/360)
{
MoveToEx(hdc,0,0,NULL);
LineTo(hdc,(int)(fRadius*cos(fAngle)+0.5),(int)(-fRadius*sin(fAngle)+0.5));
}
EndPaint(hwnd,&ps);
return 0;
case WM_DESTROY:
DeleteObject(hRgnClip);
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
void DrawRectangle(HWND hwnd)
{
RECT rect;
HBRUSH hBrush;
if (cxClient==0||cyClient==0)
{
return;
}
SetRect(&rect,rand()%cxClient,rand()%cyClient,rand()%cxClient,rand()%cyClient);
hBrush=CreateSolidBrush(RGB(rand()%256,rand()%256,rand()%256));
HDC hdc=GetDC(hwnd);
FillRect(hdc,&rect,hBrush);
ReleaseDC(hwnd,hdc);
DeleteObject(hBrush);
}