转的高鑫的。
#include <windows.h>
#include <math.h>
#define NUM 10
struct own_rectangle
{
int xLeft ;
int xRight ;
int yTop ;
int yBottom ;
}rect[NUM];
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT("GDI:矩形颜色变换");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
wndclass.lpszClassName = szAppName;
wndclass.lpszMenuName = NULL;
if (!RegisterClass(&wndclass))
{
MessageBox(NULL, TEXT("Program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0;
}
hwnd = CreateWindow (szAppName, TEXT("Piano Demo Using Mouse"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL) ;
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd);
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static int cxClient, cyClient;
static int Flag[NUM] ={0,0,0,0,0,0,0,0,0,0};
HDC hdc;
static int i = 0,j; //注意static
PAINTSTRUCT ps; //ps数组里面存放了RECT,用来重绘客户区的位置
POINT hitPoint;
int xStart = 200, yStart = 100, xEnd = 100, yEnd = 300;
//HBRUSH hBrush;
HPEN hPen;
switch (message)
{
case WM_SIZE:
cxClient = LOWORD(lParam);
cyClient = HIWORD(lParam);
return 0;
case WM_MOUSEMOVE:
hitPoint.x = LOWORD(lParam);
hitPoint.y = HIWORD(lParam);
for (i = 0; i < NUM; i++)
{
if (hitPoint.x >= rect[i].xLeft && hitPoint.x <= rect[i].xRight && hitPoint.y >= rect[i].yTop && hitPoint.y <= rect[i].yBottom )
{
Flag[i] = 1;
InvalidateRect(hwnd, NULL, TRUE);
//该函数向指定的窗口添加一个矩形。然后窗口客户区的这一部分将被重绘。为NULL,全部的窗口客户区域将被增加到更新区域中。
break;
}
}
if (NUM == i)
InvalidateRect(hwnd, NULL, TRUE); // 这两句确保光标不在矩形区域时能捕捉到信息的改变
return 0;
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps);
hPen = CreatePen (PS_SOLID, 1, RGB(255,0,0));
SelectObject (hdc, hPen);
//hBrush = (HBRUSH)GetStockObject (GRAY_BRUSH);
rect[0].xLeft = 400 ;
rect[0].xRight = 420 ;
rect[0].yTop = 210 ;
rect[0].yBottom = 300 ;
Rectangle(hdc, rect[0].xLeft, rect[0].yTop, rect[0].xRight, rect[0].yBottom);
for (j = 1; j < NUM; j++)
{
rect[j].xLeft = rect[j-1].xLeft + 20 ;
rect[j].xRight = rect[j-1].xRight + 20 ;
rect[j].yTop = rect[0].yTop ;
rect[j].yBottom = rect[0].yBottom ;
Rectangle(hdc, rect[j].xLeft, rect[j].yTop, rect[j].xRight, rect[j].yBottom);
}
if (Flag[i] == 1)
{
SelectObject(hdc, (HBRUSH)GetStockObject (GRAY_BRUSH));
Rectangle(hdc, rect[i].xLeft, rect[i].yTop, rect[i].xRight, rect[i].yBottom);
}
else if (NUM == i)
{
SelectObject(hdc, (HBRUSH)GetStockObject (WHITE_BRUSH));
Rectangle(hdc, rect[i].xLeft, rect[i].yTop, rect[i].xRight, rect[i].yBottom);
}
DeleteObject(hPen);
EndPaint(hwnd, &ps);
return 0;
case WM_DESTROY:
PostQuitMessage (0);
return 0;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
