c++ 鼠标切换形状

鼠标的不同形状,满足不同需求。

按照网上所说的一种方式为:

::SetCursor(::LoadCursorA(NULL,IDC_ARROW));


但是这种方法只能暂时的变换,移动后又变回原来形状,故采用以下方法:

SetClassLong(m_hWnd,GCL_HCURSOR,(LONG)::LoadCursorA(NULL,IDC_ARROW));


最后一个参数获得的是系统的鼠标形状,场景的有箭头的、等待的、编辑的、十字的(IDC_ARROW、IDC_WAIT、IDC_IBEAM、IDC_CROSS)等。但是还是不够用的情况下可以使用加载鼠标文件。有 *.cur   , *.ani 等。


SetClassLong(m_hWnd,GCL_HCURSOR,(LONG)LoadCursorFromFile(name.c_str()));

在VTK ( Visualization Toolkit ) 中,要实现一个9.3版本的 `vtkCameraOrientationWidget`,将其形状改为正方体并支持六面切换鼠标悬浮高亮,你需要创建自定义的用户交互组件。以下是一个简单的示例代码,使用了 `vtkCubeSource` 创建正方体,并在 `vtkInteractorStyleTrackballCamera` 的基础上添加一些额外的功能: ```cpp #include <vtkSmartPointer.h> #include <vtkCubeSource.h> #include <vtkRenderWindow.h> #include <vtkRenderer.h> #include <vtkRenderWindowInteractor.h> #include <vtkInteractorStyleTrackballCamera.h> #include <vtkActor.h> #include <vtkProperty.h> #include <vtkTexturedActor.h> #include <vtkCursor3D.h> // 自定义相机方向控件类 class CustomCameraOrientationWidget : public vtkInteractorStyleTrackballCamera { public: void OnMouseMove(double x, double y) override { // 鼠标悬浮时高亮 if (!IsCursorVisible()) return; // 获取当前光标位置对应的相机旋转角度 // ... ( 根据屏幕坐标计算相机旋转 ) UpdateCamera(); } void OnLeftButtonPressEvent(double x, double y) override { // 点击六个面切换视角 switch (GetClickedFace(x, y)) { case VTK_CUBE_FACE_XMIN: // 设置新的相机方向(X轴最小) // ... ( 更新相机方向 ) break; // 其他五个面的处理类似 } } private: int GetClickedFace(double x, double y) { // 实现根据鼠标位置判断点击的是哪个立方体面 // ... ( 这部分依赖于你的窗口布局和正方体的大小 ) } }; int main(int argc, char* argv[]) { vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New(); renWin->SetSize(800, 600); // 创建渲染器 vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New(); renWin->AddRenderer(renderer); // 创建立方体贴图源 vtkSmartPointer<vtkCubeSource> cubeSource = vtkSmartPointer<vtkCubeSource>::New(); cubeSource->SetXLength(0.5); cubeSource->SetYLength(0.5); cubeSource->SetZLength(0.5); // 创建纹理演员 vtkSmartPointer<vtkTexture> texture = vtkSmartPointer<vtkTexture>::New(); texture->SetInputConnection(cubeSource->GetOutputPort()); texture->InterpolateOn(); // 将纹理应用到立方体上 vtkSmartPointer<vtkActor> texturedActor = vtkSmartPointer<vtkActor>::New(); texturedActor->SetMapper(vtkSmartPointer<vtkPolyDataMapper>::New(cubeSource->GetOutput())); texturedActor->SetTexture(texture); renderer->AddActor(texturedActor); // 添加自定义相机方向控制 CustomCameraOrientationWidget* widget = new CustomCameraOrientationWidget(); renWin->Interactor()->SetInteractorStyle(widget); // 显示并启动交互 renWin->Render(); renWin->GetInteractor()->Start(); return 0; } ``` 注意:这个代码只是一个基础框架,具体的细节如计算相机旋转、确定点击面的位置等需要你自己完成。这涉及到窗口布局和窗口事件处理,可能会比较复杂。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

思依_xuni

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值