汉字图形窗口界面设计方法及函数编程技巧(精选6篇)由网友“琉果”投稿提供,下面是小编整理过的汉字图形窗口界面设计方法及函数编程技巧,欢迎大家阅读分享借鉴,希望对大家有所帮助。
篇1:汉字图形窗口界面设计方法及函数编程技巧
汉字图形窗口界面设计方法及函数编程技巧
摘要 该文讨论了汉字图形窗口界面设计的一般方法,给出了窗口生成,窗口管理,菜单生成与管理,鼠标与键盘管理等实现的子函数,并给出了部分C语言源程序。这些函数的组合可以设计出丰富的.汉字图形窗口界面。
一、图形窗口设计函数
主要包括窗口生成与管理函数,如窗口生成,窗口打开,窗口关闭,窗口删除等。
1.窗口结构定义方法
typedef struct gwin {
int x0,y0,x1.y1; /*窗口位置及大小*/
int Border; /*窗口边框类型*/
int Wcolor; /*窗口背景颜色*/
char Wstate; /*窗口状态标志*/
char far *Buffer; /*指向窗口缓冲区指针*/
}GWIN;
在GWIN中,Border为窗口的边框属性,可以根据不同要求设计出多种边框类型业,以美化窗口界面。
2.窗口子函数
窗口生成子函数:Gwin * GwinCreate(x0,y0,x1,y1,border,colo
r)
int x0,y0,x1,y1; /*窗口位置及大小*/
BorderMode border; /*窗口边框类型*/
int color; /*窗口背景颜色*/
窗口显示子函数:GwinDisplay(GWIN *w)
w为用GwinCreate生成的窗口指针,即此函数画出窗口。
窗口打开子函数:GwinOpen(GWIN * w)
此函数调用GwinDisplay来显示窗口,并存储屏幕。
窗口关闭子函数:GwinClose(GWIN * w)
此函数关闭已打开的窗口,恢复屏幕,但此窗口数据还保存,可再次打开。
窗口删除子函数:GwinKill(GWIN * w)此窗口彻底清除窗口,不可重新打开。
3.部分程序
下面给出实现上述功能的C语言程序
/*Windows Create*/
#include
#include
#include
#include
#include
#include
#define CR 0x0d
#define Esc 0x1b
#define Left 0x4b
#define Right 0x4d
#define Up 0x4d
#define Down 0x50
#define OPEN 1 /*窗口为打开状态*/
#define CLOSE 0 /*窗口为关闭状态*/
#define MOUSE 0 /*是否有鼠标移动*/
/*定义窗口边框类型*/
typedef enum {
NoBorder,/*普通窗口,系统默认值*/
TBorder,/*窗口有凸边框类型*/
WBorder,/*窗口有凹边框类型*/
TWBorder,/*窗口有凸凹边框类型*/
WTBorder,/*窗口有凹凸边框类型*/
CBorder,/*窗口有汉字边框类型*/
... /*其它窗口类型*/
}BorderMode;
GWIN * GwinCreate(x0,y0,x1,y1,border,color)
int x0,y0,x1,y1;
BorderMode border;
int color;
{
GWIN *w;
w=malloc(sizeof(GWIN));
w->x0=x0;
w->y0=y0;
w->x1=x1;
w->y1=y1;
if(border==NoBorder)w->Border=NoBorder;
[1] [2] [3] [4]
篇2:PowerBuilder数据窗口编程技巧
PowerBuilder数据窗口编程技巧
PowerBuilder取得巨大成就的原因就是有功能强大和灵活多变的Datawindow对象,本人用PowerBuilder开发过一段时间后,总结出一些技巧,以供广大的PB开发者借鉴使用。
1、如何创建一个具有逐渐递增求和功能的报表,如下形式:
Quantity Running Total
5,000 5,000
2,500 7,500
3,000 10,500
12,000 22,500
对于Running Total列,我们可使用计算列:CumulativeSum(Quantity for all),即可达到逐渐递增求和的功能。
2、数据窗口的数据送缓冲区之前确认的四个步骤
如果我们不清楚数据窗口中的数据在送入缓冲区之前所发生的一切,在保存数据时就不明白错误发生的原因,找不出错误的根源。
PB首先判断数据类型是否正确。如不正确则触发ItemError事件。
接着判断数据是否符合有效性规则。如不符合有效性规则,同样触发ItemError事件。
然后判断是否有数据被改动。
最后判断数据是否通过ItemChanged事件,如果数据和ItemChanged相斥,将触发ItemError事件。
3、如何在DataWindow中用数据类型为Datetime的列为条件进行查寻
(1) 当要查找的日期条件是一常数时使用如下表达式:
ls_Find = “datetime_col = DateTime ('1/1/')”
(2)当要查找的日期条件是一个变量时使用如下的表达式:
ls_Find = “datetime_col = DateTime ('” + ls_Date + “')”
(3) 当要查找的日期条件是一个DateTime
数据类型时使用如下表达式:
ls_Find = “datetime_col = DateTime '” + String (ldt_DateTime) + “')”
4、设置数据窗口Boolean型属性的三种方法
PowerBuilder提供了三种方法设置数据窗口的布尔型属性,分别是True/False, 1/0, 'Yes'/'No'。例如:
dw_1.Object.address.Visible = 0
dw_1.Object.address.Visible = False
dw_1.Object.address.Visible = 'No'
PowerBuilder在处理时以字符串的形式保存属性,而不考虑属性值是布尔型、长整型或是字符型。为了进一步理解,可以导出一个数据窗口并查看它的原码,可以发现即使是列的颜色属性它也是使用带双引号的数字来表达。
5、如何在数据窗口(Datawindow)中快速删除多行
在开发过程中可能经常有要进行多行删除的操作,一般都使用循环语句进行操作:
FOR ll_RowOn = 1 TO dw_1.RowCount
dw_1.DeleteRow(ll_RowOn)
NEXT
这里提供一个快速的删除方法把要删除的'行从主缓冲区中移到删除缓冲区中。例如,删除缓冲区中所有的行:
dw_1.RowsMove(dw_1, 1, dw_1.RowCount,
Primary!, dw_1, 1, Delete!)
但需注意的是不要忘了过滤的行在不同的缓冲区中。
6、如何在DataWindow的SQL语法中不使用SELECT DISTINCT实现删除重复的行
首先对你要显示唯一值的列进行排序:“money”,然后增加如下过滤字符串:“ money < >money [-1] or GetRow () = 1”
7、如何在分组形式的DataWindow中分别显示各组的行号
当我们为Datawindow的每一行显示行号时,可以简单的放一个表达式为GetRow()计算列。但是对于分组的Datawindow,要分别显示各组的行号,则应使用表达式为GetRow() - First(GetRow() for Group 1) + 1的计算列。
8、如何改变列的字体颜色,以提醒用户此列已做修改
在列的Color属性中,输入如下表达式IF (column_name < >column_name.Original, RGB(255, 0, 0), RGB(0, 0, 0))
。在这个条件中,如果此列已改变,则显示红色字体,否则显示黑色字体。这个表达式主要用column_name < >column_name.Original比较当前列的值和原始列的值是否相同来达到判断的目的。
9、在数据窗口中移走行,但不是去做过滤或删除操作
RowsDiscard()函数可做到这一点,它在数据窗口中执行移除工作,但被移走的行它不可被删除或做任何修改性的保存。
10、如何在多行显示的DataWindow 中的Footer Band中显示当前数据的首行和最后行的行号
我们先看两个计算列的表达式的例子:
IF (GetRow() = First(GetRow() FOR Page), 1, 0) // 1 为当前页的第一行
IF (GetRow() < >1 AND GetRow() = Last(GetRow() FOR Page), 1, 0)
// 1 为当前页的最后一行
由此例可知,在Footer Band中设置如下计算列表达式:'Rows ' + String(First(GetRow() FOR Page)) + ' to ' + String(Last(GetRow() FOR Page)) + ' are displayed'。即可达到这项功能。
联系地址:炮兵学院二系十队 230031
电话:5578721 BP 3401188?/FONT>5169
E_mail: zmz1974@263.net
篇3:WIN技巧:编程基础之WINDOWS钩子函数
把鼠标关标滑过一个窗口时,该窗口的有关消息将显示在主窗口中,当您按下“Unhook”时,应用程序将卸载钩子。主窗口使用一个对话框来作为它的主窗口。它自定义了一个消息WM_MOUSEHOOK,用来在主窗口和DLL之间传递消息。当主窗口接收到该消息时,wParam中包含了光标所在位置的窗口的句柄。当然这是我们做的安排。我这么做只是为了方便。您可以使用您自己的方法在主应用程序和DLL之间进行通讯。
.if HookFlag==FALSE
invoke InstallHook,hDlg
.if eax!=NULL
mov HookFlag,TRUE
invoke SetDlgItemText,hDlg,IDC_HOOK,addr UnhookText
.endif
该应用程序有一个全局变量,HookFlag,它用来监视钩子的状态。如果安装来钩子它就是TRUE,否则是FALSE.当用户按下Hook按钮时,应用程序检查钩子是否已经安装。如果还没有的话,它将调用DLL中引出的函数InstallHook来安装它。注意我们把主对话框的句柄传递给了DLL,这样这个钩子DLL就可以把WM_MOUSEHOOK消息传递给正确的窗口了。当应用程序加载时,钩子DLL也同时加载。时机上当主程序一旦加载到内存中后,DLL就立即加载。DLL的入口点函数载主程序的第一条语句执行前就前执行了。所以当主程序执行时,DLL已经初始化好了。我们载入口点处放入如下代码:
.if reason==DLL_PROCESS_ATTACH
push hInst
pop hInstance
.endif
该段代码把DLL自己的实例句柄放到一个全局变量中保存。由于入口点函数是在所有函数调用前被执行的,所以hInstance总是有效的。我们把该变量放到。data中,使得每一个进程都有自己一个该变量的值。因为当鼠标光标停在一个窗口上时,钩子DLL被映射进进程的地址空间。加入在DLL缺省加载的地址处已经加载其它的DLL,那钩子DLL将要被映射到其他的地址。hInstance将被更新成其它的值。当用户按下Unhook再按下Hook时,SetWindowsHookEx将被再次调用。这一次,它将把新的地址作为实例句柄。而在例子中这是错误的,DLL装载的地址并没有变。这个钩子将变成一个局部的,您只能钩挂发生在您窗口中的鼠标事件,这是很难让人满意的。
InstallHook proc hwnd:DWORD
push hwnd
pop hWnd
invoke SetWindowsHookEx,WH_MOUSE,addr MouseProc,hInstance,NULL
mov hHook,eax
ret
InstallHook endp
InstallHook 函数非常简单。它把传递过来的窗口句柄保存在hWnd中以备后用。接着调用SetWindowsHookEx函数来安装一个鼠标钩子。该函数的返回值放在全局变量hHook中,将来在UnhookWindowsHookEx中还要使用。在调用SetWindowsHookEx后,鼠标钩子就开始工作了。无论什么时候发生了鼠标事件,MouseProc函数都将被调用:
MouseProc proc nCode:DWORD,wParam:DWORD,lParam:DWORD
invoke CallNextHookEx,hHook,nCode,wParam,lParam
mov edx,lParam
assume edx:PTR MOUSEHOOKSTRUCT
invoke WindowFromPoint,[edx].pt.x,[edx].pt.y
invoke PostMessage,hWnd,WM_MOUSEHOOK,eax,0
assume edx:nothing
xor eax,eax
ret
MouseProc endp
钩子函数首先调用CallNextHookEx函数让其它的钩子处理该鼠标事件,
然后,调用WindowFromPoint函数来得到给定屏幕坐标位置处的窗口句柄。注意:我们用lParam指向的MOUSEHOOKSTRUCT型结构体变量中的POINT成员变量作为当前的鼠标位置。在我们调用PostMessage函数把WM_MOUSEHOOK消息发送到主程序。您必须记住的一件事是:在钩子函数中不要使用SendMessage函数,它会引起死锁。MOUSEHOOKSTRUCT的定义如下:
MOUSEHOOKSTRUCT STRUCT DWORD
pt POINT
hwnd DWORD ?
wHitTestCode DWORD ?
dwExtraInfo DWORD ?
MOUSEHOOKSTRUCT ENDS
pt 是当前鼠标所在的屏幕位置。
hwnd 是将接收鼠标消息的窗口的句柄。通常它是鼠标所在处的窗口,但是如果窗口调用了SetCapture,鼠标的输入将到向到这个窗口。因我们不用该成员变量而是用WindowFromPoint函数。
wHitTestCode 指定hit-test值,该值给出了更多的鼠标位置值。它指定了鼠标在窗口的那个部位。该值的完全列表,请参考WIN32 API 指南中的WM_NCHITTEST消息。
dwExtraInfo 该值包含了相关的信息。一般该值由mouse_event函数设定,可以调用GetMessageExtraInfo来获得。
当主窗口接收到WM_MOUSEHOOK 消息时,它用wParam参数中的窗口句柄来查询窗口的消息。
.elseif uMsg==WM_MOUSEHOOK
invoke GetDlgItemText,hDlg,IDC_HANDLE,addr buffer1,128
invoke wsprintf,addr buffer,addr template,wParam
invoke lstrcmpi,addr buffer,addr buffer1
.if eax!=0
invoke SetDlgItemText,hDlg,IDC_HANDLE,addr buffer
.endif
invoke GetDlgItemText,hDlg,IDC_CLASSNAME,addr buffer1,128
invoke GetClassName,wParam,addr buffer,128
invoke lstrcmpi,addr buffer,addr buffer1
.if eax!=0
invoke SetDlgItemText,hDlg,IDC_CLASSNAME,addr buffer
.endif
invoke GetDlgItemText,hDlg,IDC_WNDPROC,addr buffer1,128
invoke GetClassLong,wParam,GCL_WNDPROC
invoke wsprintf,addr buffer,addr template,eax
invoke lstrcmpi,addr buffer,addr buffer1
.if eax!=0
invoke SetDlgItemText,hDlg,IDC_WNDPROC,addr buffer
.endif
为了避免重绘文本时的抖动,我们把已经在编辑空间中线时的文本和我们将要显示的对比。如果相同,就可以忽略掉。得到类名调用GetClassName,得到窗口过程调用GetClassLong并传入GCL_WNDPROC标志,然后把它们格式化成文本串并放到相关的编辑空间中去。
invoke UninstallHook
invoke SetDlgItemText,hDlg,IDC_HOOK,addr HookText
mov HookFlag,FALSE
invoke SetDlgItemText,hDlg,IDC_CLASSNAME,NULL
invoke SetDlgItemText,hDlg,IDC_HANDLE,NULL
invoke SetDlgItemText,hDlg,IDC_WNDPROC,NULL
当用户按下Unhook后,主程序调用DL
篇4:Python多线程编程(三):threading.Thread类的重要函数和方法
这篇文章主要介绍了Python多线程编程(三):threading.Thread类的重要函数和方法,本文讲解了线程名称、join方法、setDaemon方法等内容,需要的朋友可以参考下
这篇文章主要介绍threading模块中的主类Thread的一些主要方法,实例代码如下:
代码如下:
‘‘‘
Created on -9-7
@author: walfred
@module: thread.ThreadTest3
@description:
‘‘‘
import threading
class MyThread(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self):
print “I am %s” % (self.name)
if __name__ == “__main__”:
for i in range(0, 5):
my_thread = MyThread
my_thread.start()
name相关
你可以为每一个thread指定name,默认的是Thread-No形式的,如上述实例代码打印出的一样:
代码如下:
I am Thread-1
I am Thread-2
I am Thread-3
I am Thread-4
I am Thread-5
当然你可以指定每一个thread的name,这个通过setName方法,代码:
代码如下:
def __init__(self):
threading.Thread.__init__(self)
self.setName(“new” + self.name)
join方法
join方法原型如下,这个方法是用来阻塞当前上下文,直至该线程运行结束:
代码如下:
def join(self, timeout=None):
timeout可以设置超时
timeout可以设置超时蚕食
setDaemon方法
当我们在程序运行中,执行一个主线程,如果主线程又创建一个子线程,主线程和子线程就分兵两路,当主线程完成想退出时,会检验子线程是否完成,
Python多线程编程(三):threading.Thread类的重要函数和方法
,
如果子线程未完成,则主线程会等待子线程完成后再退出。但是有时候我们需要的是,只要主线程完成了,不管子线程是否完成,都要和主线程一起退出,这时就可以用setDaemon方法,并设置其参数为True。
当然这上面列举的只是我们在编程是经常使用到的方法,更多方法,可以参见:Higher-level threading interface
篇5:无纸化考试系统开发中的编程方法和技巧
无纸化考试系统开发中的编程方法和技巧
无纸化考试系统具有:用户注册、随机出卷、在线考试、时间控制、自动判卷、题库建立和管理、用户管理、成绩统计、报表打印等重要功能.本文结合<无纸化考试系统的研究与实现>课题的开发,介绍了有关Delphi编程技术、SQL Senrer数据库技术和计算机网络技术的一些编程方法和技巧.
作 者:刘忠民 陈利国 作者单位:郑州铁路职业技术学院,河南,郑州,450052 刊 名:郑州铁路职业技术学院学报 英文刊名:JOURNAL OF ZHENGZHOU RAILWAY VOCATIONAL AND TECHNICAL COLLEGE 年,卷(期): 21(2) 分类号:U2 关键词:无纸化考试 Delphi编程 数据库技术 SQL senrer篇6:Turbo C在图形状态下快速显示彩色汉字的方法
Turbo C在图形状态下快速显示彩色汉字的方法
在用Turbo C提供的图形函数进行作图时,为了使屏幕显示更加直观明了,常常需要在图形显示的同时,显示必要的汉字说明。这时Turbo C提供的一些函数就不能用了。在汉字操作系统中,有一个16×16点阵的汉字库,主要用于屏幕显示。字库中的汉字按16×16点阵模式存储,即每个汉字相当于16×16=256个点组成。占用16×2=32个连续的字节单元。字节的每一位(bit)表示一个点的属性:1表示亮点,0表示暗点。连续的两个字节表示该汉字字模的一行。32个字节的排列顺序如图:
@@T5S08100.GIF;图1@@
计算机对西文字符采用一个字节表示,我国规定汉字用内码(2个字节)表示。为了保证中西文兼容,也就是说,汉字系统的内码必须同时允许ASCII码和汉字的同时使用,而两者之间不能发生冲突。目前规定每个字节只用七位,若两个字节的最高位均为1,则该字符为汉字。
国标对汉字库的结构作了统一的规定:即将汉字库分为若干个区,每个区有94个汉字。
每一个汉字在字库中有一个固定的区和位,即每一个汉字有一个区位码。知道了区位码也就相当于知道了汉字在字库中的位置。由于汉字的内码与区位码有一定的关系,所以,只要通过内码就可以得到区位码,从而也就得到了汉字的字模。
设一个汉字的内码为ddff,则此汉字的区码为dd-161;位码为ff-161;该汉字字模的第一个字节在字库中的位置是(94×区码 位码)×32。这时只要连续的读出32个字节,就可以得到该汉字的.字模。
有些文章和书籍采用写点的方式来处理这32个字节。即某位为1,则写点,某位为0,则不写点。如果这样处理,则每个汉字需循环256次,写256个点,字数越多,则会显得很慢。
Turbo C提供了这样两个函数:
setlinestyle(int linestyle,unsignedupattern,int thickness);
line(int x0,int y0,int x1,int y1);
setlinestyle函数为设置线型函数,当linestyle取USERBIT-LINE且thickness取NORM-WIDTH时,其后的line函数就会按upattern的16位二进制数画一点宽的线。upattern的每一位代表一个象元,如果那位为1,则该象元打开,否则该象元关闭。
我们在读字模的时候可以一次读2个字节,形成一个16位的二进制数,把此二进制数设为upattern,然后画线。这样只需循环16次就可写完一个汉字。速度得到很大的提高。尤其在字数较多时,更体现出此方法的优势。
以下为用画线的方法在西文状态下显示汉字的函数,在Turbo C 1.0、DOS6.0、兼容386机上运行通过。
#include
#include
#include
FILE *stream; //设 stream为全程变量//
void open-file()
{//打开汉字库函数,使用的汉字库为UCDOS的16点阵字库:HZK16//
if((stream=fopen(“hzk16”,“rb”))==NULL)
{ printf(“Can't Open File HZK16”); exit(1);}
}
void close-file()
{//关闭汉字库函数//
fclose(stream); return;
}
void write16(unsigned char *word,int x,int y,int wd,int col)
{//word为所要显示的汉字串,x,y为要显示汉字的起始坐标,wd为两个汉字//
//之间的间隔,col为要显示汉字的颜色.//
register int k,i;
unsigned char cw[33];
char c[2];
unsigned long int qu-ma,wei-ma;
setcolor(col);settextstyle(0,HORIZ-DIR,1);
for(k=0;word[k]!='/0';k =2)
[1] [2]
★ 计算机基础教案
★ 计算机基础课件
★ WIN技巧:ExchangeOutlookWebAccess疑难解答
【汉字图形窗口界面设计方法及函数编程技巧(精选6篇)】相关文章:
计算机试题2022-10-16
计算机一级考试经验2022-05-07
计算机的教学计划2022-12-23
五年级计算机教学计划2022-08-08
《形块的分割与构成》的说课稿2023-09-21
计算机老师教学计划2022-09-04
计算机应用基础试卷及答案2022-07-22
计算机应用基础报告2023-04-07
计算机专升本教学计划2024-05-17
信息技术考试试题2022-04-29