PB中消息对话框的居中显示
- 格式:docx
- 大小:17.43 KB
- 文档页数:1
PB使用小技巧1. 如何使PB窗口总在最上层通过SetWindowPos函数把窗口的显示层次修改为HWND_TOPMOST,就可以使指定窗口永远不会被其他窗口覆盖,该函数声明为:Function Long SetWindowPos(Long hwnd, Long ord, Long x, Long y, Long dx, Long dy, Long uflag) Library “user32.dll”参数1为要顶层显示的窗口句柄,参数2指定显示的层次,参数7为附加选项,其余参数指定窗口位置和大小,均可忽略。
在窗口的Open或Activate事件中加入如下函数调用:SetWindowPos(Handle(This),-1,0,0,0,0,3)参数2取-1表示在最顶层显示窗口,取1表示在最底层显示;最后一个参数若取1,表示窗口大小保持不变,取2表示保持位置不变,因此,取3(=1+2)表示大小和位置均保持不变,取0表示将窗口的大小和位置改变为指定值。
2. 在PB中如何获得光盘盘符通过GetDriveType函数可以获取驱动器(如:软驱、硬盘、光驱、网络映射驱动器等)的信息,该函数声明为:Function Unit GetDriveTypeA(String drive) Library “kernel32.dll”参数为一个盘符(如“C:”),返回值:1表示未知,2表示软驱,3表示本地硬盘,4表示网络驱动器,5表示光驱。
因此如下代码可以获得光盘的盘符:For I=Asc(‘D’) to Asc(‘Z’)//列举所有可能的CDROM的驱动器If GetDriveTypeA(Char(i)+”:”) = 5 Then//若找到CDROMMessagebox(“CDROM”,Char(i)+”:”)//显示光盘盘符Exit //退出循环End ifNext3. 在PB中如何获取目录信息(1)获取当前目录。
通过GetCurrentDirectory函数可以获取当前目录,该函数声明为:Function Ulong GetCurrentDirectory(Ulong buflen,ref String dir)Library “kernel32.dll”参数2为接受当前目录的字符缓冲区,前面必须加ref表示地址引用;参数1用来指定字符缓冲区的长度。
飞书消息居中语法飞书是一款由中国字节跳动公司开发的企业级即时通讯和协作工具。
在飞书中,我们可以使用居中语法来使文本、标题、表格等内容在页面上居中显示。
本文将详细介绍飞书消息的居中语法和使用方法。
1. 文本居中在飞书消息中,我们可以使用以下语法将文本居中显示:<center>要居中的文本</center>例如,如果我们想要将一段文字居中显示,可以这样写:<center>这是一段居中显示的文字</center>这段代码将会使“这是一段居中显示的文字” 在页面上水平居中显示。
2. 标题居中除了普通文本以外,我们还可以使用同样的方法将标题进行居中处理。
例如:<center>## 这是一个居中的标题</center>这个例子会使“这是一个居中的标题” 在页面上水平居中显示,并且以较大字号呈现。
3. 表格内容居中在飞书消息里,我们经常需要用到表格来展示数据。
为了使表格更加美观和易读,我们可以使用以下语法将表格内容进行水平和垂直方向上的居中处理。
| 居中文本 | 居中文本 ||:---:|:---:|| 内容居中 | 内容居中 |在上面的例子中,我们使用了:---:来指定表格内容的对齐方式,其中冒号表示居中对齐。
这样,表格的每一列的内容都会在页面上水平和垂直方向上居中显示。
4. 图片居中在飞书消息里插入图片时,默认情况下图片是左对齐显示的。
如果我们想要将图片进行居中处理,可以使用以下语法:<center></center>例如:<center></center>这个例子会使名为“飞书Logo” 的图片在页面上水平居中显示。
5. 多行文本居中有时候我们需要将多行文本进行居中处理。
在飞书消息里,我们可以使用以下语法来实现:<center>这是第一行这是第二行这是第三行</center>以上代码会使“这是第一行”、“这是第二行” 和“这是第三行” 在页面上水平居中显示。
pb中自动调整窗口pb中自动调整窗口在一定的屏幕分辨率下开发的应用程序到别的计算机上运行时,很可能遇到和开发环境中的分辨率不同的情况,这时要保证窗口界面仍然显示居中,就得在开发时考虑这个问题。
解决方法是在窗口打开时判断屏幕的分辨率,根据分辨率来决定窗口显示的位置。
要用到两个单位换算函数和一个获取运行环境信息的函数。
在PowerBuilder中所有尺度都是用PowerBuilder单位(PBU)计量的,惟一例外是Window和DataWindow画板网格尺寸,这是用像素计量。
PowerBuilder中的计量使用和Windows中相同的技术,都是基于系统字体。
不同的是,Windows中采用系统字体宽度的1/4和高度的1/8,而PowerBuilder中采用系统字体宽度的1/32和高度的1/64,从而可以提供比Windows中更高的分辨率。
但是,用户在PowerBuild er应用程序中调用外部函数来获取对象的尺寸或位置时就应该进行相应的转换。
好在PowerBuilder本身也提供了进行单位换算的函数,所以应该尽量使用PowerBuilder本身的单位换算函数。
函数UnitsToPixels()用于将PBU值换算成像素值。
它的语法格式是:UnitsToPixels ( units, type )其中,Units是一个整型数值,是要转换成像素值的PBU 值;Type是一个ConvertType类型的枚举值,可以是:·XUnitsT oPixels! 表示要转换成水平方向上的像素值;·YUnitsToPixels! 表示要转换成垂直方向上的像素值。
函数成功执行将返回转换后的像素值,如果执行错误,则返回-1,如果有参数为NULL,则返回NULL。
函数PixelsToUnits用于将像素值换算成PBU值。
它的语法格式是:PixelsToUnits ( pixels, type )各个参数的意义和上面函数的完全相同,执行的功能相反,是将指定像素值转换成指定方向上的PBU值。
[PB]-窗口使用技巧**在打开和关闭窗口时进行数据传递OpenWithParm(windowvar,parmeter{,parent})其中windowvar是要打开的窗口名称,可以是window画板中定义的窗口,也可以是脚本中定义的窗口变量;parameter是要传递的参数,只能是String,Numeric或者PowerObject类型,该参数根据类型保存在Message的成员变量中传递个要打开的窗口;parent是一个已经打开的窗口名称,该窗口要成为windowvar窗口的父窗口。
函数执行成功返回1,否则返回-1,如果有参数为null 则返回null。
对象Message是一个结构类型的全局变量,并有很多的成员变量。
在传递参数时三个成员变量用来读取传递的数据,它们是:Message.DoubleParm:用来传递Numeric类型的数据。
Message.PowerObjectParm:用来传递PowerObject对象类型的数据,象数据窗口、按键、列表框和拥护自定义的结构等都可以使用该变量进行传递。
Message.StringParm:用来传递String类型的数据。
当使用函数OpenWithParm打开窗口后,应该在进行其他操作之前首先读取传递过来的参数,以免其他操作修改Message中的成员变量。
CloseWithReturn(windowname,Returnvalue)其中,windowname是要关闭的窗口的名称,一般是脚本所在的窗口的名称;Returnvalue是要返回的数值,和上述函数OpenWithParm的完全相同。
函数正确执行返回1,否则返回-1,当有参数为null时则返回null。
*只要是response类型的窗口,使用该函数就能有效地传递参数;该窗口不一定非得是用OpenWithParm打开的。
在打开该response的窗口中可以读取传递过来的参数。
总之,使用CloseWithReturn函数时一定要注意,只有被关闭的窗口是response 类型才能有效地获取返回参数。
如何让MessageBox.Show的在父窗口上居中显示...如何在.NET Windows Form编程中让MessageBox.Show()弹出的消息框在父窗口上居中显示?方法一:由于在VS2008中MessageBox共有21个重载方法,且没有一个方法可以指定显示的位置。
这21个静态方法,实际上是调用的Windows API,你可以尝试直接调用该API来实现。
方法二(推荐):由于MessageBox不能继承和重写,所以可以自己定义一个MessageBox窗体,注意设置DialogResult属性,设置StartPosition为CenterParent在父窗口居中,当然你可以设置Left和Top属性,使消息窗口中任意位置。
使用ShowDialog方法显示与MessageBox.Show类似的模态窗口。
方法三:如果你一定要用MessageBox.Show方法,可以使用Windows API FindWindow函数通过Title找到MessageBox窗口的句柄,通过API函数MoveWindow设置窗口的位置。
下面为MessageBoxEx.cs的代码,可以直接使用MessageBoxEx.Show()方法实现MessageBox.Show()的功能,并在父窗口上居中显示:using System;using System.Collections.Generic;using System.Text;using System.Runtime.InteropServices;using System.Windows.Forms;using System.Drawing;namespace WindowsFormsApplication3{struct RECT{public int left;public int top;public int right;public int bottom;};//实现MessageBox居中owner窗体显示class MessageBoxEx{public delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam);[DllImport("user32.dll")]private static extern IntPtr SetWindowsHookEx(int hookid,HookProc pfnhook, IntPtr hinst, intthreadid);[DllImport("user32.dll")]private static extern IntPtr CallNextHookEx(IntPtr hhook,int code, IntPtr wparam, IntPtr lparam);[DllImport("kernel32.dll")]private static extern IntPtr GetModuleHandle(string modName);[DllImport("user32.dll")]private static extern bool UnhookWindowsHookEx(IntPtr hhook);[DllImport("user32.dll")]private static extern boolGetWindowRect(IntPtr hWnd, ref RECT rect);[DllImport("user32.dll")]private static extern IntPtr GetWindow(IntPtr hWnd, uint uCmd);[DllImport("user32.dll")]private static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);private const int WH_CBT = 5;private const int HCBT_ACTIVATE = 5;private const int GW_OWNER = 4;private static IntPtr hookHandle = IntPtr.Zero;private static RECT GetOwnerRect(IntPtr hwnd){RECT ownerRect = new RECT();IntPtr ownerHwnd = GetWindow(hwnd, GW_OWNER);GetWindowRect(ownerHwnd, ref ownerRect);return ownerRect;}private static IntPtr CBTHookCallback(int nCode, IntPtr wParam, IntPtr lParam){switch (nCode){case HCBT_ACTIVATE:RECT vRectangle = new RECT();RECT ownerRect =GetOwnerRect(wParam);GetWindowRect(wParam, ref vRectangle);int width = vRectangle.right - vRectangle.left;int height = vRectangle.bottom - vRectangle.top;int ownerWidth = ownerRect.right - ownerRect.left;int ownerHeight = ownerRect.bottom - ownerRect.top;int left =Math.Max(ownerRect.left + (ownerWidth - width) / 2, 0);int top =Math.Max(ownerRect.top + (ownerHeight - height) / 2, 0);MoveWindow(wParam,left,top,width, height, false);UnhookWindowsHookEx(hookHandle);break;}return CallNextHookEx(hookHandle, nCode, wParam, lParam);}private static void Lock(){hookHandle =SetWindowsHookEx(WH_CBT, newHookProc(CBTHookCallback),GetModuleHandle(null), 0);}//根据需要重载public static DialogResult Show(string text){Lock();return MessageBox.Show(text);}public static DialogResultShow(IWin32Window owner, string text){Lock();return MessageBox.Show(owner, text);}public static DialogResult Show(string text, string caption){Lock();return MessageBox.Show(text, caption);}public static DialogResultShow(IWin32Window owner, string text, string caption){Lock();return MessageBox.Show(owner, text, caption);}public static DialogResult Show(string text, string caption, MessageBoxButtons buttons){Lock();return MessageBox.Show(text, caption, buttons);}public static DialogResultShow(IWin32Window owner, string text, string caption, MessageBoxButtons buttons){Lock();return MessageBox.Show(owner, text, caption, buttons);}public static DialogResult Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon){Lock();return MessageBox.Show(text, caption, buttons, icon);}public static DialogResultShow(IWin32Window owner, string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon){Lock();return MessageBox.Show(owner, text, caption, buttons, icon);}public static DialogResult Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton){Lock();return MessageBox.Show(text, caption, buttons, icon, defaultButton);}}}转载请保留本文链接:/707043659/blog/1247672380。
PowerBuilder数据窗口缓冲区与状态详解Powerbuilder(pb)的datawindow(数据窗口)的各个缓冲区和状态是pb数据窗口的非常重要的,对这些概念的理解,将有助于我们认识pb数据窗口的优势。
基本概念数据窗口的三个缓冲区:Primary!Delete!Filter!Getitemstatus(row,列名或者列号,缓冲区)当要取整个行的状态时,列名或者列号用0表示数据窗口中数据项状态Notmodified! 从数据retrieve出来后没有改变过Datamodified! 数据retrieve出来后有过改变New! 数据窗口增加了一列但没有录入过数据,该列的状态就是new!Newmodified! 数据窗口增加了一列,同时改列被录入了数据,该列的状态就是newmodified!retrieve出来后,结果如下:notmodified用geitemstatus(行号,列名,primary!)取每一数据项状态用getitemstatus(行号,0,primary!)去行状态2、当我把Ccc改为AAA后,如下:001,002,ddd三个格子所在的数据项状态仍旧是notmodifiedAAA(原是Ccc)所在格子的数据项状态是datamodified第一行(001,AAA)的行状态是datamodified第二行(001,ddd)的行状态时notmodified后,如下:2点。
第三行状态就是new!请用getitemstatus(3,0,primary!)取第三行状态4、不保存,当把第三行数据填充后,如下第三行的状态将变为newmodified!第三行的每一项将变为datamodified!开发中实例:表1表2(因为是举例,请不要考虑数据库设置中的冗余概念,如表2中的姓名没必要等)需求一、删除表1中的数据的同时,把表2的数据也删除,必须删除,不考虑约束条件。
如把表1中001,002删除了,需要把表2中所有001,002的记录删除,(【删除】和【保存】是两个按钮或菜单,就是说【删除】只是删除了前台的内容,不【保存】数据库中数据是没有被删除的,数据库需要【保存】执行的时候才真正执行删除),怎么做?1、可以使用触发器;2、可以在删除之前把表1记录下来,【保存】时对比表1,看那些数据缺少了;3、……..DeletedCount ( )Getitemstring(row,列名,delete!,true)(为什么用true,不用false呢?,true是从数据库取出来的默认值,false是当前值,如果删之前用户修改过编号,但是没有保存,用false就会有问题)需求二、把表1中编号001改为了A01,002改为001,003改为B05,004,005不变(没有任何规律的),要求表二的编号也这么改过来。
pb 输入框获得焦点的方法
PowerBuilder (PB) 是一种快速应用程序开发 (RAD) 工具,用于创建企业级应用程序。
要在 PowerBuilder 中实现输入框获得焦点的效果,你可以使用以下方法:
1. 使用 PowerScript: PowerBuilder 提供了 PowerScript 语言,你可以使
用它来编写事件处理程序。
例如,你可以编写一个事件处理程序,当输入框获得焦点时触发。
2. 设置输入框的属性: 你可以设置输入框的属性来定义其在获得焦点时的行为。
例如,你可以设置输入框的 `EditStyle` 属性为 `singleline`,
`multiline` 或 `password`,这取决于你需要的输入类型。
3. 使用系统消息: 你可以使用系统消息来检测输入框是否获得焦点。
例如,
你可以使用 `WM_SETFOCUS` 消息来检测输入框是否获得了焦点。
4. 使用第三方控件: 如果你需要更高级的功能,可以考虑使用第三方控件。
有些第三方控件提供了更多的选项和功能,可以更好地满足你的需求。
请注意,这些方法可能因PowerBuilder 的版本和你的具体需求而有所不同。
建议查阅 PowerBuilder 的官方文档或向有经验的开发者寻求帮助,以获取更详细和具体的指导。
如何让MessageBox.Show的在父窗口上居中显示...如何在.NET Windows Form编程中让MessageBox.Show()弹出的消息框在父窗口上居中显示?方法一:由于在VS2008中MessageBox共有21个重载方法,且没有一个方法可以指定显示的位置。
这21个静态方法,实际上是调用的Windows API,你可以尝试直接调用该API来实现。
方法二(推荐):由于MessageBox不能继承和重写,所以可以自己定义一个MessageBox窗体,注意设置DialogResult属性,设置StartPosition为CenterParent在父窗口居中,当然你可以设置Left 和Top属性,使消息窗口中任意位置。
使用ShowDialog方法显示与MessageBox.Show类似的模态窗口。
方法三:如果你一定要用MessageBox.Show方法,可以使用Windows API FindWindow函数通过Title找到MessageBox窗口的句柄,通过API函数MoveWindow设置窗口的位置。
下面为MessageBoxEx.cs的代码,可以直接使用MessageBoxEx.Show()方法实现MessageBox.Show()的功能,并在父窗口上居中显示:using System;using System.Collections.Generic;using System.Text;using System.Runtime.InteropServices;using System.Windows.Forms;using System.Drawing;namespace WindowsFormsApplication3{struct RECT{public int left;public int top;public int right;public int bottom;};//实现MessageBox居中owner窗体显示class MessageBoxEx{public delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam);[DllImport("user32.dll")]private static extern IntPtr SetWindowsHookEx(int hookid, HookProc pfnhook, IntPtr hinst, int threadid);[DllImport("user32.dll")]private static extern IntPtr CallNextHookEx(IntPtr hhook,int code, IntPtr wparam, IntPtr lparam);[DllImport("kernel32.dll")]private static extern IntPtr GetModuleHandle(string modName);[DllImport("user32.dll")]private static extern bool UnhookWindowsHookEx(IntPtr hhook);[DllImport("user32.dll")]private static extern bool GetWindowRect(IntPtr hWnd, ref RECT rect);[DllImport("user32.dll")]private static extern IntPtr GetWindow(IntPtr hWnd, uint uCmd);[DllImport("user32.dll")]private static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);private const int WH_CBT = 5;private const int HCBT_ACTIVATE = 5;private const int GW_OWNER = 4;private static IntPtr hookHandle = IntPtr.Zero;private static RECT GetOwnerRect(IntPtr hwnd){RECT ownerRect = new RECT();IntPtr ownerHwnd = GetWindow(hwnd, GW_OWNER);GetWindowRect(ownerHwnd, ref ownerRect);return ownerRect;}private static IntPtr CBTHookCallback(int nCode, IntPtr wParam, IntPtr lParam){switch (nCode){case HCBT_ACTIVATE:RECT vRectangle = new RECT();RECT ownerRect = GetOwnerRect(wParam);GetWindowRect(wParam, ref vRectangle);int width = vRectangle.right - vRectangle.left;int height = vRectangle.bottom - vRectangle.top;int ownerWidth = ownerRect.right - ownerRect.left;int ownerHeight = ownerRect.bottom - ownerRect.top;int left = Math.Max(ownerRect.left + (ownerWidth - width) / 2, 0);int top = Math.Max(ownerRect.top + (ownerHeight - height) / 2, 0);MoveWindow(wParam,left,top,width, height, false);UnhookWindowsHookEx(hookHandle);break;}return CallNextHookEx(hookHandle, nCode, wParam, lParam);}private static void Lock(){hookHandle = SetWindowsHookEx(WH_CBT, new HookProc(CBTHookCallback),GetModuleHandle(null), 0);}//根据需要重载public static DialogResult Show(string text){Lock();return MessageBox.Show(text);}public static DialogResult Show(IWin32Window owner, string text){Lock();return MessageBox.Show(owner, text);}public static DialogResult Show(string text, string caption) {Lock();return MessageBox.Show(text, caption);}public static DialogResult Show(IWin32Window owner, string text, string caption){Lock();return MessageBox.Show(owner, text, caption);}public static DialogResult Show(string text, string caption, MessageBoxButtons buttons){Lock();return MessageBox.Show(text, caption, buttons);}public static DialogResult Show(IWin32Window owner, string text, string caption, MessageBoxButtons buttons) {Lock();return MessageBox.Show(owner, text, caption, buttons);}public static DialogResult Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon){Lock();return MessageBox.Show(text, caption, buttons, icon);}public static DialogResult Show(IWin32Window owner, string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon){Lock();return MessageBox.Show(owner, text, caption, buttons, icon);}public static DialogResult Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton){Lock();return MessageBox.Show(text, caption, buttons, icon, defaultButton);}}}转载请保留本文链接: /707043659/blog/1247672380。
VB的TextBox⽂本框实现垂直居中显⽰的⽅法本⽂实例代码可以实现让VB的TextBox⽂本框垂直居中显⽰效果。
此处需要注意:Form_Load()窗体代码中的多⾏属性设置必须为真,即Text1.MultiLine = True,该属性为只读属性,请在设计时修改,换⾏会被之后的代码屏蔽,不想屏蔽可⾃⾏修改,调⽤此函数就好了。
具体的功能代码如下:'================================================================================'| 模块名 | TextBoxMiddle'| 说明 | ⽂本框居中显⽰'=================================================================================Option ExplicitPrivate Type RECTLeft As LongTop As LongRight As LongBottom As LongEnd TypePrivate Declare Function SendMessage Lib "user32 " Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As LongPrivate Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String) As LongPrivate Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As LongPrivate Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As LongPrivate Const EM_GETRECT = &HB2Private Const EM_SETRECTNP = &HB4Private Const GWL_WNDPROC = (-4)Private Const WM_CHAR = &H102Private Const WM_PASTE As Long = &H302Private prevWndProc As LongPublic ClipText As StringPublic Sub DisableAbility(TargetTextBox As TextBox)prevWndProc = GetWindowLong(TargetTextBox.hwnd, GWL_WNDPROC)SetWindowLong TargetTextBox.hwnd, GWL_WNDPROC, AddressOf WndProcEnd SubPrivate Function WndProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As LongDim Temp As StringSelect Case MsgCase WM_CHARIf wParam <> 13 Then WndProc = CallWindowProc(prevWndProc, hwnd, Msg, wParam, lParam)Case WM_PASTEClipText = Clipboard.GetTextTemp = Replace(ClipText, Chr(10), "")Temp = Replace(Temp, Chr(13), "")Clipboard.ClearClipboard.SetText TempWndProc = CallWindowProc(prevWndProc, hwnd, Msg, wParam, lParam)Clipboard.ClearClipboard.SetText ClipTextCase ElseWndProc = CallWindowProc(prevWndProc, hwnd, Msg, wParam, lParam)End SelectEnd FunctionSub VerMiddleText(mForm As form, mText As TextBox)If mText.MultiLine = False Then Exit SubDim rc As RECT, tmpTop As Long, tmpBot As LongSendMessage mText.hwnd, EM_GETRECT, 0, rcWith mForm.Font.Name = .Size = mText.Font.Size.Bold = mText.Font.BoldEnd WithtmpTop = ((rc.Bottom - rc.Top) - _(mText.Parent.TextHeight("H ") \ Screen.TwipsPerPixelY)) \ 2 + 2tmpBot = ((rc.Bottom - rc.Top) + _(mText.Parent.TextHeight("H ") \ Screen.TwipsPerPixelY)) \ 2 + 2rc.Top = tmpToprc.Bottom = tmpBotmText.Alignment = vbCenterSendMessage mText.hwnd, EM_SETRECTNP, 0&, rcmText.RefreshDisableAbility mTextEnd Sub'///////////////////////////////////////////////////////'以下为窗体代码'///////////////////////////////////////////////////////Private Sub Form_Load()'================注意================='多⾏属性必须为真,暨Text1.MultiLine = True'该属性为只读属性,请在设计时修改'换⾏会被之后的代码屏蔽,不想屏蔽可⾃⾏修改'==========================================='调⽤此函数就好了VerMiddleText Me, Text1Caption = Len(Text1)End Sub。
PB中消息对话框的居中显示
SharedObject系列函数和共享对象有关的函数包括:SharedObjectRegister、SharedObjectGet、SharedObjectUnregister和SharedObjectDirectory函数。
首先,用SharedObjectRegister函数初始化共享对象,并建立一个单独的线程。
如:SharedObjectRegister (“ccuo_thread”,“thread1”)其中ccuo_thread是一个共享的自定义类用户对象的类名,thread1是共享对象实例的共享名。
如果SharedObjectRegister函数返回Success,则新线程创建成功。
然后,执行指定代码。
有两种方法让新线程执行指定的代码:一种是在自定义类用户对象的constructor事件中编写脚本,新线程创建后就会自动执行该事件脚本;另一种方法是使用SharedObjectGet函数。
该函数实现共享对象实例的引用,如:SharedObjectGet ( “thread1”,inv_thread ) 其中inv_thread是用来存储共享对象实例的一个对象变量,要求与ccuo_thread具有同一个类名。
最后,通过使用Post语句,即以inv_thread.Post of_function(agrs)的形式,异步调用共享对象的函数of_function。
在完成任务后,可以用SharedObjectUnregister函数中止线程,也可用SharedObjectDirectory函数列出所有有效的共享对象。
函数调用部分本文所用Win32 API 函数原型为:Function Ulong FindWindowA ( String lpClassName ,String lpWindowName ) Library “user32.dll”Function Ulong GetTickCount ( ) Library “kernel32.dll” Function Ulong GetDesktopWindow ( ) Library “user32.dll” Function Boolean GetWindowRect ( Ulong hWnd ,ref stc_rect lpRect ) Library “user32.dll”Function Boolean MoveWindow ( Ulong hWnd,int X ,int Y ,int nWidth ,int nHeight ,Boolean bRepaint ) Library “user32.dll”下面具体讨论如何实现消息对话框的居中显示://声明对象变量ccuo_thread lccuo_thread //创建新线程SharedObjectRegister (‘ccuo_thread’,‘thread_center’)//引用实例SharedObjectGet (‘thread_center’,lccuo_thread ) //调用窗口居中函数lccuo_thread.Post of_center (‘#32770’,‘Demostration’,2000 ) //创建消息对话框MessageBox ( ‘Demostration’,‘Copyright(c) 2001 by Y.L.Sun’) //中止线程SharedObjectunRegister ( ‘thread_center’) 函数实现部分实现窗口居中显示的函数是自定义类用户对象ccuo_thread的对象函数of_center,其实现代码如下:ccuo_thread.of_center ( String lpclassname ,String lpwindowname , Ulong dwtimeout ) return Boolean//lpclassname:消息对话框的类名(#32770)//lpwindowname:消息对话框的标题//dwtimeout:超时计数Ulong lul_hwnd //存放消息对话框的句柄Ulong lul_start //计时开始时刻的值lul_start = GetTickCount ( ) //计时开始do//查找顶层窗口lul_hwnd=FindWindowA ( lpclassname ,lpwindowname )//找到顶层窗口后,跳出循环if lul_hwnd <> 0 then exit//判断是否已超时loop while GetTickCount( )-lul_start< dwtimeout //没有找到消息对话框if lul_hwnd = 0 then return false else//对话框居中return of_center ( 0 ,lul_hwnd ) end ifof_center的重载函数代码如下:ccuo_thread.of_center ( Ulong hwndp ,Ulong hwndc ) return Boolean//hwndp:父窗口的句柄,值为0时认为是桌面//hwndc:子窗口的句柄int li_x //窗口的X坐标int li_y //窗口的Y坐标stc_rect lstc_parent //父窗口的
4边坐标stc_rect lstc_child //子窗口的4边坐标//值为0时认为是桌面if hwndp = 0 then hwndparent = GetDesktopWindow ( ) //获得窗口的4边坐标if not GetWindowRect ( hwndcurrent ,lstc_child ) then return false if not GetWindowRect ( hwndparent ,lstc_parent ) then return falseli_x = (( lstc_parent.right -lstc_parent.left ) -( lstc_child.right -lstc_child.left )) /2li_y = (( lstc_parent.bottom -lstc_parent.top ) -( lstc_child.bottom -lstc_child.top )) /2//计算子窗口的X、Y坐标if li_x < 0 or li_y < 0 then return false //移动子窗口if not MoveWindow ( hwndcurrent ,li_x ,li_y ,lstc_child.right -lstc_child.left ,lstc_child.bottom -lstc_child.top ,false ) then return false return true本文代码在PB 7.0下通过。