怎么获取当前光标所在的坐标值?

春风老少年 2009-02-19 10:16:14
比如我在QQ的聊天框里点一下,有哪个函数可以获取并返回当前光标所在的坐标值?
我在看雪看到说,API里的GetCaretPos()似乎不太稳定,还有没有别的函数有类似的功能?

PS.
...全文
106 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
春风老少年 2009-02-20
  • 打赏
  • 举报
回复
自己解决了,没找到别的函数,还是用的GetCaretPos()
要分的来喽~,要不就给系统了~
      在程序员眼中,Windows的用户界面就是一个由无数个大小窗口组合在一起的整体。密码框也不例外, 它是一个具有ES_PASSWORD风格的"TEdit"类子窗口控制。既然它是一个窗口,就难免具有一些Windows窗口所共有的特性: 有一个窗口过程;可以接收消息。 或许你已经知道,向文本框发送一个WM_GETTEXTLENGTH消息,就能获得文本框中的字符串长度。 如果向文本框发送一个WM_GETTEXT消息,就能获得文本框中的字符串。这两个消息对密码框同样有效,因为它们都是基于 "TEdit"类所创建的子窗口控制,只是风格不同罢了。 我们可以用以下两行代码来获取密码了: iLength = SendMessage(hwnd, WM_GETTEXTLENGTH, 0, 0) ; SendMessage(hwnd, WM_GETTEXT, (WPARAM)(iLength + 1), (LPARAM)(pStrPassWord)) ; 问题1:SendMessage函数需要密码框的窗口句柄作为参数, 如何得到密码框的窗口句柄呢? 很简单,使用WindowFormPoint API函数。该函数接受一个POINT类结构的参数, 并返回包含该点的窗口句柄,函数原型如下: HWND WindowFromPoint(POINT point) ; 知识准备充足,代码如下: /*------------------------------------ *号查看器v1.0 20110407 Ra -------------------------------------*/ #include #define WM_GETCODE WM_USER+1 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM) ; LRESULT CALLBACK EditProc(HWND, UINT, WPARAM, LPARAM) ; WNDPROC OldProc ; POINT point ; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT("GetCode") ; MSG msg ; HWND hwnd ; WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon(NULL, IDI_WINLOGO) ; wndclass.hCursor = LoadCursor(NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1) ; wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = szAppName ; if (!RegisterClass(&wndclass)) { MessageBox(NULL, TEXT("This program requires Windows NT!") , szAppName, MB_ICONERROR) ; return 0 ; } hwnd = CreateWindowEx(WS_EX_TOPMOST, szAppName, TEXT("*号查看器"), WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL) ; ShowWindow(hwnd, iCmdShow) ; UpdateWindow(hwnd) ; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg) ; DispatchMessage(&msg) ; } return msg.wParam ; } LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static HWND hwndEdit ; static HINSTANCE hInstance ; switch(message) { case WM_CREATE: hInstance = (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE) ; hwndEdit = CreateWindow(TEXT("button"), TEXT("请将此按钮拖放到你想查看的*号上"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 0, 0, 0, 0, hwnd, (HMENU)1,hInstance, NULL) ; OldProc = (WNDPROC)SetWindowLong(hwndEdit, GWL_WNDPROC, (LONG)EditProc) ; //改变指定窗口的属性 //GWL_WNDPROC:为窗口过程设定一个新的地址 return 0 ; case WM_SIZE: TEXTMETRIC tm ; HDC hdc ; int cxChar, cyChar, cxScreen, cyScreen, iWndWidth, iWndHeight ; //确定主窗口宽度与高度 cxScreen = GetSystemMetrics(SM_CXSCREEN) ; cyScreen = GetSystemMetrics(SM_CYSCREEN) ; iWndWidth = cxScreen / 10 * 4 ; iWndHeight = cyScreen / 4 ; //确定字符宽度与高度 hdc = GetDC(hwnd) ; GetTextMetrics(hdc, &tm) ; cxChar = tm.tmAveCharWidth ; cyChar = tm.tmHeight + tm.tmExternalLeading ; MoveWindow(hwnd, cxScreen / 100, cyScreen / 100, iWndWidth, iWndHeight, TRUE) ; MoveWindow(hwndEdit, (iWndWidth - cxChar * 38) / 2, iWndHeight / 3, cxChar * 38, cyChar + 10, TRUE) ; //对指定的窗口设置键盘焦点。该窗口必须与调用线程的消息队列相关。 SetFocus(hwnd) ; return 0 ; case WM_GETCODE: HWND hwndDst ; int iLength ; TCHAR PassWord[255], ClassName[255] ; //获得包含指定点的窗口的句柄。 hwndDst = WindowFromPoint(point) ; if (hwndDst == hwndEdit || hwndDst == hwnd) { MessageBox(hwnd, TEXT("如果你有任何意见或建议,请与我联系:td1126@163.com"), TEXT("关于 Ra"), MB_ICONINFORMATION) ; return 0 ; } iLength = GetClassName(hwndDst, ClassName, 255) ; if (!iLength) { MessageBox(hwnd, TEXT("获取类名失败!"), TEXT("Error"), MB_ICONERROR) ; return 0 ; } if (strncmp((char *)ClassName, (char *)"TEdit",4) != 0) { MessageBox(hwnd, TEXT("目标位置不是一个密码框!"), TEXT("Error"), MB_ICONERROR) ; //return 0 ; } iLength = SendMessage(hwndDst, WM_GETTEXTLENGTH, 0, 0) ; SendMessage(hwndDst, WM_GETTEXT, (WPARAM)(iLength + 1), (LPARAM)PassWord) ; MessageBox(hwnd, PassWord, TEXT("你想得到的密码是:"), MB_OK) ; return 0 ; case WM_DESTROY: PostQuitMessage(0) ; return 0 ; } return DefWindowProc(hwnd, message, wParam, lParam) ; } LRESULT CALLBACK EditProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static HCURSOR hOldCursor, hMyCursor ; switch(message) { case WM_LBUTTONDOWN: //从一个与应用事例相关的可执行文件(EXE文件)中载入指定的光标资源。 hMyCursor = LoadCursor(NULL, MAKEINTRESOURCE(IDC_CROSS)) ; //该函数确定光标的形状。 hOldCursor = SetCursor(hMyCursor) ; SetCapture(hwnd) ; return 0 ; case WM_LBUTTONUP: //从当前线程中的窗口释放鼠标捕获,并恢复通常的鼠标输入处理。捕获鼠标的窗口接收所有的鼠标输入(无论光标的位置在哪里),除非点击鼠标键时,光标热点在另一个线程的窗口中。 ReleaseCapture() ; SetCursor(hOldCursor) ; point.x = LOWORD(lParam) ; point.y = HIWORD(lParam) ; //将指定点,或者矩形的用户坐标转换成屏幕坐标。 ClientToScreen(hwnd, &point) ; SendMessage(GetParent(hwnd), WM_GETCODE, 0, 0) ; return 0 ; } return CallWindowProc(OldProc, hwnd, message, wParam, lParam) ; } WM_GETCODE是用户自定义消息,根据Windows编程规则,它的值应大于0X0400,我们把它定义为WM_USER+1,即:0X0401。point是一个POINT类全局结构变量,用来保存密码框的坐标值。 主窗口过程在WM_CREATE消息期间创建了一个按钮控制hwndEdit,并使用窗口子类化技术给它安装了一个钩子,捕获它的WM_LBUTTONDOWN、WM_LBUTTONUP消息。这时,Windows的内部窗口过程就不能再处理这两个消息,所以,我们在按钮上单击鼠标左键时,不会再看到按钮被按下并弹起的视觉效果,但这点对我们并不重要。 当用户在按钮控制上按下鼠标左键时,Windows会向按钮控制发送一个WM_LBUTTONDOWN消息,这个消息会被我们编写的EditProc窗口过程捕获,我们对这个消息的处理很简单:将鼠标光标设置为十字型,并捕获鼠标。鼠标被捕获后,所有的鼠标消息都将被发送到按钮控制的窗口过程,即EditProc。但我们只处理鼠标消息的WM_LBUTTONUP消息,而使用 return CallWindowProc(OldProc, hwnd, message, wParam, lParam) ; 将其它的消息交由Windows的内部窗口过程处理。 在WM_LBUTTONUP消息期间,我们先撤消对鼠标的捕获,再将鼠标光标恢复原状,然后保存鼠标左键释放时的坐标位置。注意,这个坐标值是相对于按钮控制的客户区坐标,所以我们必须使用ClientToScreen函数将它转换成屏幕坐标。最后,使用SendMessage函数给主窗口发送一个WM_GETCODE自定义消息,把余下的工作交给主窗口过程处理。 主窗口过程的WM_GETCODE消息逻辑,是程序的核心。它先使用WindowFromPoint函数获得鼠标释放时,鼠标光标所在位置的窗口句柄。如果鼠标是在本程序的窗口内释放,将弹出一个关于消息框。否则,就将获得的窗口句柄进行判断,如果是一个密码框,就给它发送WM_GETTEXTLENGTH、WM_GETTEXT消息,获取密码。 问题2: 利用本程序为什么不能查看QQ密码? 如果你确实用本程序查看过QQ密码的话,那么你会发现你获取的窗口一直是主窗口(父窗口),因为QQ页面设置时利用了一项新技术,具体叫什么名字我忘记了,QQ页面中并没有其他的控件,帐户、密码的输入框并不是windows控件,而是类似于画上去的图形,所以我们无法获取它的句柄,从而无法查看QQ密码。
软件简介: MAPGIS6.5实用工具,集成若干MAPGIS6.5不具有的实用功能,简单易用。 普通版有以下特色功能: 1、精确制图功能(类似于AutoCAD)。画线、移动、复制图元时,都可以输入距离和角度,还可以捕捉端点(按SHIFT)、中点(按CTRL)、交点(按SPACE)、垂足(按ALT)等,F2为正交开关,CTRL+D为线段单选开关。 2、滚轮缩放功能。向前滚动图形放大,向后滚动图形缩小,按下滚轮图形平移。 3、格式刷功能。点、线、区都可以运用格式刷进行修改和编辑。 4、查询图元功能。自动查找文本、属性、子图、颜色等。 5、参数拾取功能。拾取点、线、区参数作为当前编辑参数。 6、等距排列功能。文本或图例都可以进行横向、纵向的等距离自动排列。 7、快速制表功能。利用画水平线、竖直线以及捕足功能,输入距离移动、复制、拉伸线条功能,可以快速绘制各种表格。 8、测量距离功能。测量直线段或多段折线的距离或长度,可以使用捕捉功能。 9、测量面积功能。测量面积不需要造区,按顺序点击拐点即可,也可选择一条闭合的线段,即可测量面积。可以直接测量线图元的方位角。 10、测量角度功能。选择直线段可以测量该线段的的方位角及象限角。 11、面积换算功能。直接将测量出来的图上面积转换为实际面积。 12、面积标注功能。点击某块区域,自动标注该区域的面积,可带引线标注。 13、坐标标注功能。在图上单击某个点,即可标出该点的图上坐标或实际坐标值,可带引线标注。 14、比例造线功能。确定比例尺后,输入以米为单位的数据时,可以自动转换为图上距离,不需要人工换算,同时可以输入距离和角度。 15、线段拉伸功能。能够将线段进行拉伸,所有选中的线节点将同时拉伸,同时可以输入距离和角度。 16、线段切除功能。互相相交的线段,选择其中一条,可以切除另外一条线段在该线段两侧的部分,也可以切除夹在两条线段中间的部分。 17、线段交会功能。选择两条不平行的线段,可以使其相交于某一点,已经相交的两条线段,可以切除交点任意一侧的部分。 18、线段炸开功能。将多段线在节点处分开,生成若干条线段。 19、线段旋转功能。输入一个角度值,并确定一个旋转基点,即可精确旋转一条线段。 20、改线长度功能。选项择一条线段,可以直接修改该线段的长度值。 21、属性编辑功能。采用电子表格的方式对图元属性进编辑,与excel、acsses能够直接互相复制、粘贴,并且能够实现图形联动、属性联动等操作。 22、属性提取功能。输入属性提取条件,能够将点、线、区中符合条件的图元提取到新的文件中。 23、属性标注功能。选择某个字段,可以将该字段的属性值标注在图元的相应位置上。 24、属性动态显示。选择某个点线区文件,可以将某个字段或所有字段的属性值,随着鼠标的移动,适时动态地显示出来。 25、ID关联功能。将点线区相应位置上的图元ID修改为同一属性值,排序后能够将点线区对应的属性值进行批量拷贝。 26、删除指定图元。可以根据图元ID能及图元属性有条件地对图元批量删除。 27、删除重叠图元。自动搜索互相重叠的图元,删除多余的重叠图元。 28、匹配图例参数。选择某个图例,可以将该图例的参数及属性值全部赋给相应的图元。 29、自动生成样槽。选择两条节点数相同的平行线段,能够自动生成黑白相间的样槽。 30、批量替换注释。输入若干条需要替换的注释,可以一次性进行替换,并自动保存替换数据,下次或打开另外一张图时仍可使用,不需要重新输入。 31、整图栽剪功能。不需要生成单独的栽剪框文件,只要选择工程文件中任一条封闭的线就会自动对工程中的所有可见文件进行栽剪,栽剪后的文件自动保存在新建的目录中,每次栽剪都会生成一个新的目录,栽剪后的文件名与原文件名一致。 32、CAD转MapGis。本功能可以将AutoCAD格式的图形文件转换成MapGis格式的图形文件,能将CAD中的充填图案直接转换成MapGis中的区图元,而且能将CAD中的内部块、多行文本直接转出,不需要在CAD中分解。完全按照CAD中的图层分层转出所有可见图元,颜色、线型自动转换,不需要对照表,所有操作全自动。并能够将CASS中生成的地物编码转为MapGis图元属性。 33、Excel转MapGis。本功能可以将 Microsoft Office Excel 电子表格文件中的各种表格直接转换成MapGis格式的点、线、面文件。 34、自动画柱状图。本功能可以将保存在 Microsoft Office Excel 电子表格文件中的钻孔数据绘制成钻孔柱
(1) 分数的输入如果直接输入“1/5”,系统会将其变为“1月5日”,解决办法是:先输入“0”,然后输入空格,再输入分数“1/5”。(2) 序列“001”的输入如果直接输入“001”,系统会自动判断001为数据1,解决办法是:首先输入“'”(西文单引号),然后输入“001”。(3) 日期的输入如果要输入“4月5日”,直接输入“4/5”,再敲回车就行了。如果要输入当前日期,按一下“Ctrl+;”键。(4) 填充条纹如果想在工作簿中加入漂亮的横条纹,可以利用对齐方式中的填充功能。先在一单元格内填入“*”或“~”等符号,然后单击此单元格,向右拖动鼠标,选中横向若干单元格,单击“格式”菜单,选中“单元格”命令,在弹出的“单元格格式”菜单中,选择“对齐”选项卡,在水平对齐下拉列表中选择“填充”,单击“确定”按钮(如图1)。图1(5) 多张工作表中输入相同的内容几个工作表中同一位置填入同一数据时,可以选中一张工作表,然后按住Ctrl键,再单击窗口左下角的Sheet1、Sheet2......来直接选择需要输入相同内容的多个工作表,接着在其中的任意一个工作表中输入这些相同的数据,此时这些数据会自动出现在选中的其它工作表之中。输入完毕之后,再次按下键盘上的Ctrl键,然后使用鼠标左键单击所选择的多个工作表,解除这些工作表的联系,否则在一张表单中输入的数据会接着出现在选中的其它工作表内。(6) 不连续单元格填充同一数据选中一个单元格,按住Ctrl键,用鼠标单击其他单元格,就将这些单元格全部都选中了。在编辑区中输入数据,然后按住Ctrl键,同时敲一下回车,在所有选中的单元格中都出现了这一数据。(7) 在单元格中显示公式如果工作表中的数据多数是由公式生成的,想要快速知道每个单元格中的公式形式,以便编辑修改,可以这样做:用鼠标左键单击“工具”菜单,选取“选项”命令,出现“选项”对话框,单击“视图”选项卡,接着设置“窗口选项”栏下的“公式”项有效,单击“确定”按钮(如图2)。这时每个单元格中的分工就显示出来了。如果想恢复公式计算结果的显示,就再设置“窗口选项”栏下的“公式”项失效即可。图2(8) 利用Ctrl+*选取文本如果一个工作表中有很多数据表格时,可以通过选定表格中某个单元格,然后按下Ctrl+*键可选定整个表格。Ctrl+*选定的区域为:根据选定单元格向四周辐射所涉及到的有数据单元格的最大区域。这样我们可以方便准确地选取数据表格,并能有效避免使用拖动鼠标方法选取较大单元格区域时屏幕的乱滚现象。(9) 快速清除单元格的内容如果要删除内容的单元格中的内容和它的格式和批注,就不能简单地应用选定该单元格,然后按Delete键的方法了。要彻底清除单元格,可用以下方法:选定想要清除的单元格或单元格范围;单击“编辑”菜单中“清除”项中的“全部”命令,这些单元格就恢复了本来面目。2、单元格内容的合并根据需要,有时想把B列与C列的内容进行合并,如果行数较少,可以直接用“剪切”和“粘贴”来完成操作,但如果有几万行,就不能这样办了。解决办法是:在C行后插入一个空列(如果D列没有内容,就直接在D列操作),在D1中输入“=B1&C1;”,D1列的内容就是B、C两列的和了。选中D1单元格,用鼠标指向单元格右下角的小方块“■”,当光标变成"+"后,按住鼠标拖动光标向下拖到要合并的结尾行处,就完成了B列和C列的合并。这时先不要忙着把B列和C列删除,先要把D列的结果复制一下,再用“选择性粘贴”命令,将数据粘贴到一个空列上。这时再删掉B、C、D列的数据。下面是一个“&”实际应用的例子。用AutoCAD绘图时,有人喜欢在EXCEL中存储坐标点,在绘制曲线时调用这些参数。存放数据格式为“x,y”的形式,首先在Excel中输入坐标值,将x坐标值放入A列,y坐标值放入到B列,然后利用“&”将A列和B列合并成C列,在C1中输入:=A1&","&B1;,此时C1中的数据形式就符合要求了,再用鼠标向下拖动C1单元格,完成对A列和B列的所有内容的合并(如图3-4)。合并不同单元格的内容,还有一种方法是利用CONCATENATE函数,此函数的作用是将若干文字串合并到一个字串中,具体操作为“=CONCATENATE(B1,C1)”。比如,假设在某一河流生态调查工作表中,B2包含“物种”、B3包含“河鳟鱼”,B7包含总数45,那么: 输入“=CONCATENATE("本次河流生态调查结果:",B2,"",B3,"为",B7,"条/公里。")” 计算结果为:本次河流生态调查结果:河鳟鱼物种为45条/公里。图3图43、条件显示我们知道,利用If函数,可以实现按照条件显示。一个常用的例子,就是教师在统计学生成绩时,希望输入60以下的分数时,能显示为“不及格”;输入60以上的分数时,显示为“及格"。这样的效果,利用IF函数可以很方便地实现。 假设成绩在A2单元格中,判断结果在A3单元格中。那么在A3单元格中输入公式: =if(A2<60,“不及格”,“及格”) 同时,在IF函数中还可以嵌套IF函数或其它函数。例如,如果输入: =if(A2<60,“不及格”,if(A2<=90,“及格”,“优秀")) 就把成绩分成了三个等级。如果输入=if(A2<60,“差",if(A2<=70,“中”,if(A2<90,“良”,“优”))) 就把成绩分为了四个等级。再比如,公式: =if(SUM(A1:A5>0,SUM(A1:A5),0) 此式就利用了嵌套函数,意思是,当A1至A5的和大于0时,返回这个值,如果小于0,那么就返回0。 还有一点要提醒你注意:以上的符号均为半角,而且IF与括号之间也不能有空格。4、自定义格式Excel中预设了很多有用的数据格式,基本能够满足使用的要求,但对一些特殊的要求,如强调显示某些重要数据或信息、设置显示条件等,就要使用自定义格式功能来完成。 Excel的自定义格式使用下面的通用模型:正数格式,负数格式,零格式,文本格式,在这个通用模型中,包含三个数字段和一个文本段:大于零的数据使用正数格式;小于零的数据使用负数格式;等于零的数据使用零格式;输入单元格的正文使用文本格式。 我们还可以通过使用条件测试,添加描述文本和使用颜色来扩展自定义格式通用模型的应用。(1)使用颜色 要在自定义格式的某个段中设置颜色,只需在该段中增加用方括号括住的颜色名或颜色编号。Excel识别的颜色名为:[黑色]、[红色]、[白色]、[蓝色]、[绿色]、[青色]和[洋红]。Excel也识别按[颜色X]指定的颜色,其中X是1至56之间的数字,代表56种颜色(如图5)。图5(2)添加描述文本 要在输入数字数据之后自动添加文本,使用自定义格式为:"文本内容"@;要在输入数字数据之前自动添加文本,使用自定义格式为:@"文本内容"。@符号的位置决定了Excel输入的数字数据相对于添加文本的位置。(3)创建条件格式 可以使用六种逻辑符号来设计一个条件格式:>(大于)、>=(大于等于)、<(小于)、<=(小于等于)、=(等于)、<>(不等于),如果你觉得这些符号不好记,就干脆使用“>”或“>=”号来表示。由于自定义格式中最多只有3个数字段,Excel规定最多只能在前两个数字段中包括2个条件测试,满足某个测试条件的数字使用相应段中指定的格式,其余数字使用第3段格式。如果仅包含一个条件测试,则要根据不同的情况来具体分析。自定义格式的通用模型相当于下式:[>;0]正数格式;[<;0]负数格式;零格式;文本格式。下面给出一个例子:选中一列,然后单击“格式”菜单中的“单元格”命令,在弹出的对话框中选择“数字”选项卡,在“分类”列表中选择“自定义”,然后在“类型”文本框中输入“"正数:"($#,##0.00);"负数:"($ #,##0.00);"零";"文本:"@”,单击“确定”按钮,完成格式设置。这时如果我们输入“12”,就会在单元格中显示“正数:($12.00)”,如果输入“-0.3”,就会在单元格中显示“负数:($0.30)”,如果输入“0”,就会在单元格中显示“零”,如果输入文本“this is a book”,就会在单元格中显示“文本:this is a book”。 如果改变自定义格式的内容,“[红色]"正数:"($#,##0.00);[蓝色]"负数:"($ #,##0.00);[黄色]"零";"文本:"@”,那么正数、负数、零将显示为不同的颜色。如果输入“; ;[Yellow];[Green]”,那么正数、负数、零和文本将分别显示上面的颜色(如图6)。图6 再举一个例子,假设正在进行帐目的结算,想要用蓝色显示结余超过$50,000的帐目,负数值用红色显示在括号中,其余的值用缺省颜色显示,可以创建如下的格式: “[蓝色][>50000] $#,##0.00_);[红色][<0]( $#,##0.00); $#,##0.00_)” 使用条件运算符也可以作为缩放数值的强有力的辅助方式,例如,如果所在单位生产几种产品,每个产品中只要几克某化合物,而一天生产几千个此产品,那么在编制使用预算时,需要从克转为千克、吨,这时可以定义下面的格式: “[>999999]#,##0,,_m"吨"";[>999]##,_k_m"千克";#_k"克"” 可以看到,使用条件格式,千分符和均匀间隔指示符的组合,不用增加公式的数目就可以改进工作表的可读性和效率。另外,我们还可以运用自定义格式来达到隐藏输入数据的目的,比如格式";##;0"只显示负数和零,输入的正数则不显示;格式“;;;”则隐藏所有的输入值。 自定义格式只改变数据的显示外观,并不改变数据的值,也就是说不影响数据的计算。灵活运用好自定义格式功能,将会给实际工作带来很大的方便。5、绘制函数图象做教学工作的朋友们一定会遇到画函数曲线的问题吧!如果想快速准确地绘制一条函数曲线,可以借助EXCEL的图表功能,它能使你画的曲线既标准又漂亮。你一定会问,是不是很难学呀?其实这一点儿也不难,可以说非常简便,不信你就跟我试一试。以绘制y=|lg(6+x^3)|的曲线为例,其方法如下: 在某张空白的工作表中,先输入函数的自变量:在A列的A1格输入"X=",表明这是自变量,再在A列的A2及以后的格内逐次从小到大输入自变量的各个值;实际输入的时候,通常应用等差数列输入法,先输入前二个值,定出自变量中数与数之间的步长,然后选中A2和A3两个单元格,使这二项变成一个带黑色边框的矩形,再用鼠标指向这黑色矩形的右下角的小方块“■”,当光标变成"+"后,按住鼠标拖动光标到适当的位置,就完成自变量的输入。输入函数式:在B列的B1格输入函数式的一般书面表达形式,y=|lg(6+x^3)|;在B2格输入“=ABS(LOG10(6+A2^3))”,B2格内马上得出了计算的结果。这时,再选中B2格,让光标指向B2矩形右下角的“■”,当光标变成"+"时按住光标沿B列拖动到适当的位置即完成函数值的计算。图7绘制曲线:点击工具栏上的“图表向导”按钮,选择“X,Y散点图”(如图7),然后在出现的“X,Y散点图”类型中选择“无数据点平滑线散点图”;此时可察看即将绘制的函数图像,发现并不是我们所要的函数曲线,单击“下一步”按钮,选中“数据产生在列”项,给出数据区域,这时曲线就在我们面前了(如图8)。图8需要注意:如何确定自变量的初始值,数据点之间的步长是多少,这是要根据函数的具体特点来判断,这也是对使用者能力的检验。如果想很快查到函数的极值或看出其发展趋势,给出的数据点也不一定非得是等差的,可以根据需要任意给定。从简单的三角函数到复杂的对数、指数函数,都可以用EXCEL画出曲线。如果用得到,你还可以利用EXCEL来完成行列式、矩阵的各种计算,进行简单的积分运算,利用迭代求函数值(如x^2=x^7+4,可用迭代方法求x值),等等,凡是涉及计算方面的事,找EXCEL来帮忙,它一定会给你一个满意的答案。6、自定义函数虽然Excel中已有大量的内置函数,但有时可能还会碰到一些计算无函数可用的情况。假如某公司采用一个特殊的数学公式计算产品购买者的折扣,如果有一个函数来计算岂不更方便?下面就说一下如何创建这样的自定义函数。自定义函数,也叫用户定义函数,是Excel最富有创意和吸引力的功能之一,下面我们在Visual Basic模块中创建一个函数。 在下面的例子中,我们要给每个人的金额乘一个系数,如果是上班时的工作餐,就打六折;如果是加班时的工作餐,就打五折;如果是休息日来就餐,就打九折。首先打开“工具”菜单,单击“宏”命令中的“Visual Basic编辑器”,进入Visual Basic编辑环境,在“工程-VBAobject”栏中的当前表上单击鼠标右键,选择“插入”-“模块”,在右边栏创建下面的函数rrr,代码如下: Function rrr(tatol, rr) If rr = "上班" Then rrr = 0.6 * tatol ElseIf rr = "加班" Then rrr = 0.5 * tatol ElseIf rr = "休息日" Then rrr = 0.9 * tatol End If End Function (如图9)。图9这时关闭编辑器,只要我们在相应的列中输入rrr(F2,B2),那么打完折后的金额就算出来了(如图10)。图107、矩阵计算Excel的强大计算功能,不但能够进行简单的四则运算,也可以进行数组、矩阵的计算。(1)数组和矩阵的定义矩阵不是一个数,而是一个数组。在Excel里,数组占用一片单元域,单元域用大括号表示,例如{A1:C3},以便和普通单元域A1:C3相区别。设置时先选定单元域,同时按Shift+Ctrl+Enter键,大括弧即自动产生,数组域得以确认。一个单元格就是一个变量,一片单元域也可以视为一组变量。为了计算上的方便,一组变量最好给一个数组名。例如A={A1:C3}、B={E1:G3}等。数组名的设置步骤是:选定数组域,单击“插入”菜单,选择“名称”项中的“定义”命令,输入数组名,单击“确定”按钮即可。更简单的命名办法为:选择数组域,单击名称框,直接输入名称就行了。矩阵函数是Excel进行矩阵计算的专用模块。用“插入”-“函数”命令打开“粘贴函数”对话框(如图11),选中函数分类栏中的“数学与三角函数”,在右边栏常用的矩阵函数有: MDETERM——计算一个矩阵的行列式; MINVERSE——计算一个矩阵的逆矩阵; MMULT——计算两个矩阵的乘积; SUMPRODUCT——计算所有矩阵对应元素乘积之和。图11(2)矩阵的基本计算数组计算和矩阵计算有很大的区别,比如下面这个例子中,A和B都是定义好的数组,因为这两个数组都是3×3的,输出结果也是3×3个单元格。计算时先选定矩阵计算结果的输出域,为3×3的单元格区域,然后输入公式。如果输入“=A+B”或“=A-B”,计算结果是数组对应项相加或相减,输入“=A*B”表示数组A和B相乘,输入“=A/B”表示数组A除数组B。如果要进行矩阵计算,就要用到相应的矩阵函数。矩阵相加、相减与数组的加减表达形式是一样的,也是“=A+B”和“=A-B”,表示矩阵相乘可以输入“=MMULT(A,B)”,而矩阵相除是矩阵A乘B的逆矩阵,所以计算公式是“=MMULT(A,MINVERSE(B))”。公式输入后,同时按Shift+Ctrl+Enter键得到计算结果。 对于更复杂的矩阵计算,可以采用分步计算。8、自动切换输入法在一张工作表中,往往是既有数据,又有文字,这样在输入时就需要来回在中英文之间反复切换输入法,非常麻烦。 如果你要输入的东西很有规律性,比如这一列全是单词,下一列全是汉语解释,你可以用以下方法实现自动切换。方法是:(1)选中要输入英文的列,单击“数据”菜单,选择“有效性...”命令,在弹出的“数据有效性”对话框中,选中“输入法模式”选项卡,在“模式”框中选择“关闭(英文模式)”命令,单击“确定”按钮(如图12)。图12(2)选中要输入汉字的列,在“有效数据”对话框中,单击“IME模式”选项卡,在“模式”框中选择“打开”命令,单击“确定”按钮。这样,当光标在前一列时,可以输入英文,在下一列时,直接可以输入中文,从而实现了中英文输入方式之间的自动切换。9、批量删除空行有时我们需要删除Excel工作薄中的空行,一般做法是将空行一一找出,然后删除。如果工作表的行数很多,这样做就非常不方便。我们可以利用“自动筛选”功能,把空行全部找到,然后一次性删除。 做法:先在表中插入新的一个空行,然后按下Ctrl+A键,选择整个工作表,用鼠标单击“数据”菜单,选择“筛选”项中的“自动筛选”命令。这时在每一列的顶部,都出现一个下拉列表框,在典型列的下拉列表框中选择“空白”,直到页面内已看不到数据为止(如图13)。图13在所有数据都被选中的情况下,单击“编辑”菜单,选择“删除行”命令,然后按“确定”按钮。这时所有的空行都已被删去,再单击“数据”菜单,选取“筛选”项中的“自动筛选”命令,工作表中的数据就全恢复了。插入一个空行是为了避免删除第一行数据。如果想只删除某一列中的空白单元格,而其它列的数据和空白单元格都不受影响,可以先复制 此列,把它粘贴到空白工作表上,按上面的方法将空行全部删掉,然后再将此列复制,粘贴到原工作表的相应位置上。10、如何避免错误信息在Excel中输入公式后,有时不能正确地计算出结果,并在单元格内显示一个错误信息,这些错误的产生,有的是因公式本身产生的,有的不是。下面就介绍一下几种常见的错误信息,并提出避免出错的办法。1)错误值:####含义:输入到单元格中的数据太长或单元格公式所产生的结果太大,使结果在单元格中显示不下。或是日期和时间格式的单元格做减法,出现了负值。解决办法:增加列的宽度,使结果能够完全显示。如果是由日期或时间相减产生了负值引起的,可以改变单元格的格式,比如改为文本格式,结果为负的时间量。2)错误值:#DIV/0!含义:试图除以0。这个错误的产生通常有下面几种情况:除数为0、在公式中除数使用了空单元格或是包含零值单元格的单元格引用。解决办法:修改单元格引用,或者在用作除数的单元格中输入不为零的值。3)错误值:#VALUE!含义:输入引用文本项的数学公式。如果使用了不正确的参数或运算符,或者当执行自动更正公式功能时不能更正公式,都将产生错误信息#VALUE!。解决办法:这时应确认公式或函数所需的运算符或参数正确,并且公式引用的单元格中包含有效的数值。例如,单元格C4中有一个数字或逻辑值,而单元格D4包含文本,则在计算公式=C4+D4时,系统不能将文本转换为正确的数据类型,因而返回错误值#VALUE!。4)错误值:#REF!含义:删除了被公式引用的单元格范围。解决办法:恢复被引用的单元格范围,或是重新设定引用范围。5)错误值:#N/A含义:无信息可用于所要执行的计算。在建立模型时,用户可以在单元格中输入#N/A,以表明正在等待数据。任何引用含有#N/A值的单元格都将返回#N/A。解决办法:在等待数据的单元格内填充上数据。6)错误值:#NAME?含义:在公式中使用了Excel所不能识别的文本,比如可能是输错了名称,或是输入了一个已删除的名称,如果没有将文字串括在双引号中,也会产生此错误值解决办法:如果是使用了不存在的名称而产生这类错误,应确认使用的名称确实存在;如果是名称,函数名拼写错误应就改正过来;将文字串括在双引号中;确认公式中使用的所有区域引用都使用了冒号(:)。例如:SUM(C1:C10)。 注意将公式中的文本括在双引号中。7)错误值:#NUM! 含义:提供了无效的参数给工作表函数,或是公式的结果太大或太小而无法在工作表中表示。解决办法:确认函数中使用的参数类型正确。如果是公式结果太大或太小,就要修改公式,使其结果在-1×10307和1×10307之间。8)错误值:#NULL! 含义:在公式中的两个范围之间插入一个空格以表示交叉点,但这两个范围没有公共单元格。比如输入:“=SUM(A1:A10 C1:C10)”,就会产生这种情况。解决办法: 取消两个范围之间的空格。上式可改为“=SUM(A1:A10 ,C1:C10)”11、宏的应用宏是一个指令集,用来告诉EXCEL来完成用户指定的动作。宏类似于计算机程序,但是它是完全运行于EXCEL之中的,我们可以使用宏来完成枯燥的、频繁的重复性工作。 宏完成动作的速度比用户自己做要快得多。例如,我们可以创建一个宏,用来在工作表的每一行上输入一组日期,并在每一单元格内居中对齐日期,然后对此行应用边框格式。我们还可以创建一个宏,在“页面设置”对话框中指定打印设置并打印文档。由于宏病毒的影响和对编程的畏惧心理,使很多人不敢用“宏”,或是不知道什么时候可以找宏来帮忙。其实你尽管放心大胆地去用,如果只是用“录制宏”的方法,根本就没有什么难的,只是把一些操作象用录音机一样录下来,到用的时候,只要执行这个宏,系统就会把那操作再执行一遍。下面给出了宏的应用场合,只要用“录制宏”就可以帮你完成任务,而不需要编程。如果想对所录制的宏再进行编辑,就要有一定的VBA知识了。* 设定一个每个工作表中都需要的固定形式的表头;* 将单元格设置成一种有自己风格的形式;* 每次打印都固定的页面设置;* 频繁地或是重复地输入某些固定的内容,比如排好格式的公司地址、人员名单等;* 创建格式化表格;* 插入工作表或工作薄等。需要指出的是,EXCEL中的宏与WORD中的宏有些不同之处,对于录制的操作,它会记住单元格的坐标(即所有的引用都是绝对的),所以在涉及到与位置有关的操作时,要格外注意。如果相用相对引用,可以借助于Offset方法,比如下面的语句: ActiveCell.Offset(1,0). range("A1").select 宏的应用是很广的,上面提到的只是一点点,如果真的用起来,你会发现它有更丰富的内容和更灵活的应用方法。12、图表的应用技巧Excel提供了14种标准的图表类型,每一种都具有多种组合和变换。在众多的图表类型中,选用那一种图表更好呢? 根据数据的不同和使用要求的不同,可以选择不同类型的图表。图表的选择主要同数据的形式有关,其次才考虑感觉效果和美观性。 下面给出了一些常见的规则。面积图:显示一段时间内变动的幅值。当有几个部分正在变动,而你对那些部分总和感兴趣时,他们特别有用。面积图使你看见单独各部分的变动,同时也看到总体的变化。条形图:由一系列水平条组成。使得对于时间轴上的某一点,两个或多个项目的相对尺寸具有可比性。比如:它可以比较每个季度、三种产品中任意一种的销售数量。条形图中的每一条在工作表上是一个单独的数据点或数。因为它与柱形图的行和列刚好是调过来了,所以有时可以互换使用。柱形图:由一系列垂直条组成,通常用来比较一段时间中两个或多个项目的相对尺寸。例如:不同产品季度或年销售量对比、在几个项目中不同部门的经费分配情况、每年各类资料的数目等。条形图是应用较广的图表类型,很多人用图表都是从它开始的。折线图:被用来显示一段时间内的趋势。比如:数据在一段时间内是呈增长趋势的,另一段时间内处于下降趋势,我们可以通过折线图,对将来作出预测。例如:速度-时间曲线、推力-耗油量曲线、升力系数-马赫数曲线、 压力-温度曲线、疲劳强度-转数曲线、转输功率代价-传输距离曲线等,都可以利用折线图来表示,一般在工程上应用较多,若是其中一个数据有几种情况,折线图里就有几条不同的线,比如五名运动员在万米过程中的速度变化,就有五条折线,可以互相对比,也可以对添加趋势线对速度进行预测。股价图:是具有三个数据序列的折线图,被用来显示一段给定时间内一种股标的最高价、最低价和收盘价。通过在最高、最低数据点之间画线形成垂直线条,而轴上的小刻度代表收盘价。股价图多用于金融、商贸等行业,用来描述商品价格、货币兑换率和温度、压力测量等,当然对股价进行描述是最拿手的了。饼形图:在用于对比几个数据在其形成的总和中所占百分比值时最有用。整个饼代表总和,每一个数用一个楔形或薄片代表。比如:表示不同产品的销售量占总销售量的百分比,各单位的经费占总经费的比例、收集的藏书中每一类占多少等。饼形图虽然只能表达一个数据列的情况,但因为表达得清楚明了,又易学好用,所以在实际工作中用得比较多。如果想多个系列的数据时,可以用环形图。雷达图:显示数据如何按中心点或其他数据变动。每个类别的坐标值从中心点辐射。来源于同一序列的数据同线条相连。你可以采用雷达图来绘制几个内部关联的序列,很容易地做出可视的对比。比如:你有三台具有五个相同部件的机器,在雷达图上就可以绘制出每一台机器上每一部件的磨损量。XY散点图:展示成对的数和它们所代表的趋势之间的关系。对于每一数对,一个数被绘制在X轴上,而另一个被绘制在Y轴上。过两点作轴垂线,相交处在图表上有一个标记。当大量的这种数对被绘制后,出现一个图形。散点图的重要作用是可以用来绘制函数曲线,从简单的三角函数、指数函数、对数函数到更复杂的混合型函数,都可以利用它快速准确地绘制出曲线,所以在教学、科学计算中会经常用到。还有其他一些类型的图表,比如圆柱图、圆锥图、棱锥图,只是条形图和柱形图变化而来的,没有突出的特点,而且用得相对较少,这里就不一一赘述。这里要说明的是:以上只是图表的一般应用情况,有时一组数据,可以用多种图表来表现,那时就要根据具体情况加以选择。 对有些图表,如果一个数据序列绘制成柱形,而另一个则绘制成折线图或面积图,则该图表看上去会更好些。在EXCE中L允许这创建这样的组合图表,但如果想创建一种EXCEL不允许的组合图表类型,比如不可能将一个二维图同一个三维图表混在一起,这种组合是不可能的,系统就会显示错误信息。怎么建立混合图表呢?单击“图表向导”按钮,选择“自定义类型”选项卡,这里还躲着二十种图表类型(如图14),也有各种组合形式。如果你对这些内部定义的形式还不满意,就单击“自定义”选项钮,按照向导自己定义全新的图表类型。

4,008

社区成员

发帖
与我相关
我的任务
社区描述
它是一种微软环境下的轻量级的解释型语言,它使用COM组件、WMI、WSH、ADSI访问系统中的元素,对系统进行管理。
社区管理员
  • vbScript社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧