[OpenGL]用鼠标拖拽图形移动

本文介绍了在OpenGL环境下,使用Code::Blocks和GLUT实现通过鼠标拖拽移动图形的计算机图形学实验。文中提到,关键在于捕获鼠标信号和判断点在图形内的算法,但后者未详细展开,只给出了简略的实现代码,存在闪屏问题待优化。
摘要由CSDN通过智能技术生成

今天做计算机图形学实验。题目布置了写程序使图形移动,于是我就写了这个程序。

使用的环境是Code::Blocks + GLUT,Code::Blocks配置GLUT实现OpenGL的教程可以看这篇:

http://blog.csdn.net/yang_7_46/article/details/24674849


想要实现用鼠标拖拽使图形移动,首先需要考虑两个问题:

1.如何接受鼠标产生的信号。

2.如何判断鼠标在图形内。


解决第一个问题,只需要了解到OpenGL中的GLUT给的函数就可以。

glutMouseFunc( (void*)Func(int button, int state, int x, int y) );
如果没
在C语言中实现鼠标拖拽图形需要依赖于特定的图形库,比如Windows API、OpenGL等。以下是在Windows环境下使用Windows API实现鼠标拖拽图形的示例代码: ```c #include <windows.h> LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASS wc = {0}; wc.lpfnWndProc = WndProc; wc.hInstance = hInstance; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wc.lpszClassName = TEXT("MyClass"); if (!RegisterClass(&wc)) return 0; HWND hwnd = CreateWindow(TEXT("MyClass"), TEXT("My Window"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 400, 400, NULL, NULL, hInstance, NULL); if (!hwnd) return 0; ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); MSG msg = {0}; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { static int cxClient, cyClient; static int x, y; static BOOL bDragging = FALSE; switch (msg) { case WM_SIZE: cxClient = LOWORD(lParam); cyClient = HIWORD(lParam); break; case WM_LBUTTONDOWN: x = LOWORD(lParam); y = HIWORD(lParam); if (x >= cxClient / 2 - 50 && x <= cxClient / 2 + 50 && y >= cyClient / 2 - 50 && y <= cyClient / 2 + 50) { bDragging = TRUE; SetCapture(hwnd); } break; case WM_MOUSEMOVE: if (bDragging) { int nx = LOWORD(lParam); int ny = HIWORD(lParam); HDC hdc = GetDC(hwnd); Rectangle(hdc, nx - 50, ny - 50, nx + 50, ny + 50); ReleaseDC(hwnd, hdc); } break; case WM_LBUTTONUP: if (bDragging) { bDragging = FALSE; ReleaseCapture(); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd, msg, wParam, lParam); } return 0; } ``` 该示例代码创建了一个窗口,并在窗口中绘制了一个矩形。当用户点击矩形并拖动时,矩形会跟随鼠标移动。具体实现过程是在`WM_LBUTTONDOWN`消息中设置一个标志`bDragging`表示正在拖拽,然后调用`SetCapture`函数捕捉鼠标消息,接着在`WM_MOUSEMOVE`消息中获取当前鼠标位置,绘制矩形并刷新窗口,最后在`WM_LBUTTONUP`消息中清除标志并释放鼠标捕捉。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值