当前位置: 首页 > 编程日记 > 正文

奇淫怪巧之给Delphi的PrintDialog增加一个页码选定范围打印的Edit

在Delphi中使用PrintDialog打印对话框的时候,这个控件有三个选项,就是PrintRang那个属性的三个选项,其中有一个选项三,让我们自定义选择页码范围来打印。但是比较蛋疼的是,这个地方选中了之后啥子效果都没有。无法制定自己的页码范围,很是蛋疼。这里实际上应该要有一个Edit之类的编辑框的,这样可以让用户输入1,2,3-4之类的页码范围来整就比较人性化了。起初以为是自己没有指定某属性神马的导致,于是在控件的各个属性中找,找的我蛋都要裂开了,都没找出来似乎是隐藏了那个Edit的属性。。。。无果,整开了PrintDialog的源码看。也未发现相关的代码。咋办,咋办呢。路总是人走出来的,目的就是要在这个弹出的对话框上加一个编辑框就OK了,方式很多,可以在弹出来之后,查找句柄,然后创建一个Edit,然后SetParent就上去了。这是一方面,另外一方面,就是要配合对话框上,用户点击上面的选项来相应的联动这个Edit为可用或非可用状态。这个自然也是有办法的,我首先想到的就是Hook了,于是就用Hook整了,WH_CallWndProc消息处理过程函数的Hook,就行了。至于是要拦截神马消息,嘿嘿,这个是WinSDK的范畴,不熟悉的人,去翻番书,或者百度一番,就可以知道是WM_Command这个消息来处理窗口中的某些控件的消息处理的。首先就是要获取那个弹出的打印对话框的句柄了,我说过了可以用FindWindow来找。不过我这里要使用消息过程钩子,那么自然就不要这个了,直接从钩子中获取对话框句柄,会更加Happy。看看PrintDialog的代码,俺们可以知道,神马PrintDialog,OpenDialog,FontDialog打开都要触发WM_InitDialog这个消息,就是初始化对话框的消息。所以,第一步,俺们就拦截这个消息就 可以获取到句柄,然后创建俺们的Edit,然后将Edit设置到对话框中,俺们需要他在的位置。第二步,就是来拦截WM_Command,然后来处理和用户点击的联动处理咯。然后就是在对话框的Destroy消息中注销Hook,释放Edit。于是这个过程就OK了

首先在打开对话框之前,注册我们的过程处理钩子,必须要之前注册,因为要拦截WM_InitDialog消息嘛

procedure TForm1.Button1Click(Sender: TObject);
beginCEdit := TEdit.CreateParented(Application.Handle);CEdit.Parent := Application.MainForm;Hok := SetWindowsHookEx(WH_CALLWNDPROC,WNDProcHook,HInstance,GetCurrentThreadId);if PrintDialog1.Execute thenbeginShowMessage(CEdit.Text);end;UnhookWindowsHookEx(HOK);FreeAndNil(CEdit);
end;

然后是钩子函数过程处理

varDownBtnID: Integer;PrntDlgHandle: THandle;CEdit: TEdit;
function WNDProcHook(code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT stdcall;
varmsg: PCWPSTRUCT;wNotifyCode,wID: Word;r,WinR: TRect;DwonBtnHandle: THandle;
beginif code < 0 thenResult := CallNextHookEx(Hok, code, wparam, lparam)elsebeginmsg := PCWPSTRUCT(lparam);case msg.message ofWM_INITDIALOG:beginPrntDlgHandle := msg.hwnd;DwonBtnHandle := FindWindowEx(PrntDlgHandle,0,'Button','打印范围');Windows.SetParent(CEdit.Handle,DwonBtnHandle);GetWindowRect(DwonBtnHandle,WinR);CEdit.Visible := True;DwonBtnHandle := FindWindowEx(PrntDlgHandle,0,'Button','选定范围(&S)');CEdit.Enabled := SendMessage(DwonBtnHandle,BM_GETCHECK,0,0) = 1;GetWindowRect(DwonBtnHandle,r);DownBtnID := GetDlgCtrlID(DwonBtnHandle);CEdit.Left := r.Right - WinR.Left;CEdit.Top := r.Top - WinR.Top;end;WM_COMMAND:beginif msg.hwnd = PrntDlgHandle thenbeginwNotifyCode := HIWORD(Msg.wparam);wID := LOWORD(Msg.wParam);if wNotifyCode = BN_CLICKED thenbeginCEdit.Enabled := wID = DownBtnIDend;end;end;WM_DESTROY:begin//UnhookWindowsHookEx(HOK);//Hok := 0;//FreeAndNil(CEdit);end;end;Result := 0;end;
end;

可见,我这里注销了WM_Destroy中的处理。目的是因为俺们还需要返回这个Edit中的内容嘛,所以我们直接在使用完了之后注销钩子,释放Edit就行了!

实现之后的效果,就是这样的咯

转载于:https://www.cnblogs.com/DxSoft/archive/2013/04/22/3035565.html

相关文章:

进程管理(图文)

进程的图文形象表示 阮一峰–进程与线程的一个简单解释 多进程实质 现在&#xff0c;多核CPU已经非常普及了&#xff0c;但是&#xff0c;即使过去的单核CPU&#xff0c;也可以执行多任务。由于CPU执行代码都是顺序执行的&#xff0c;那么&#xff0c;单核CPU是怎么执行多任…

拿到WP官方主题Twenty Ten就是一顿nofollow伺候

2019独角兽企业重金招聘Python工程师标准>>> 今天2012-07-03&#xff0c;我的个人cn域名申请下来了&#xff0c;于是网站搬迁&#xff0c;暂时没有选择一个好的WordPress主题&#xff0c;只有用默认的Twenty Ten&#xff0c;不过这个主题对SEO方面还有一些欠缺&…

Qt分析:Qt中的两种定时器

QTimer类的定时器 QTimer类定时器是QObject类定时器的扩展版或者说升级版&#xff0c;因为它可以提供更多的功能。比如说&#xff0c;它支持单次触发和多次触发。 使用QTimer类定时器的步骤&#xff1a; &#xff08;1&#xff09;创建一个QTimer定时器实例&#xff1a;QTimer …

uestc 1012 饭卡

饭卡(card) Time Limit: 1000 ms Memory Limit: 65535 kB Solved: 253 Tried: 2169 Submit Status Best Solution Back Description 电子科大本部食堂的饭卡有一种很诡异的设计&#xff0c;即在购买之前判断余额。如果购买一个商品之前&#xff0c;卡上的剩余金额大于或等…

wps临时文件不自动删除_win10系统下wps残留文件无法删除如何解决

一位用户反馈自己在win10系统电脑中卸载金山WPS办公软件时&#xff0c;发现根本无法将wps残留的文件夹删除&#xff0c;在删除的时候提示“操作无法完成&#xff0c;因为其中的文件夹或文件已在另一程序打开 请关闭该文件夹文件重试”&#xff0c;这该怎么办呢&#xff1f;接下…

WEB登录H3C模拟器

思路&#xff1a;先将路由器与本地网卡绑定&#xff0c;然后将本地网卡与路由器接口ip设置在同一网段&#xff0c;在路由器上建立本地用户&#xff0c;最后登录就OK了。 1、查看本机网卡的序列号&#xff0c;在CMD里输入systeminfo&#xff0c;输出的最下…

ArcMap 通过DEM获取高程值

第一种方法&#xff1a;Extract values to Points工具&#xff0c;这个网上的资料比较多&#xff0c;就不介绍了。 第二种方法&#xff1a;Interpolate Shape工具 直接用Arc Toolbox->3D Analyst Tools->功能性表面->Interpolate Shape工具就行&#xff0c;可以将DEM的…

Linux进程描述符task_struct结构体简析

进程是处于执行期的程序以及它所管理的资源&#xff08;如打开的文件、挂起的信号、进程状态、地址空间等等&#xff09;的总称 Linux内核通过一个被称为进程描述符的task_struct结构体来管理进程&#xff0c;这个结构体包含了一个进程所需的所有信息。它定义在include/linux/…

hdu 1312 Red and Black 解题报告

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1312 第二条深搜&#xff0c;题目并不难&#xff0c;但是做了我好久好久&#xff0c;由于一个细节&#xff0c;让我赌上了一个晚上的时间。 题目大意&#xff1a;从图中的标记开始&#xff0c;向四个相邻的方向…

easyexcel怎么设置表头宽度_easyexcel 自动设置列宽

com.alibabaeasyexcel2.1.4导出controller层代码RequestMapping("/download")public void download(HttpServletResponse response) throws IOException {response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8…

php ImageMagick扩展

linux下安装php ImageMagick扩展模块下载ImageMagick源码包&#xff1a;#wget ftp://ftp.u-aizu.ac.jp/pub/graphics/p_w_picpath/ImageMagick/p_w_picpathmagick.org/ImageMagick.tar.gz 编译安装&#xff1a;#tar -zxvf ImageMagick.tar.gz #cd ImageMagick-xxxx-0#./confi…

调用浏览器的打印方法打印页面内容

2018-08-30 直接调用浏览器的打印方法 1、打印按钮 <a href"#" target"_self" οnclick"printme()">打印</a> 2、js //打印function printme() {$.messager.confirm(确认, 确认打印&#xff1f;, function (r) {if (r) {document.bo…

jsp中九大内置对象

内置组件 JSP共有以下9种基本内置组件&#xff08;可与ASP的6种内部组件相对应&#xff09;&#xff1a;1.request对象 客户端的请求信息被封装在request对象中&#xff0c;通过它才能了解到客户的需求&#xff0c;然后做出响应。它是HttpServletRequest类的实例。序号 方 法 说…

python数组越界_python 整数越界问题详解

python 内部自带大整数运算能力&#xff0c;整数运算不会溢出&#xff0c;只要内存足够&#xff0c;就oK下面的例子演示了两个32位整数加法的情况(通过位运算实现)&#xff0c;为了模拟溢出的效果&#xff0c;必须人工的进行位运算&#xff0c;~运算符除了求反&#xff0c;还是…

Linux虚拟机连不上网

问题&#xff1a;我们在使用Linux虚拟机的时候经常会出现各种各样的问题&#xff0c;其中的一个问题就是Linux虚拟机连不上网&#xff0c;这是我最近经常遇到的问题&#xff0c;下面提供一种方法解决这个问题 Linux网络设置 打开虚拟机依次单击【System】–>【Preferences】…

企业如何利用新闻类软文营销策划

新闻软文营销对企业的推广有哪些优势呢? 一、首先让客户有机会直接在门户网上相关频道看到关于企业产品的新闻&#xff0c;产生直接的点击或者评论&#xff0c;带来直接客户。 二、当潜在客户运用百度等搜索引擎搜索企业的公司名或者产品的关键词&#xff0c;那么就会在一个页…

WPF XAML 资源样式模板属性存放位置

WPF XAML 资源样式模板属性存放位置 原文:WPF XAML 资源样式模板属性存放位置WPF的XAML 资源申明 类似HTML。 整体来说分3种1.行类资源样式属性 1.1 行内属性 <Button Content"按钮" Foreground"White" FontSize"30"></Button>1.2 行…

SQL Server 数据库备份

SQL Server 数据库备份 原文 http://www.cnblogs.com/ynbt/archive/2013/04/04/2999642.html 备份数据库是指对数据库或事务日志进行复制&#xff0c;当系统、磁盘或数据库文件损坏时&#xff0c;可以使用备份文件进行恢复&#xff0c;防止数据丢失。 SQL Server数据库备份支持…

Linux下修改PATH环境变量

Linux下有很多环境变量&#xff0c;PATH就是其中的一种 PATH 可执行文件的搜索路径。ls命令也是一个程序,执行它不需要提供完整的路径名/bin/ls,然 而通常我们执行当前目录下的程序a.out却需要提供完整的路径名./a.out,这是因为PATH 环 境变量的值里面包含了ls命令所在的目…

vscode 终端 进入node_安装了Node.js 从VScode 使用node -v 和 npm -v等命令却无效

前言最近写TypeScript需要安装、配置Node.js环境&#xff0c;楼主是使用的安装包所以环境变量都是自动就配好了(如果是下载的zip压缩包解压后要自己配置到系统环境变量中)。打开系统终端敲入命令 node -v 和 npm -v 也都有显示对应的软件包版本号&#xff0c;但是在VScode(Vis…

display:inline-block的妙用!!列表布局!!

如下图&#xff1a;像这种列表布局我们一般用 float:left; 设置宽度和高度就OK了。 但是&#xff0c;如果高度不同或者文字字数不同呢&#xff0c;再用float:left;布局就全乱了。如下图&#xff1a; 现在&#xff0c;我们可以利用display:inline-block;完美的解决这个问题。如下…

gitlab解决一些问题

一.修改gitlab端口&#xff1a; 打开/etc/gitlab/gitlab.rb文件&#xff0c;修改以下几点&#xff1a; external_url "http://192.168.58.62:9999"unicorn[listen] localhostunicorn[port] 9999 然后 #gitlab-ctl stop #gitlab-ctl reconfugure #gitlab-ctl start …

Linux下控制环境变量

查看环境变量 查看某一环境变量&#xff1a;比如我们需要查看HOME这个环境变量&#xff0c;我们可以在shell下直接输入echo $HOME 我们可以把所有的环境变量和环境变量的值都打印出来 打印环境变量 libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,…

研究性能测试工具之systemtap入门指南(四)

运行脚本[rootBL480-64 jinyz]#stap topexe.stp输出结果&#xff1a; SYSCALL COUNT find 101910 oracle 1562 modclusterd 1184 pcscd 535 clustat …

linux 编译mqtt静态库_编译MQTT C++ Client

nmake -f ms\nt.mak(这是静态库,动态库是ntdll.mak)nmake -f ms\nt.mak test(测试命令,如果成功则最后显示“passed all tests”字样)nmake -f ms\nt.mak install 成功则会在C:\openss\win64目录下生成bin、include、lib、ssl四个文件夹如果需要编译动态库&#xff0c;nm…

ubuntu 目录结构

转载于:https://www.cnblogs.com/perfy/archive/2012/07/08/2581854.html

pandas 读csv文件 TypeError: Empty 'DataFrame': no numeric data to plot

简单的代码&#xff0c;利用pandas模块读csv数据文件&#xff0c;这里有两种方式&#xff0c;一种是被新版本pandas遗弃的Series.from_csv&#xff1b;另一种就是pandas.read_csv 先说一下问题这个问题就是在读csv文件时&#xff0c;默认的数据是object类型&#xff0c;因而没有…

Linux的僵尸进程

僵尸进程的简单理解 linux中有几种进程状态&#xff0c;其中有一种特殊就是僵尸进程&#xff0c;个人理解是可以这样理解&#xff0c;就是我们 的子进程已经退出了&#xff0c;但是子进程退出了之后无家可归&#xff0c;就是一个飘移的孤魂野鬼一样&#xff0c;所以形象的取名字…

class function或class procedure是什么意思

类函数\类过程. 它们是直接操作在类上面(没有实例化的对象) 下面是Delphi Help 的描述 A class method is a method (other than a constructor) that operates on classes instead of objects. The definition of a class method must begin with the res…

pythonshell画图_Python Shell下使用matplotlib

Python Shell下使用matplotlibCreated Monday 10 December 2012matplotlib默认是延迟绘图直到脚本结束&#xff0c;因为绘图是一个高代价的操作。所以可能不想每次每个属性的改变就更新绘图&#xff0c;只有所有的属性都改变了才更新。但是&#xff0c;当在python shell上工作时…