#include <windows.h>
#include <tchar.h>
#include <math.h>
#include "resource.h" //资源头文件
#pragma comment (lib,"msimg32.lib")
HINSTANCE hInst;
TCHAR szClassName[256] = "MyClass";
void ShowMirror(HDC hDC, RECT rect, COLORREF penColor, COLORREF brushColor );
//COLORREF BKCOLOR = RGB(150,150,150);
enum WHATTODO { DRAW_LINE, DRAW_RECT,DRAW_CIRCLE};
LRESULT CALLBACK WndProc(HWND ,UINT , WPARAM , LPARAM );
int __stdcall WinMain(HINSTANCE hInstance, //应用程序实例句柄
HINSTANCE hPrvInstance, //忽略
LPSTR lpCmdLine, //命令行
int nShowCmd) //窗口起始形态如(最大化,最小化)
{
HWND hWnd;
MSG message;
WNDCLASSEX wndClassEx; //定义注册窗口类结构
//填充窗口类信息
wndClassEx.cbSize = sizeof(WNDCLASSEX);
wndClassEx.style = CS_HREDRAW|CS_VREDRAW; //窗口类的风格
wndClassEx.hInstance = hInstance; //此窗口类所属的应用程序的实例句柄
wndClassEx.lpfnWndProc = (WNDPROC)WndProc; //属于该窗口类的窗口过程函数指针
wndClassEx.hbrBackground = (HBRUSH) (GetStockObject(WHITE_BRUSH)); //取得一只window预定义的画刷,用于窗口背景颜色
wndClassEx.hIcon = ::LoadIcon( NULL,(LPCTSTR)IDI_ERROR); //取得32位的图标资源
wndClassEx.hIconSm = ::LoadIcon( NULL,(LPTSTR)IDI_ERROR); //取得16位的图标资源
wndClassEx.hCursor = ::LoadCursor( NULL,IDC_ARROW); //取得系统的光标
wndClassEx.cbClsExtra = 0; //额外的信息,可忽略
wndClassEx.cbWndExtra = 0; //额外的信息,可忽略
wndClassEx.lpszClassName = szClassName; //注册的窗口类名
wndClassEx.lpszMenuName = (LPCTSTR)(IDR_MENU); //窗口的菜单句柄
hInst = hInstance;
RegisterClassEx(&wndClassEx); //注册窗口类
hWnd = CreateWindow( //建立窗口
szClassName, //建立窗口的所属窗口类
"hello", //标题栏题头
WS_OVERLAPPEDWINDOW, //窗口风格
CW_USEDEFAULT, //窗口在屏幕的X轴坐标
CW_USEDEFAULT, //窗口在屏幕的Y轴坐标
CW_USEDEFAULT, //窗口的宽度
CW_USEDEFAULT, //窗口的高度
NULL, //所从属的父窗口的窗口句柄
NULL, //菜单句柄
hInstance, //此窗口所属应用程序实例句柄
NULL); //忽略
if ( hWnd == NULL ) //窗口建立失败
{
MessageBox(NULL,"窗口建立失败","提示",MB_OK);
return -1;
}
ShowWindow(hWnd,nShowCmd); //显示窗口
UpdateWindow(hWnd); //更新窗口
//进入消息循环
while( GetMessage(&message,NULL,NULL,NULL) ) //从消息队列中取消息,
//当取到WM_QUIT消息时返回 0 ,消息循环结束,程序结束
{
DispatchMessage(&message); //派发消息,windows取得控制权,将消息发往
//相应窗口的窗口过程
}
return 0;
}
/*************************************************************************************
窗口过程函数
LRESULT ===> unsigned int 一个32位整形变量,用于表示返回的结果
CALLBACK ===> __stdcall 表示回调函数
回调函数就是有程序员编写,但你不能调用它,而必须由windows调用
hWnd --->表示响应消息的窗口的句柄
msg --->表示何种消息 如 WM_MOUSEMOVE, WM_PAINT, WM_DESTROY,WM_COMMAND
wParam,lParam ---->两个32位无类型的值 表示消息参数
对于不同的消息,消息参数表示不同的内容
如对于 WM_MOUSEMOVE 消息, lParam 的低16位表示鼠标X方向坐标,高16位表示鼠标Y方向坐标
**************************************************************************************/
LRESULT CALLBACK WndProc(HWND hWnd,UINT msg, WPARAM wParam, LPARAM lParam)
{
static HBITMAP hBitMap;
static HBITMAP hPersonBitMap[10];
static HDC hBuffDC;
static HBITMAP hBuffBitMap;
static int whoToShow = 0;
static bool erasFlag = true;
HDC hdc;
PAINTSTRUCT paintStruct;
// INT wmId, wmEvent;
switch ( msg )
{
case WM_CREATE:
hBitMap = ::LoadBitmap( hInst,MAKEINTRESOURCE(IDB_BITMAP) );
{
for (int i = 0 ; i < 10 ; i ++ )
{
hPersonBitMap[i] = ::LoadBitmap(hInst,
MAKEINTRESOURCE(IDB_BITMAP2+i));
}
}
if( hBitMap == NULL )
{
::MessageBox(NULL,"ERROR ON OPEN BITMP","TS",MB_OK);
}
hBuffBitMap = ::LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP));
hBuffDC = ::CreateCompatibleDC(NULL);
SelectObject(hBuffDC,hBuffBitMap);
break;
case WM_COMMAND: //命令相应消息
break;
case WM_LBUTTONDOWN:
{
static bool flag = true;
if ( flag )
{
SetTimer(hWnd,0,10,NULL);
flag = false;
}
else
{
::KillTimer(hWnd,0);
flag = true;
}
break;
}
case WM_LBUTTONUP:
{
break;
}
case WM_RBUTTONDOWN:
{
}
break;
case WM_MOUSEMOVE:
{
break;
}
case WM_TIMER:
{
static int index = 0;
static RECT oldRect;
static RECT curRect = {60,60 };
static bool first = true;
HDC hdc = GetDC(hWnd);
HDC hMemDC = ::CreateCompatibleDC(hdc);
RECT rectClient ;
GetClientRect(hWnd,&rectClient);
SelectObject( hMemDC, hBitMap );
::BitBlt(hBuffDC,0,0,rectClient.right,rectClient.bottom,hMemDC,
0,0,SRCCOPY);
BITMAP bitMap;
GetObject(hPersonBitMap[index],sizeof(BITMAP),&bitMap);
SelectObject(hMemDC,hPersonBitMap[index++]);
curRect.top+= 1;
curRect.left+=2;
if( curRect.left >= rectClient.right || curRect.top >= curRect.bottom)
{
curRect.left = 60;
curRect.top = 60;
}
curRect.right = curRect.left + bitMap.bmWidth;
curRect.bottom = curRect.top + bitMap.bmHeight;
::TransparentBlt(hBuffDC,curRect.left,curRect.top,
bitMap.bmWidth,bitMap.bmHeight,hMemDC,0,0,bitMap.bmWidth,
bitMap.bmHeight,RGB(255,255,255));
::BitBlt(hdc,0,0,rectClient.right,rectClient.bottom,hBuffDC,
0,0,SRCCOPY);
if ( index == 10 )
{
index = 0;;
}
oldRect = curRect;
DeleteDC(hMemDC);
::ReleaseDC(hWnd,hdc);
break;
}
case WM_PAINT:
{
hdc = BeginPaint(hWnd,&paintStruct); // 取得设备上下文
RECT rectClient ;
GetClientRect(hWnd,&rectClient);
HDC hMemDC = ::CreateCompatibleDC(hdc);
HBITMAP hPerBitMap;
hPerBitMap = ::LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP2));
BITMAP bitMap;
GetObject(hPerBitMap,sizeof(BITMAP),&bitMap);
SelectObject(hMemDC,hPerBitMap);
::TransparentBlt(hBuffDC,60,60,
bitMap.bmWidth,bitMap.bmHeight,hMemDC,0,0,bitMap.bmWidth,
bitMap.bmHeight,RGB(255,255,255));
::BitBlt(hdc,0,0,rectClient.right,rectClient.bottom,hBuffDC,
0,0,SRCCOPY);
EndPaint(hWnd,&paintStruct);
}
break;
case WM_DESTROY:
//发送WM_QUIT消息
::KillTimer(hWnd,0);
::DeleteObject(hBitMap);
{