实现三角形沿一条斜线下滑,并在下滑的过程中逆时钟旋转三角形 从窗口客户区的左上角向右下角下滑,在下滑过程中,三角形做逆时钟旋转,到达右下角时,正好以一条底边和客户区边框重合并停止,在改变窗口大小时,停止三角形的下落,重新从左上角开始下落。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 #include <windows.h>#include <math.h>#define PI 3.1415926#define ID_TIMER 1000LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);void DrawTriangle(HDC hdc,int r,int angle);int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR szCmdLine,int iCmdShow){ static TCHAR szAppName[] = TEXT("Triangle"); 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(BLACK_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = szAppName; if (!RegisterClass (&wndclass)) { MessageBox(NULL,TEXT("窗口类注册失败!"),szAppName,MB_ICONERROR); return 0; } hWnd = CreateWindow(szAppName,TEXT("旋转的三角形"), 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){ HDC hdc,hMem; HBITMAP hBitmap; PAINTSTRUCT ps; RECT rect; BOOL back; static int r,angle; static POINT pos; static int width,height; static double grade; switch ( message ) { case WM_SIZE: GetClientRect(hWnd,&rect); width = rect.right - rect.left; height = rect.bottom - rect.top; r = (int)(sqrt(pow((double)width,2.0) + pow((double)height,2.0)) / 20.0); angle = 0; grade = atan((double)height / width); pos.x = pos.y = r; return 0; case WM_CREATE: SetTimer(hWnd,ID_TIMER,100,NULL); return 0; case WM_TIMER: angle = (angle + 20) % 360; pos.x += r * 0.5 * cos(grade); pos.y += r * 0.5 * sin(grade); InvalidateRect(hWnd,NULL,FALSE); return 0; case WM_PAINT: hdc = BeginPaint(hWnd,&ps); GetClientRect(hWnd,&rect); hBitmap = CreateCompatibleBitmap(hdc,width,height); hMem = CreateCompatibleDC(hdc); SelectObject(hMem,hBitmap); SelectObject(hMem,GetStockObject(BLACK_BRUSH)); Rectangle(hMem,rect.left,rect.top,rect.right,rect.bottom); SetMapMode(hMem,MM_ANISOTROPIC); SetViewportExtEx(hMem,width,height,NULL); SetWindowExtEx(hMem,width,-height,NULL); back = FALSE; if (pos.x + r * 0.866 > width || pos.y + r * 0.5 > height) { //pos.x = width - r * 0.866; //pos.y = height - r * 0.5; angle = 0; back = TRUE; } SetViewportOrgEx(hMem,pos.x,pos.y,NULL); DrawTriangle(hMem,r,angle); SetMapMode(hMem,MM_TEXT); SetViewportOrgEx(hMem,0,0,NULL); BitBlt(hdc,0,0,width,height,hMem,0,0,SRCCOPY); DeleteDC(hMem); DeleteObject(hBitmap); EndPaint(hWnd,&ps); if (back) { pos.x = pos.y = r; angle = 0; Sleep(500); } return 0; case WM_DESTROY : PostQuitMessage(0); return 0; } return DefWindowProc(hWnd,message,wParam,lParam);}void DrawTriangle(HDC hdc,int r,int angle){ POINT A,B,C; HPEN hPen; HBRUSH hBrush; A.x = (long)(r * cos(((90 + angle) % 360) * PI / 180)); A.y = (long)(r * sin(((90 + angle) % 360) * PI / 180)); B.x = (long)(r * cos(((210 + angle) % 360) * PI / 180)); B.y = (long)(r * sin(((210 + angle) % 360) * PI / 180)); C.x = (long)(r * cos(((330 + angle) % 360) * PI / 180)); C.y = (long)(r * sin(((330 + angle) % 360) * PI / 180)); hPen = CreatePen(PS_SOLID,1,RGB(255,255,0)); hBrush = CreateSolidBrush(RGB(255,255,0)); SelectObject(hdc,hPen); SelectObject(hdc,hBrush); MoveToEx(hdc,A.x,A.y,NULL); LineTo(hdc,B.x,B.y); LineTo(hdc,C.x,C.y); LineTo(hdc,A.x,A.y); FloodFill(hdc,0,0,RGB(255,255,0)); DeleteObject(SelectObject(hdc,GetStockObject(WHITE_BRUSH))); DeleteObject(SelectObject(hdc,GetStockObject(GRAY_BRUSH)));} 树控件的查询与插入 如何生成用于编译 代理/占位dll的mk文件 结构化异常处理和C++类 Timer事件需要一个句柄,来接收消息。是什么意思呢? 两个奇怪搞不懂的小问题答了者必20分,0.9 图片数据库保存? 怎样获得浮点数的内存表示?急。。。。。。。。。。 没人帮我解决我就跳楼了 怎么样可以使在Onsize时窗口不动,松开鼠标后,窗口才调整? 初学求助 编译错误,导致在Release下不能运行.求助 像win自带的画图程序里面,可以用鼠标拖动选择相应的矩形区域的控件事什么?(高分100!顶的也有份!)
#include <windows.h>
#include <math.h>#define PI 3.1415926
#define ID_TIMER 1000LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
void DrawTriangle(HDC hdc,int r,int angle);int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR szCmdLine,int iCmdShow)
{
static TCHAR szAppName[] = TEXT("Triangle");
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(BLACK_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName; if (!RegisterClass (&wndclass))
{
MessageBox(NULL,TEXT("窗口类注册失败!"),szAppName,MB_ICONERROR);
return 0;
} hWnd = CreateWindow(szAppName,TEXT("旋转的三角形"),
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)
{
HDC hdc,hMem;
HBITMAP hBitmap;
PAINTSTRUCT ps;
RECT rect;
BOOL back;
static int r,angle;
static POINT pos;
static int width,height;
static double grade;
switch ( message )
{
case WM_SIZE:
GetClientRect(hWnd,&rect);
width = rect.right - rect.left;
height = rect.bottom - rect.top;
r = (int)(sqrt(pow((double)width,2.0) + pow((double)height,2.0)) / 20.0);
angle = 0;
grade = atan((double)height / width);
pos.x = pos.y = r;
return 0;
case WM_CREATE:
SetTimer(hWnd,ID_TIMER,100,NULL);
return 0;
case WM_TIMER:
angle = (angle + 20) % 360;
pos.x += r * 0.5 * cos(grade);
pos.y += r * 0.5 * sin(grade);
InvalidateRect(hWnd,NULL,FALSE);
return 0; case WM_PAINT:
hdc = BeginPaint(hWnd,&ps);
GetClientRect(hWnd,&rect);
hBitmap = CreateCompatibleBitmap(hdc,width,height);
hMem = CreateCompatibleDC(hdc);
SelectObject(hMem,hBitmap); SelectObject(hMem,GetStockObject(BLACK_BRUSH));
Rectangle(hMem,rect.left,rect.top,rect.right,rect.bottom); SetMapMode(hMem,MM_ANISOTROPIC);
SetViewportExtEx(hMem,width,height,NULL);
SetWindowExtEx(hMem,width,-height,NULL); back = FALSE;
if (pos.x + r * 0.866 > width || pos.y + r * 0.5 > height)
{
//pos.x = width - r * 0.866;
//pos.y = height - r * 0.5;
angle = 0;
back = TRUE;
}
SetViewportOrgEx(hMem,pos.x,pos.y,NULL); DrawTriangle(hMem,r,angle); SetMapMode(hMem,MM_TEXT);
SetViewportOrgEx(hMem,0,0,NULL); BitBlt(hdc,0,0,width,height,hMem,0,0,SRCCOPY); DeleteDC(hMem);
DeleteObject(hBitmap);
EndPaint(hWnd,&ps);
if (back)
{
pos.x = pos.y = r;
angle = 0;
Sleep(500);
}
return 0; case WM_DESTROY :
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd,message,wParam,lParam);
}void DrawTriangle(HDC hdc,int r,int angle)
{
POINT A,B,C;
HPEN hPen;
HBRUSH hBrush; A.x = (long)(r * cos(((90 + angle) % 360) * PI / 180));
A.y = (long)(r * sin(((90 + angle) % 360) * PI / 180)); B.x = (long)(r * cos(((210 + angle) % 360) * PI / 180));
B.y = (long)(r * sin(((210 + angle) % 360) * PI / 180)); C.x = (long)(r * cos(((330 + angle) % 360) * PI / 180));
C.y = (long)(r * sin(((330 + angle) % 360) * PI / 180)); hPen = CreatePen(PS_SOLID,1,RGB(255,255,0));
hBrush = CreateSolidBrush(RGB(255,255,0));
SelectObject(hdc,hPen);
SelectObject(hdc,hBrush); MoveToEx(hdc,A.x,A.y,NULL);
LineTo(hdc,B.x,B.y);
LineTo(hdc,C.x,C.y);
LineTo(hdc,A.x,A.y);
FloodFill(hdc,0,0,RGB(255,255,0)); DeleteObject(SelectObject(hdc,GetStockObject(WHITE_BRUSH)));
DeleteObject(SelectObject(hdc,GetStockObject(GRAY_BRUSH)));
}