VC实现鼠标移动对话框窗口
- 格式:doc
- 大小:554.00 KB
- 文档页数:6
计算机系列教学文档------VC实现鼠标移动对话框窗口
VC实现鼠标移动对话框窗口
本实例主要实现了通过鼠标的移动,来实现窗口的同步移动。
即鼠标左键按下后并对鼠标进行移动,从而窗口跟随鼠标移动,直到鼠标左键抬起,其具体思路是重载“WM_NCHITTEST”消息,在生成的“OnNcHitTest”函数中添加鼠标移动时窗口随之移动的代码,具体实现步骤如下:
在所要移动的窗口类上面,点击鼠标右键,选择“Add Windows Message Handler…”如图所示:
在弹出的窗口中选择“WM_NCHITTEST”消息,如下图所示:
此时双击“WM_NCHITTEST”消息,或点击“AddHandler”接钮,添加到已经存在的消息列表中,如下图所示:
如果“WM_NCHITTEST”消息已经成功加入列已经存在的消息列表中,则点击“Add and Edit”按钮,如下图所示:
此时系统会自动生成对“WM_NCHITTEST”消息的映射函数(函数名为:OnNcHitTest),如下图所示:
最后,在刚刚生成的OnNcHitTest函数中添加窗口的移动代码,代码如下所示:
至此,窗口的移动已经实现。
VC 模拟鼠标和键盘输入 - 天下 - 博客频道 -模拟鼠标点击:1、这里是鼠标左键按下和松开两个事件的组合即一次单击:mouse_event (MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 )2、模拟鼠标右键单击事件:mouse_event (MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0 )3、两次连续的鼠标左键单击事件构成一次鼠标双击事件:mouse_event (MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 )mouse_event (MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 )4、使用绝对坐标MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, 500, 500, 0, 0需要说明的是,如果没有使用MOUSEEVENTF_ABSOLUTE,函数默认的是相对于鼠标当前位置的点,如果dx,和dy,用0,0表示,这函数认为是当前鼠标所在的点--直接设定绝对坐标并单击mouse_event(MOUSEEVENTF_LEFTDOWN, X * 65536 / 1024, Y * 65536 / 768, 0, 0);mouse_event(MOUSEEVENTF_LEFTUP, X * 65536 / 1024, Y * 65536 / 768, 0, 0);其中X,Y分别是你要点击的点的横坐标和纵坐标模拟键盘输入:[cpp]void EnterString(const char* text) { bool bShift = false; size_t length = strlen(text);for(size_t index = 0;index < length;index++) { int val = text[index];if(val >= 97 && val <= 122) //小写a-z {val -= 32; bShift = false; } else if(val>= 65 && val <= 90) //大写A-Z { bShift = true;} else if(val >= 48 && val <= 57) //数字0-9 { bShift = false; } else //特殊符号{ switch(val) { case '`':val = 192; bShift = false;break; case '~': val = 192;bShift = true; break; case '!':val = '1'; //!和1在同一个键盘,使用同一个键盘码,以下相同bShift = true; break; case '@': val = '2'; //@和2在同一个键盘,使用同一个键盘码,以下相同bShift = true; break; case '#': val = '3'; bShift = true;break; case '$': val = '4';bShift = true; break; case '%':val = '5'; bShift = true;break; case '^': val = '6';bShift = true; break; case '&':val = '7'; bShift = true;break; case '*': val = '8';bShift = true; break; case '(':val = '9'; bShift = true;break; case ')': val = '0';bShift = true; break; case '-':val = 189; bShift = false;break; case '=': val = 187;bShift = false; break; case '_':val = 189; bShift = true;break; case '+': val = 187;bShift = true; break; case '[':val = 219; bShift = false;break; case '{': val = 219;bShift = true; break; case ']':val = 221; bShift = false;break; case '}': val = 221;bShift = true; break; case '\\':val = 220; bShift = false;break; case '|': val = 220;bShift = true; break; case ';':val = 186; bShift = false;break; case ':': val = 186;bShift = true; case '\'': val = 222; bShift = false; break; case'\"': val = 222; bShift = true;break; case ',': val = 188;bShift = false; break; case '<': val = 188; bShift = true;break; case '.': val = 190;bShift = false; break; case '>':val = 190; bShift = true;break; case '/': val = 191;bShift = false; break; case '?':val = 191; bShift = true;break; default: break;} } if(bShift)keybd_event(VK_SHIFT,0,0,0); keybd_event(val,0,0,0);keybd_event(val,0,KEYEVENTF_KEYUP,0); if(bShift)keybd_event(VK_SHIFT,0,KEYEVENTF_KEYUP,0); } }但是要注意,如果用户默认是中文输入法,那我们得先想办法切换到英文输入法才行。
移动标准窗口是通过用鼠标单击窗口标题条来实现的,但对于没有标题条的窗口,就需要用鼠标单击窗口标题条以外区域来移动窗口。
有两种方法可以达到这一目标。
方法一:当窗口确定鼠标位置时,Windows向窗口发送WM_NCHITTEST消息,可以处理该消息,使得只要鼠标在窗口内,Windows便认为鼠标在标题条上。
这需要重载CWnd类处理WM_NCHITTEST消息的OnNcHitTest函数,在函数中调用父类的该函数,如果返回HTCLIENT,说明鼠标在窗口客户区内,使重载函数返回HTCAPTION,使Windows误认为鼠标处于标题条上。
下例是使用该方法的实际代码:UINT CEllipseWndDlg::OnNcHitTest(CPoint point){// 取得鼠标所在的窗口区域UINT nHitTest = CDialog::OnNcHitTest(point);// 如果鼠标在窗口客户区,则返回标题条代号给Windows// 使Windows按鼠标在标题条上类进行处理,即可单击移动窗口return (nHitTest==HTCLIENT) ? HTCAPTION : nHitTest;}方法二:当用户在窗口客户区按下鼠标左键时,使Windows认为鼠标是在标题条上,即在处理WM_LBUTTONDOWN消息的处理函数OnLButtonDown中发送一个wParam参数为HTCAPTION,lParam为当前坐标的WM_NCLBUTTONDOWN消息。
下面是使用该方法的实际代码:void CEllipseWndDlg::OnLButtonDown(UINT nFlags, CPoint point){// 调用父类处理函数完成基本操作CDialog::OnLButtonDown(nFlags, point);// 发送WM_NCLBUTTONDOWN消息// 使Windows认为鼠标在标题条上PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x, point.y)); //或SendMessage(WM_SYSCOMMAND,0xF012,0); //0xF012 = SC_MOVE | HTCAPTION}首先,看看在正常情况下系统是怎样来移动程序窗口的。
WinCC鼠标事件实现弹窗跟随鼠标的功能的具体方法在WinCC(Windows Control Center)中实现弹窗跟随鼠标的功能,你需要结合WinCC的脚本功能和C++编程知识。
下面是一个基本的步骤和示例代码,但请注意,实际的操作可能需要根据WinCC的版本和配置进行调整。
1.定义弹窗的位置变量:首先,你需要定义一个变量来存储弹窗的位置。
这个变量应该是一个结构,包含x和y坐标。
2.使用鼠标事件更新位置:当鼠标移动时,触发一个事件或过程,这个事件或过程将更新上述位置变量的值。
3.动态显示弹窗:使用WinCC的脚本功能,根据位置变量的值动态地显示和隐藏弹窗。
以下是一个简化的C++示例代码,演示了如何根据鼠标位置显示一个弹窗:#include "windows.h"#include "mmsystem.h"#include "WinCC.h"// 定义弹窗的位置结构struct PopupPosition {double x;double y;};// 获取当前鼠标位置并更新弹窗位置void UpdatePopupPosition(PopupPosition& popupPos) {POINT cursorPos;GetCursorPos(&cursorPos);popupPos.x = cursorPos.x;popupPos.y = cursorPos.y;}// 显示弹窗函数void ShowPopup() {// 此处应该有显示弹窗的代码,例如使用WinCC的API函数}// 隐藏弹窗函数void HidePopup() {// 此处应该有隐藏弹窗的代码,例如使用WinCC的API函数}int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {// 初始化WinCC和相关资源...PopupPosition popupPos;while (true) { // 主循环UpdatePopupPosition(popupPos); // 获取并更新鼠标位置ShowPopup(); // 根据位置显示弹窗Sleep(100); // 休眠一段时间,例如100毫秒,控制更新频率HidePopup(); // 隐藏弹窗}return 0;}这个示例是非常基础的,并且可能需要根据你的具体需求进行调整。
目标实现像迅雷那样炫酷的悬浮窗。
计划&方案首先第一步要实现一个悬浮窗,窗体无边框,能够随意拖动。
对于一个窗体来说,只有我们把鼠标放到标题栏中才进入到拖拽模式。
由于是无边框的窗体,默认是不能够移动的。
我们尝试用两种办法使其跟随鼠标移动。
一个是用OnNcHitTest函数,另一个是在OnLButtonDown时发消息。
实践一、 OnNcHitTest方案这个CWnd类的一个方法,我们可以捕捉鼠标点击的坐标,然后将其HTCLIENT结果偷换成HTCAPTION,这样就可以让系统误以为鼠标左键点击的是标题栏,就进入了拖拽模式了。
官网参考点这里。
代码十分简单,只需要重载OnNcHitTest就可以。
代码填加三处:1. 头文件afx_msg LRESULT OnNcHitTest(CPoint pt);2. 注册消息BEGIN_MESSAGE_MAP(CAfloatWindowDlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_WM_NCHITTEST()END_MESSAGE_MAP()3. 函数编写LRESULT CAfloatWindowDlg::OnNcHitTest(CPoint pt){LRESULT nHitTest = CDialog::OnNcHitTest(pt);if(nHitTest == HTCLIENT){nHitTest = HTCAPTION;}return nHitTest;}二、 OnLButtonDown方案在程序获得左键按下的状态时,发送以下任一系统消息都可以实现悬浮窗的拖拽。
1.SendMessage(WM_SYSCOMMAND, SC_MOVE | HTCAPTION, 0);2.PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x,point.y));三、无边框窗体Dialog属性中,将Border的属性设为None。
C语言鼠标操作方法及源码C语言不是直接支持鼠标操作的,因为C语言是一种面向过程的编程语言,主要用于系统级编程和应用程序开发。
而鼠标操作通常是通过操作系统提供的图形界面库来实现的,如Windows中的WinAPI或Linux中的X窗口系统等。
在C语言中,可以使用图形界面库或API来实现鼠标操作。
以下是一个使用WinAPI实现鼠标操作的例子:```c#include <windows.h>LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)switch (uMsg)case WM_MOUSEMOVE:int xPos = LOWORD(lParam);int yPos = HIWORD(lParam);//处理鼠标移动事件printf("鼠标移动到坐标 (%d, %d)\n", xPos, yPos);break;}case WM_LBUTTONDOWN:int xPos = LOWORD(lParam);int yPos = HIWORD(lParam);//处理鼠标左键按下事件printf("鼠标左键按下,坐标 (%d, %d)\n", xPos, yPos); break;}case WM_LBUTTONUP:int xPos = LOWORD(lParam);int yPos = HIWORD(lParam);//处理鼠标左键松开事件printf("鼠标左键松开,坐标 (%d, %d)\n", xPos, yPos); break;}//其他鼠标事件的处理...}return DefWindowProc(hwnd, uMsg, wParam, lParam);int main//创建窗口HWND hwnd;WNDCLASS wc = {0};wc.lpfnWndProc = WindowProc;wc.hInstance = GetModuleHandle(NULL);wc.lpszClassName = TEXT("MyWindowClass");RegisterClass(&wc);hwnd = CreateWindowEx(0, TEXT("MyWindowClass"), TEXT("C语言鼠标操作示例"), WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, NULL, NULL,wc.hInstance, NULL);ShowWindow(hwnd, SW_SHOWDEFAULT);}//消息循环MSG msg;while (GetMessage(&msg, NULL, 0, 0))TranslateMessage(&msg);DispatchMessage(&msg);}return 0;```以上代码演示了一个简单的C语言程序,通过使用WinAPI,实现了基本的鼠标操作。
C#⿏标移动Winform窗体内或者panel容器内的控件显⽰虚线实现虚线框来确定位置C# ⿏标移动WinForm窗体或者panel容器内的控件移动虚线/实现虚线框来确定位置1.⽤到的⽅法介绍今天,根据领导指⽰指导移动容器内的控件,⽣成虚线框,使⽤ControlPaint.DrawReversibleFrame1//2// 摘要:3// 在屏幕上的指定边界内,按指定背景⾊绘制处于指定状态的可逆框架。
4//5// 参数:6// rectangle:7// 代表要绘制矩形的尺⼨的 System.Drawing.Rectangle(采⽤屏幕坐标)。
8//9// backColor:10// 框架的背景的 System.Drawing.Color。
11//12// style:13// System.Windows.Forms.FrameStyle 值之⼀,它指定框架的样式。
14public static void DrawReversibleFrame(Rectangle rectangle, Color backColor, FrameStyle style);2.程序运⾏效果3.代码实现1public Form1()2 {3 InitializeComponent();4 }56private Point downPoint;7private Rectangle downRectangle;8private Rectangle lastRectangle;910private void pictureBox1_MouseDown(object sender, MouseEventArgs e)11 {12if (e.Button != MouseButtons.Left) return;1314 downPoint = e.Location;15 downRectangle =new Rectangle(0, 0, ((Control)sender).Width, pictureBox1.Height);16 downRectangle.Offset(((Control)sender).PointToScreen(new Point(0, 0)));17 ControlPaint.DrawReversibleFrame(downRectangle, Color.White, FrameStyle.Thick);1819 lastRectangle = downRectangle;20 }21private void pictureBox1_MouseMove(object sender, MouseEventArgs e)22 {23if (e.Button != MouseButtons.Left) return;2425 ControlPaint.DrawReversibleFrame(lastRectangle, Color.White, FrameStyle.Thick);2627 Rectangle rectangle = downRectangle;28 rectangle.Offset(e.X - downPoint.X, e.Y - downPoint.Y);29 ControlPaint.DrawReversibleFrame(rectangle, Color.White, FrameStyle.Thick);3031 lastRectangle = rectangle;32 }33private void pictureBox1_MouseUp(object sender, MouseEventArgs e)34 {35if (e.Button != MouseButtons.Left) return;3637 ControlPaint.DrawReversibleFrame(lastRectangle, Color.White, FrameStyle.Thick);3839 pictureBox1.Location = new Point(40 ((Control)sender).Location.X + e.X - downPoint.X,41 ((Control)sender).Location.Y + e.Y - downPoint.Y);42 }4.程序源代码⼯程⽂件下载。
C#WinForm设置窗⼝⽆边框、窗⼝可移动、窗⼝显⽰在屏幕中央、控件去边框1)窗⼝去除边框在组件属性中FormBorderStyle设为None2)窗⼝随着⿏标移动⽽动添加引⽤using System.Runtime.InteropServices;在初始化控件{InitializeComponent();}代码后添加1 [DllImport("user32.dll")]2public static extern bool ReleaseCapture();3 [DllImport("user32.dll")]4public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);5bool beginMove = false;//初始化⿏标位置6int currentXPosition;7int currentYPosition;8 //获取⿏标按下时的位置9 private void QRCode_MouseDown(object sender, MouseEventArgs e)10 {11if (e.Button == MouseButtons.Left)12 {13 beginMove = true;14 currentXPosition = MousePosition.X;//⿏标的x坐标为当前窗体左上⾓x坐标15 currentYPosition = MousePosition.Y;//⿏标的y坐标为当前窗体左上⾓y坐标16 }17 }18 //获取⿏标移动到的位置19private void QRCode_MouseMove(object sender, MouseEventArgs e)20 {21if (beginMove)22 {23this.Left += MousePosition.X - currentXPosition;//根据⿏标x坐标确定窗体的左边坐标x24this.Top += MousePosition.Y - currentYPosition;//根据⿏标的y坐标窗体的顶部,即Y坐标25 currentXPosition = MousePosition.X;26 currentYPosition = MousePosition.Y;27 }28 }29 //释放⿏标时的位置30private void QRCode_MouseUp(object sender, MouseEventArgs e)31 {32if (e.Button == MouseButtons.Left)33 {34 currentXPosition = 0; //设置初始状态35 currentYPosition = 0;36 beginMove = false;37 }38 }3)窗⼝居中显⽰利⽤C# Form中的StartPosition属性CenterScreen将界⾯显⽰在屏幕中央若是⽤代码实现,显⽰窗体前,应设置此属性,可在调⽤Show()或是ShowDialog()⽅法之前或在窗体构造函数中设置此属性,不要在load()事件中改变此属性,不起作⽤。
大白话C#—使用C#实现点击窗体任意位置进行拖动的功能大白话系列宗旨:打破自身基础高低的壁垒,用最简单白话的语言,让最低基础的童鞋也能轻松编程。
项目描述:对于一个软件来说,可以随意进行窗口拖动是一个很符合操作感同时也很实用的功能,本项目旨在通过在C#中进行代码添加,从而实现点击窗体任意位置都可以进行窗口拖动的功能。
环境:VS2010详细步骤(完整代码附在文档最后):【完整代码附在文档最后】一、新建C #项目1、找到并打开VS2010软件,新建项目。
2、在弹出的窗口中左侧选择Visual C#下的Windows,然后在右侧选择“Windows窗体应用程序”,然后在下侧修改项目名称。
点击确定,即创建了一个窗体。
二、进入代码编写【完整代码附在文档最后】1、选中窗体,在右侧属性界面处点击下图中“事件”按钮(标志为),里面是窗体的所有可操作事件。
2、在其中找到MouseDown事件,并双击,则跳转到该事件的响应函数代码部分。
如图,此时,代码部分为空。
【完整代码附在文档最后】3、在上述响应函数外新建一个坐标类型(Point类型)的变量offset,之后在响应函数内添加代码,添加完成后如下图:4、同样的方法,找到窗体的MouseMove事件。
在其响应函数内添加代码,添加完成后如下图:【完整代码附在文档最后】5、上述仅实现了窗体的非控件区域自由拖动,下面介绍点击控件区域的自由拖动功能。
(以DataGridView控件为例)首先给窗体添加DataGridView控件,并选中它。
6、按之前的方法,在界面的右侧分别选择控件的MouseDown和MouseMove事件,并添加代码如下:六、代码编写完成,启动调试。
【完整代码附在文档最后】附完整代码:using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namespace Freedom{public partial class Form1 : Form{public Form1(){InitializeComponent();}#region除控件部分的窗体自由拖动代码private Point offset;//定义坐标类型的变量private void Form1_MouseDown(object sender, MouseEventArgs e){if (MouseButtons.Left != e.Button)return;Point cur = this.PointToScreen(e.Location);offset = new Point(cur.X - this.Left, cur.Y - this.Top);}private void Form1_MouseMove(object sender, MouseEventArgs e){if (MouseButtons.Left != e.Button)return;Point cur = MousePosition;this.Location = new Point(cur.X - offset.X, cur.Y - offset.Y);}#endregion#region控件区域的自由拖动代码private Point offset1;//定义坐标类型的变量private void dataGridView1_MouseDown(object sender, MouseEventArgs e) {if (MouseButtons.Left != e.Button)return;Point cur = this.PointToScreen(e.Location);offset1 = new Point(cur.X - this.Left, cur.Y - this.Top);}private void dataGridView1_MouseMove(object sender, MouseEventArgs e) {if (MouseButtons.Left != e.Button)return;Point cur = MousePosition;this.Location = new Point(cur.X - offset1.X, cur.Y - offset1.Y); }#endregion}}。
计算机系列教学文档------VC实现鼠标移动对话框窗口
VC实现鼠标移动对话框窗口
本实例主要实现了通过鼠标的移动,来实现窗口的同步移动。
即鼠标左键按下后并对鼠标进行移动,从而窗口跟随鼠标移动,直到鼠标左键抬起,其具体思路是重载“WM_NCHITTEST”消息,在生成的“OnNcHitTest”函数中添加鼠标移动时窗口随之移动的代码,具体实现步骤如下:
在所要移动的窗口类上面,点击鼠标右键,选择“Add Windows Message Handler…”如图所示:
在弹出的窗口中选择“WM_NCHITTEST”消息,如下图所示:
此时双击“WM_NCHITTEST”消息,或点击“AddHandler”接钮,添加到已经存在的消息列表中,如下图所示:
如果“WM_NCHITTEST”消息已经成功加入列已经存在的消息列表中,则点击“Add and Edit”按钮,如下图所示:
此时系统会自动生成对“WM_NCHITTEST”消息的映射函数(函数名为:OnNcHitTest),如下图所示:
最后,在刚刚生成的OnNcHitTest函数中添加窗口的移动代码,代码如下所示:
至此,窗口的移动已经实现。