api技巧集(三)
浏览:56日期:2023-02-03
函数名: SetWindowPos; 头文件:; winuser.h; 函数原型: BOOL SetWindowPos ( HWND hWnd, //窗口句柄 HWND hWndInsertAfter, //排列顺序的句柄 int X, //水平坐标 int Y, //垂直坐标 int cx, //宽 int cy, //高 UINT uFlags //窗口定位标识 ) 说明: 这个函数能改变窗口的大小、位置和设置子窗口、弹出窗口或顶层窗口的排列顺序。; 返回值: BOOL,如果返回值非零表示成功,返回零表示失败。错误信息请参看GetLastError函数。 参数表: 参数 类型及说明; hwnd HWND,欲定位的窗口句柄; hWndInsertAfter HWND,置于hwnd前面的窗口句柄。这个参数必须是窗口的句柄或是下面的值之一: HWND_BOTTOM 将窗口置于其它所有窗口的底部; HWND_NOTOPMOST 将窗口置于其它所有窗口的顶部,并位于任何最顶部窗口的后面。如果这个窗口非顶部窗口,这个标记对该窗口并不产生影响; HWND_TOP 将窗口置于它所有窗口的顶部; HWND_TOPMOST 将窗口置于其它所有窗口的顶部,并位于任何最顶部窗口的前面。即使这个窗口不是活动窗口,也维持最顶部状态; x: int,指定窗口新的X坐标 Y: int,指定窗口新的Y坐标; cx: int,指定窗口新的宽度; cy: int,指定窗口新的高度; wFlags:; UINT,指定窗口状态和位置的标记。这个参数使用下面值的组合: SWP_DRAWFRAME 围绕窗口画一个框; SWP_FRAMECHANGED 发送一条WM_NCCALCSIZE消息进入窗口,即使窗口的大小没有发生改变。如果不指定这个参数,消息WM_NCCALCSIZE只有在窗口大小发生改变时才发送; SWP_HIDEWINDOW 隐藏窗口; SWP_NOACTIVATE 不激活窗口; SWP_NOCOPYBITS 屏蔽客户区域; SWP_NOMOVE 保持当前位置(X和Y参数将被忽略); SWP_NOOWNERZORDER 不改变所有窗口的位置和排列顺序; SWP_NOREDRAW 窗口不自动重画; SWP_NOREPOSITION 与SWP_NOOWNERZORDER标记相同; SWP_NOSENDCHANGING 防止这个窗口接受WM_WINDOWPOSCHANGING消息; SWP_NOSIZE 保持当前大小(cx和cy会被忽略); SWP_NOZORDER 保持窗口在列表的当前位置(hWndInsertAfter将被忽略); SWP_SHOWWINDOW 显示窗口; 备注: 如果设置了SWP_SHOWWINDOW或SWP_HIDEWINDOW标记,这个窗口不发生移动或改变大小。窗口成为最顶级窗口后,它的所有子窗口也会进入最顶级。一旦将其设为非最顶级,则它的所有子窗口也会转为非最顶级。 相关函数: MoveWindow,SetActiveWindow,SetForegroundWindow; 例子: //设置顶层窗口 SetWindowPos( Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE||SWP_NOSIZE) //取消顶层窗口 SetWindowPos( Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE||SWP_NOSIZE); 超级链接效果; 在很多共享软件的关于对话框里有一些模仿网页的超级链接,如主页URL或E-Mail之类的,当鼠标移到它上面的时候,文字变成红色的,当鼠标离开时,文字又变回原来的蓝色,如果用鼠标点击这个链接则会弹出浏览器窗口打开指定的URL或是运行默认的E-Mail程序撰写新邮件,就和真的超链接一样。你是不是也想在你的程序里做一个呢?其实,我们只要调用API函数ShellExecute和在鼠标移动时改变一下文字的颜色,就可以在自己的程序中出现这种效果。 首先新建一个工程,在窗体Form1上添加两个Label组件,它们的Name属性使用默认的Label1和Label2。 然后在Form1的OnCreate事件中加入代码:; Label1->Cursor=crHandPoint; Label2->Cursor=crHandPoint; Label1->Font->Color =clBlue; Label2->Font->Color =clBlue; abel1->Caption='主页:初学者之家网站; abel2->Caption='E-Mail:fdlweb@sina.com 再在Label1的OnClick(单击)事件中加入: //蓝色的字请改成自己的主页地址 hellExecute(Handle,NULL,'http://fdlweb.myrice.com/,NULL,NULL,SW_SHOWNORMAL); 在OnMouseMove事件中加入:; Label1->Font->Color=clRed; 在Label2的OnClick事件中加入:; //蓝色的字请改成自己邮箱地址 hellExecute(Handle,NULL,'mailto:fdlweb@sina.com,NULL,NULL,SW_SHOWNORMAL) 在OnMouseMove事件中加入:; Label2->Font->Color=clRed 最后在Form1的OnMouseMove事件中加入:; Label1->Font->Color=clBlue; Label2->Font->Color=clBlue 代码输入完了,按F9编译运行程序就看到效果了。 拷贝屏幕; BitBlt函数可以将一幅位图从一个设备场景拷贝到另一个设备场景,这个函数经常用在抓图程序和游戏编程方面,也可以用来做基于桌面的屏幕保护程序。下面让我们用BitBlt函数来做一个虚假桌面的程序: 首先,添加一个Image组件到窗体中,将窗体Form1的BorderStyle属性设为:bsNone。; 接着在窗体的OnCreate事件加入程序代码: Left=0; Top=0; Width=Screen->Width; Height=Screen->Height; Image1->Left=0; Image1->Top=0; Image1->Width=Screen->Width; Image1->Height=Screen->Height; //这句代码就是将桌面拷贝到组件Image1中来存放, // 其中GetDC(0)返回桌面设备的句柄(HDC) BitBlt(Image1->Canvas->Handle,0,0,Screen->Width,Screen->Height,GetDC(0),0,0,SRCCOPY); 按F9运行,一个假的桌面就出来了,在这个“桌面”上怎么按鼠标都没有反应,可以用来捉弄人喔!。有些桌面的小游戏也是这么干的,你可以在这个程序的基础上加上更多的功能,如在窗体上加上Label组件和Timer组件,用Timer组件来控制Label组件在窗体上移动,再在窗体Form1的OnKeyDown事件和Image1的OnMouseDown事件中加入关闭窗口的代码“Close();”,最后将编译了的程序的扩展名改为scr,这就成了一个文字在桌面上乱动的屏幕保护程序了。; 取得磁盘总空间和剩余空间 要取得磁盘总空间和剩余空间,最简单直接的方法是调用API函数 GetDiskFreeSpace。 GetDiskFreeSpace函数有5个参数,第一个参数是要判断可用空间的驱动器名,第二个参数是一个存放每簇扇区数的变量,第三个参数是一个存放每扇区字节数的变量,第四个参数是存放剩余簇数的变量,第五个参数是存放总簇数的变量。套用相应计算磁盘空间的公式即可得出指定驱动器的总空间或剩余空间。 磁盘总空间和剩余空间的计算公式分别为: 磁盘上剩余空间(字节) = 簇的扇区数 * 扇区的字节数 * 剩余簇数 磁盘上总空间(字节) = 簇的扇区数 * 扇区的字节数 * 总簇数 下面就是取得C盘的总空间和剩余空间的例子:; unsigned long Sectors,Bytes,Free,Total; etDiskFreeSpace('C:,&Sectors,&Bytes,&Free,&Total); //可用空间(单位:MB) int FreeKB = Bytes * Sectors * Free / 1024; //总空间(单位:MB) int TotalKB = Bytes * Sectors * Total / 1024; + IntToStr(TotalKB) +'MB)
上一条:api技巧集(四)下一条:API技巧集 (一)
相关文章: