⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 9926.txt

📁 关于编程技术技巧的文章
💻 TXT
📖 第 1 页 / 共 4 页
字号:
  BOOL bResult=FALSE;

  if(glhHook)

   bResult= UnhookWindowsHookEx(glhHook);

   if(bResult)

   glhPrevTarWnd=NULL;

   glhDisplayWnd=NULL;//清变量

   glhHook=NULL;

   }

  }

  return bResult;

  }

  (9)钩子函数的实现:

  LRESULT WINAPI MouseProc(int nCode,WPARAM wparam,LPARAM lparam)

  LPMOUSEHOOKSTRUCT pMouseHook=(MOUSEHOOKSTRUCT FAR *) lparam;

   if (nCode>=0)

  HWND glhTargetWnd=pMouseHook->hwnd;

  file://取目标窗口句柄

   HWND ParentWnd=glhTargetWnd;

   while (ParentWnd !=NULL)

   glhTargetWnd=ParentWnd;

   ParentWnd=GetParent(glhTargetWnd);

   file://取应用程序主窗口句柄

   }

   if(glhTargetWnd!=glhPrevTarWnd)

   char szCaption[100];

   GetWindowText(glhTargetWnd,szCaption,100);

   file://取目标窗口标题

   if(IsWindow(glhDisplayWnd))

   SendMessage(glhDisplayWnd,WM_SETTEXT,0,(LPARAM)(LPCTSTR)szCaption);

   glhPrevTarWnd=glhTargetWnd;

   file://保存目标窗口

   }

   }

   return CallNextHookEx(glhHook,nCode,wparam,lparam);

   file://继续传递消息

  }

  (10)编译项目生成mousehook.dll。

  2.创建钩子可执行程序

  (1)用MFC的AppWizard(EXE)创建项目Mouse;

  (2)选择“基于对话应用”并按下“完成”键;

  (3)编辑对话框,删除其中原有的两个按钮,加入静态文本框和编辑框,用鼠
标右键点击静态文本框,在弹出的菜单中选择“属性”,设置其标题为“鼠标所
在的窗口标题”;

  (4)在Mouse.h中加入对Mousehook.h的包含语句#Include"..\Mousehook\Mou
sehook.h";

  (5)在CMouseDlg.h的CMouseDlg类定义中添加私有数据成员:

  CMouseHook m_hook;//加入钩子类作为数据成员

  (6)修改CmouseDlg::OnInitDialog()函数:

  BOOL CMouseDlg::OnInitDialog()

  CDialog::OnInitDialog();

  ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

  ASSERT(IDM_ABOUTBOX < 0xF000);

  CMenu* pSysMenu = GetSystemMenu(FALSE);

  if (pSysMenu != NULL)

   CString strAboutMenu;

   strAboutMenu.LoadString(IDS_ABOUTBOX);

   if (!strAboutMenu.IsEmpty())

   pSysMenu->AppendMenu(MF_SEPARATOR);

   pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

   }

  }

  SetIcon(m_hIcon, TRUE);//Set big icon

  SetIcon(m_hIcon, FALSE);//Set small icon

  file://TODO: Add extra initialization here

  CWnd * pwnd=GetDlgItem(IDC_EDIT1);

  file://取得编辑框的类指针

  m_hook.starthook(pwnd->GetSafeHwnd());

  file://取得编辑框的窗口句柄并安装钩子

  return TRUE;

  file://return TRUE unless you set the focus to a control

  }

  (7)链接DLL库,即把..\Mousehook\debug\Mousehook.lib加入到项目设置链
接标签中;

  (8)编译项目生成可执行文件;

  (9)把Mousehook.DLL拷贝到..\mouse\debug目录中;

  (10)先运行几个可执行程序,然后运行Mouse.exe程序,把鼠标在不同窗口中
移动,在Mouse.exe程序窗口中的编辑框内将显示出鼠标所在的应用程序主窗口的
标题。pcc

****************************************************************

                     VFP中多媒体数据的高效处理技巧 

                             (河北 朱运喜)

  一. Visual FoxPro中应用OLE技术所存在的问题
  Visual FoxPro(以下简称VFP) 是一种数据库应用程序开发系统,可利用
OLE技术实现对象的链接与嵌入,为应用开发提供了广阔的空间。虽然VFP提供
的OLE编程方式简单快捷,但在实际运行VFP程序的过程中,发现使用OLE方式
处理多媒体数据运行效果并不理想,其原因在于:
  1.运行速度慢
  在VFP中利用OLE方法处理多媒体数据,访问磁盘的次数明显增加。由于
频繁地读取磁盘数据,使得用户操作有明显的等待时间。
  2.重复占用磁盘空间
  我们可以用General字段建立一个多媒体数据库, 观查其大小的变化。
在进行多媒体数据入库操作后,发现备注文件(.FPT)的生成长度略大于原
文件(.BMP、.WAV、.AVI)长度,且有些操作不能删除原文件,造成重复占
用磁盘使用空间。
  二. VFP中高效多媒体程序的设计与实现
  为简化多媒体数据的管理, 提高多媒体信息的输出速度,笔者对VFP中
多媒体信息处理功能、外部应用程序接口、WINDOWS 的多媒体动态链接库进
行了充分的研究,终于找到一种简单有效的实现方法。
  首先建立一多媒体数据库 PLAY. DBF , 设有三个字符型字段: BMPFILE、
WAVFILE、 AVIFILE,分别用于存放图片文件名(.BMP )、声音文件名(.WAV)
和视频文件名(.AVI)。
  1.图片文件的快速处理
  快速方法:充分利用VFP引入的图形控件及其PICTURE属性。
  程序处理过程:
  (1)建立表单FORM,放入图形控件IMAGE1,添加PLAY.DBF至表单的数据环境。
  (2)程序清单:
  THISFORM.IMAGE1.PICTURE=PLAY.BMPFILE
  THISFORM.REFRESH()
  该程序在运行过程中,随着数据库指针的移动,图形控件IMAGE1将随之
实现图片的快速刷新显示。
  2.实现数字视频文件的快速播放
  虽然VFP处理视频文件的功能较弱,但作为 VFP 运行基础的WINDOWS系
统却提供了上百个具有多媒体处理能力的API函数,并统一由多媒体动态链
接库提供给开发者使用。 多媒体动态链接库所在目录及库名在不同的系统
中略有不同,在WINDOWS3.2和WINDOWS 95中,为\WINDOWS\SYSTEM\MMSYSTEM.DLL,
在WINDOWS NT中,则为\WINDOWS\SYSTEM32\WINMM.DLL。
  在VFP中,为调用多媒体动态链接库中的API函数,提供了一个外部应
用程序接口库文件FOXTOOLS. FLL 。其中有两个重要的函数:REGFN( )和
CALLFN( )。前者用来寄存驻留在WINDOWS的动态链接库中的API函数及其参
数。后者则用以调用执行WINDOWS 的 API 函数。调用格式:=REGFN(“函
数名”,“传给函数的参数类型、数量”,“函数返回值的数据类型”,“DLL库名”)
  返回参数:调用成功REGFN( )返回一个数值,否则返回-1。
  =CALLFN ((REGFN( )的返回值,参数1,参数2……)
  注意:
  (1)在CALLFN()中说明的参数数目、类型必须与在REGFN( )中指定
的参数相符,否则调用失败。
  (2)在VFP5.0中,针对32位系统提供了调用REGFN32()。
  (3)对REGFN() 和CALLFN()中双引号内的字符串应注意大小写的混
合写法,否则可能会引起执行错误。
  例:本例仅给出视频操作部分的程序代码,省略了其它相关部分的
程序代码。
  (1) FORM.INIT事件中的程序代码:
  set library to HOME()+foxtools.fll ADDITIVE
  public playfavi
  playfavi=regfn(“MCISendString”,“CCII”,“I”,“MMSYSTEM”)
  (2)OPEN.CLICK(打开视频文件操作)程序代码:
  avifname=play.avifile
  =callfn(playfavi,“Open &avifname alias AVI Type AVIVideo ”,“”,0,0)
  =callfn(playfavi,“put AVI window at 160 100 320 240”,“”,0,0)
  thisform.Refresh()
  说明:160,100为窗口左上角坐标,320,240为窗口大小,也可用坐标
变量的方式确定视频播放窗口的位置及大小。
  (3)PLAY.CLICK(播放AVI文件操作)程序代码:
  =callfn(playfavi,“Play AVI”,“”,0,0)
  (4)TOP.CLICK(回到片头操作,即影片的第一帧)程序代码:
  =callfn(playfavi,“SEEK AVI TO START”,“”,0,0)
  (5)END.CLICK(转到片尾操作,即影片的最后一帧)程序代码:
  =callfn(playfavi,“SEEK AVI TO END”,“”,0,0)
  (6)CONFIG.CLICK(显示视频处理配置操作)程序代码:
  =callfn (playfavi,“configure avi”,“”,0,0)
  (7)CLOSE.CLICK(关闭视频文件操作)程序代码:
  =callfn(playfavi,“close AVI”,“”,0,0)
  3.声音文件的处理技巧
  VFP处理声音文件的方式除OLE外,还可用编程方法控制播放.WAV文
件具体方法:
  SET BELL TO PLAY.WAVFILE,WAV
  ??CHR(7)
  用此方法处理声音文件虽然快捷简单, 但无法通过键盘或鼠标中断
WAV文件的播放。为解决此问题,笔者事先用WINDOWS的RECORDER录制了一
个“静音文件”SILENCE.WAV, 即没有任何声音的声音文件,同时在表单
中设置“停止播放”的命令按钮,其CLICK代码段为:
   SET BELL TO “SILENCE.WAV”,WAV
   ??CHR(7)
  操作者可通过“停止播放”按钮中断声音的播放。
  上述程序在WINDOWS 95环境中,分别用VFP5.0、VFP6.0调试通过。
  采用以上方法(非OLE 方式)处理多媒体数据不仅能简化数据库管
理(仅对各种媒体的文件名进行管理即可),节省了大量的存储空间,
还可以提高多媒体信息的处理速度,并且编程简单,易于实现。                     
                     
****************************************************************
 
                       VFP中图形特技的实现 

                          (四川 周鸣扬)

  在使用VFP进行多媒体演示程序设计时,为了让你的程序看起来更加引
人注意,经常涉汲到对图形的特技处理。但是,由于VFP提供的图形操作函
数少得可怜,远不如VB和VC那样丰富,除了画点、矩形、圆之外,再也难
以找到其他的绘图函数了。如何在现有的条件下充分利用VFP的自身环境作
出令人满意的图形特技呢?以下是我在平时设计程序的一些小经验,可供
大家参考。
  一、 图形画卷式地展开以及由小到大地平推式放大特技
  在VFP中,可以使用Image图形控件的Width及Height属性来让图片从左
至右、从上到下地逐渐展开。具体的作法是:先新建一表单Form1,在上面
分别加上Image和Timer控件,名称为Image1、Timer1,然后在Form1的Init
事件中加入如下代码:
  Local Pwidth,Pheight
  *设置欲展开的图片
  thisform.image1.picture=“c:\windows\安装程序.bmp”
  thisform.image1.stretch=0 
  *设置计时器
  thisform.timer1.interval=20 
  pwidth=thisform.image1.width
  pheight=thisform.image1.height
  *让表单与图形一样大小
  thisform.width=Pwidth
  thisform.height=Pheight
  *首先隐藏图片,以备展开
  thisform.image1.top=0
  thisform.image1.left=0
  thisform.image1.height=0
  *打开计时器
  thisform.timer1.enabled=.t.
  接下来在Timer1的Timer事件中加入下述代码:
  *设定图形展开的幅度,幅度过大会产生闪烁的效果
  thisform.image1.height=thisform.image1.height+1
  if thisform.image1.height>Pheight
  this.enabled=.f.
  endi
  运行Form1,你将会看到一幅画由上至下逐渐展开。需要注意的是,
之所以在Form1的Init事件中设定Image1的stretch属性为0(对图形进行
剪裁)是因为如果将stretch属性设为1(等比填充)或是2(变比填充),
你看到的只是一幅画由小逐渐变大,而非是逐渐展开。也许你会问怎样实
现图形平推式放大,我想不必再多说了,设定stretch属性为1或2 ,在
Form1的Init事件中正确设定图形的初始位置(表单的中央)以及在
Timer1的Timer事件中不断调整图形的显示位置(修改Image1的Left、Top
值)和图片大小(Width、Height),怎么样?试试吧,很有趣的。
  二、 图形的雾化及滤色处理
  图形的雾化处理就是让一幅画看起来朦朦胧胧的。在VFP中由系统提
供图形处理函数相当少,这时我们可以使用一种比较笨的办法来实现雾
化处理。在VFP中我们可以利用表单的画圆函数在表单上画圆,对于所绘
图形在表单上的存在形式,这是通过表单的Drawmode 属性来控制。对图
形进行雾化处理,既要在图画上添加“雾”的颜色,同时也得保留图形
的本来面目,这时很自然地想到图形之间的“掩码”操作,将Drawmode设
为9(掩码操作)即可完成对图形的雾化操作。同样建立一表单Form1,在
其Init事件中加入如下代码:
  thisform.picture=“c:\windows\安装程序.bmp”
  *设定“雾的颜色”
  thisform.forecolor=rgb(192,192,192)
  thisform.refresh
  另外在Form1的Dblcilck事件中加入如下代码:
  local temp,pradius,x,y,x1,y1
  temp=1
  thisform.picture=“c:\windows\安装程序.bmp”
  thisform.refresh
  wait window “按任一键进行雾化演示”
  *利用两点间距离公式计算圆的最大半径
  x=thisform.width/2
  y=thisform.height/2
  x1=thisform.left
  y1=thisform.top
  pradius=sqrt((x-x1)*(x-x1)+(y-y1)*(y-y1)) 
  *由内向外画圆,实现雾化 
   do while temp    thisform.circle(temp,thisform.width/2,thisform.height/2)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -