windows开发记事本程序纪实(一)界面篇

时间:2022年12月15日

/

来源:安乎

/

编辑:本站小编

收藏本文

下载本文

下面是小编给各位读者分享的windows开发记事本程序纪实(一)界面篇,欢迎大家分享。本文原稿由网友“安乎”提供。

篇1:windows开发记事本程序纪实(一)界面篇

这将是一个系列博文,后面会继续补充逻辑功能的开发的步骤,本节主要实现记事本的主界面设计,包括主界面窗口的构建、菜单的加入。虽然都是一些基本的操作,但是还是想将这些基本步骤完整地记录下来,以便后续验证。

前言

从毕业开始学习windows UI编程,工作中总是和一些API打交道,但是从没有做过一个完整的界面程序。因此打算自己利用空余时间做一个小的项目来总结自己所学的东西。在网上看到许多人建议自己动手写完整的项目才能快速提高,因此打算从仿照windows的记事本开始,真正实现一个基本的windows界面程序。考虑到编写一个完整的windows 记事本程序需要大量的工作,因此打算将每一个阶段的成果记录下来,一方面能够帮助自己进行总结,回顾已学的知识,另一方面也能够与其他网友一起讨论,从而可以在讨论中共同进步。

本节介绍

如本文题目所示,本节主要实现记事本的主界面设计,包括主界面窗口的构建、菜单的加入。虽然都是一些基本的操作,但是还是想将这些基本步骤完整地记录下来,以便后续验证。本文的开发环境为:系统为win7 64bit, IED是VS。好了,废话不多说,直接开始流程介绍:

1. 新建win32 工程

本文采用windows API方式实现一个简易记事本程序,因此在创建工程时选择windows application,如图1所示。同时为了方便,选择以空的项目开始,要增加什么资源就在后续过程中添加即可。

图1 新建win32空项目

2. 构建主界面

在打开windows自带的记事本程序可以看出,整个窗口就是一个带有菜单、编辑控件的对话框,因此本文为了方便直接以DialogBox的方式构建整个程序的主界面。具体的做法如下图2所示:Resource Files C>Add C>Resource… :

图2 新建对话框资源

在图2中的资源窗口开启后,选中Dialog资源并进行添加即可。此时得到一个系统默认的对话框,如图3所示:

图3 系统默认对话框

此时,需要将视图切换到资源视图进行操作。首先进行对话框的改名,一个有意义的变量名使得程序的可读性更好,也更易于后期维护。因此将Dialog资源名改为IDD_MAIN。同时记事本中不存在OK以及Cancel按钮,因此在对话框中直接选中这两个按钮并删除。效果如图4所示:

图4 主界面对话框改名、删除多余按钮后效果

3. 构建菜单

构建菜单时,第一步操作与构建主界面一致。在图2的资源添加中选择Menu并选择新建。新增的菜单资源默认名为IDR_MENU1。同样对其进行改名操作,改为IDR_MENU。后续将进行菜单项的填充。这里主要就是按照windows记事本中相应的文字填入就可以了,主要存在以下两个小细节需要注意:

3.1 字母快捷键

在windows记事本中可以通过快捷键唤起相应的菜单项(例如打开记事本后,可以用alt+F打开文件选项,如图5所示)。

图5 windows菜单快捷键

这里的做法其实很简单,就是在相应的字母前添加&,例如“文件(F)”就填写为“文件(&F)”,这样就可以默认开启快捷键。对于“文件”选项下面的打开、保存等快捷键的设置同样是在对应的字母前添加&。

3.1 构建下拉分割线

在如图5的文件下拉菜单中,可以看到用于分割“另存为”和“页面设置”的分割线。那么如何产生这跟分割线呢,其实也非常简单,直接在相应的菜单项右键,选择“Insert Separator”,如图6所示(因为我的机器上VS2008是英文版的所示菜单项都显示的英文,对于中文的VS应该可以在同样的地方找到“插入风格线”的选项吧):

图6 添加菜单选项分割线

4. 调起主界面

在主程序中,目前只是为了显示当前界面的效果,因此直接用DialogBox显示IDD_MAIN.代码如下:

/************************************************************************//* file : main.cpp 整个应用程序的主入口 * author : Huagang Li * date : -8-29 23:22:37 * blogs : www.cnblogs.com/lhglihuagang/ *//************************************************************************/#include #include “resource.h” // IDD_MAIN定义位置int WINAPI WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in_opt LPSTR lpCmdLine, __in int nShowCmd ){ ::DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, NULL); return EXIT_SUCCESS;}

因为Dialog中的窗口过程函数直接设置为NULL,因为这个窗口在打开后就无法通过关闭按键关闭(可以用资源管理器关闭),当前效果如下7所示:

图7 错误的输出结果?

从上图7中可以看出,只是一个空白窗口,说好的菜单选项呢?最大最小化按钮呢?窗口大小还不可变??这里就进入另一个注意点了:在新建了菜单资源并进行了编辑后,这个资源只是存在于工程文件中,并没有将其添加到任何一个窗口中,

因此,我们需要将菜单资源加入到IDD_MAIN窗口中。同时系统默认新建的对话框窗口是没有最大最小按钮的,因此也需要在IDD_MAIN的属性中进行调节,具体操作如下:

4.1 添加菜单、最大化最小化按钮

在IDD_MAIN的“properties”中的Menu选择“IDR_MENU”,同时将Minimize Box以及Maxmize Box都设为True。具体操作如下图8所示:

图8 添加菜单,最大,最小按钮

4.2 窗口大小可调节

IDD_MAIN的“properties”中的Boader选择“Resizing”,也就是将边框的属性设置为可调节,操作如下图9所示:

图9 对话框大小可变

界面效果

在添加菜单、最大最小按钮,同时修改了边框调节属性后,整个程序运行后主界面如图10所示:

图10 程序UI效果

结论

虽然真正的逻辑功能还没有开发,但是光是实现这个界面还是了一段时间研究。即使是这样简单的界面显示程序其实也是可以学到一些小的知识点:

1. 菜单字母快捷键(在字母前面前面添加&)

2. 菜单下拉分割线(右键选择添加分割线)

3. 新建的菜单资源需要加入到窗口中才能显示(IDD_MAIN属性中的MENU选择IDR_MENU)

说明

这将是一个系列博文,后面会继续补充逻辑功能的开发的步骤。希望能与更多博友交流。

如果你觉得这篇文章还可以,请点赞,哈哈~~

声明:未作说明,则本文为年糕原创。注意:须保留全文,如需修改请 联系作者。

篇2:Windows 9已经入开发阶段 延用Win8界面

作者:马荣

来自PCBeta论坛的消息,就在Windows Blue已经进入开发阶段时,Windows 9也已经进入了Alpha开发阶段,新版本号为Build 9622,

Windows 9已经入开发阶段 延用Win8界面

Win9仍将使用Win8界面

据称,Windows 9将同样延续Windows 8的用户界面,而且还将更加扁平化,因此Win7上的Aero特效可能是很难回归了。而Windows 9的系统核心则将发生一些变化。

Windows 8刚刚与10月底发布,现在Windows Blue和Win9都以加快了开发的进度,由此可见微软事项一改过去的更新方式以适应新的用户需求了。

篇3:记事本中写c/c++程序在Windows下执行

1.在桌面新建一个1.c,内容如下:

2.打开cmd命令行窗口,进入CodeBlock安装目录下的:E:\\Installed\\CodeBlocks\\MinGW,然后执行mingwvars.bat

3.进入1.c所在的目录:

4.执行编译等动作

5.接着使用VC的编译器进行执行代码,

记事本中写c/c++程序在Windows下执行

6.点击VS开发人员命令提示,然后进入1.c所在目录,执行1.c,执行后的效果如下:

执行在命令中输入: 1,这时候同样会出现和上面相同的效果。

篇4:开发交互式字符界面工具安装及使用说明Windows系统

交互式界面 开发 工具 www.uidk.com (IDK v2.0.1) 1、spm 超级菜单 2、svi 屏幕编辑器 3、ctb 字符终端浏览器 4、jkz 将文件加密压缩成自释放的程序 5、ste 将shell文件加密成可执行文件的程序 6、stb 将svi开发的资源文件编译成可执行文件的程序 【

交互式界面开发工具

www.uidk.com

(IDK v2.0.1)

1、spm 超级菜单

2、svi 屏幕编辑器

3、ctb 字符终端浏览器

4、jkz 将文件加密压缩成自释放的程序

5、ste 将shell文件加密成可执行文件的程序

6、stb 将svi开发的资源文件编译成可执行文件的程序

【安装及使用说明】

①下载并解压idk201.rar;将文件IDK201.VOL拷贝到SCOUNIX下的/tmp目录(可以用ftp)

② # cd /tmp (以root用户注册,进入/tmp目录)

③ # mv IDK201.VOL VOL.000.000 (将文件名IDK201.VOL改成VOL.000.000)

④ # custom (在控制台安装IDK软件包 Software ->Install New... ->Media Images ->/tmp)

⑤ # regidk (安装过程需要进行注册登记,发送邮件到mailzch@sina.com获取注册号)

⑥ # idk   (进入交互式字符界面开发工具菜单)

原文转自:www.ltesting.net

篇5:SCO Unix下开发游戏程序Windows系统

SCOUnix下开发游戏程序 中国银行河南修武支行王安定 作为成熟的操作系统,Unix在重要的行业中有很广泛的应用,而在实际应用中,却存在游戏软件少、游戏开发难度大等缺点。现在虽然推出了Unix下的X窗口,但因其应用的不广泛加上介绍功能的书籍少,使新手也很

SCO Unix下开发游戏程序

中国银行河南修武支行 王安定

作为成熟的操作系统,Unix在重要的行业中有很广泛的应用。而在实际应用中,却存在游戏软件少、游戏开发难度大等缺点。现在虽然推出了Unix下的 X窗口,但因其应用的不广泛加上介绍功能的书籍少,使新手也很难入手开发自己的游戏程序。下面以自己开发的一个小游戏来介绍在Unix中游戏开发的一些基本知识。

游戏名称:《Unix下的俄罗斯方块》

开发环境:SCO Unix System V/386 Release 3.2 后经少量改动在SCO OpenServer 5.0及多种Linux环境下编译通过

开发语言:Microsoft's C compiler version 6

开发方式:Unix字符方式下用Unix自带CURSES.H图形库开发

一、开发思路

1.单人游戏时:随机产生一个方块,用户使用键盘功能键操作方块,以合适的方式放入方块队列中。当某一行方块满时就消去这一行,显示用户所消行数及得分。机器中方块下落的速度会随得分的不同而改变。

2.联机对战:基本游戏思路同单人游戏,增加了对战功能。当多人进行对战时,如某玩家一次所消的方块行数大于二行,则把所消行数随机去掉一列后传给其他用户。在其他用户的界面上可以看到从游戏界面底部一下子增加了数行。

二、游戏的界面

在Unix下,游戏的界面是一个令人头痛的问题。在字符方式下,无法完成各种精美的图形。好在我们所开发的游戏对界面要求不太高。因此,对于新手来说,我们可以用Unix本身所带的CURSES.H库中几个简单的函数来完成界面设计。

1.下面介绍几种常用的CURSES.H函数:

initscr 初始化屏幕(必须有)

clear()、wclear() 清屏

newwin() 开一个新窗口

box() 在窗口边画一个框

mvprintw(int x,int y,char *,...)类似于printf,不同之处是在窗口的 (x,y)位置显示信息

mvscanw(int,int,char *,...)在指定位置读信息

mvwaddstr() 在指定窗口的指定位置显示字符串

wstandout() 反相显示开始

wstandend() 反相显示结束

cbreak() 立即显示所接收到的字符

nocbreak() 接收到一个换行符后才显示所接收到的字符

echo() 显示所输入的字符

noecho() 不显示所输入的字符

delwin() 删除一个窗口

touchwin() 击活一个窗口

wrefresh() 刷新一个窗口

beep() 响铃

keypad() 功能键开关

wgetch() 在窗口中读一个字符输入

wmove() 在窗口中移动光标

endwin() 结束图形方式(必须有)

2.图形方式光标移动键定义如下:

KEY_DOWN  0402向下键

KEY_UP  0403 向上键

KEY_LEFT  0404向左键

KEY_RIGHT  0405向右键

三、随机方块的产生

在俄罗斯方块中,共有19种不同的方块类型,要随机产生不同的方块可以用以下两个函数来实现:

1.定义随机数发生器:根据时间函数的返回值不同而产生不同的随机数。

#define randomize() srand((unsigned)time(NULL))

2.定义随机数:该函数能产生介于0到num-1之间的所有数。

#define random(num) (rand()%num)

定义上面两函数后便可用下面的函数rand_block()产生一个随机数:

/* 程序功能:随机产生一个介于0-19之间的数;入口参数:无

返回值:flag */

int rand_block()

{

int flag;

randomize();

flag=rand(19);

return(flag);

}

四、游戏的控制-

---1.终端控制

Unix中终端的输入输出控制用的是ioctl()系统调用。原型如下:

#include

int ioctl(int fd,int request,struct termio *argu)

fd为文件描述字,与一台终端相对应;request 是一个命令,我们用到的命令有TCGETA和TCSETA两个,作用分别是将fd所对应的终端信息存入termio结构和将fd所对应的终端设定为termio所描述的形式。 argu是一个指向 termio 类型的指针。

程序中,对终端的控制主要是对中断键的处理和对输入模式的不同切换。对中断键的处理主要是用到termio指针中c_clearcase/“ target=”_blank“ >cc数组中的控制。下面的一段程序便可保存起当前终端信息,忽略中断键(置其值为255),然后重设当前终端。

struct termio *old_tbuf,tbuf;

ioctl(0,TCGETA,&old_tbuf); /* 取当前终端信息 */

tbuf=old_tbuf; /* 保存终端信息 */

tbuf.c_cc[VINTR]=255; /* DEL */

tbuf.c_cc[VQUIT]=255;   /* CTRL-\\ */

tbuf.c_cc[VERASE]=255;   /* CTRL_h */

tbuf.c_cc[VKILL]=255;  /* CTRL-u */

tbuf.c_cc[VEOL]=255;  /* CTRL-d */

tbuf.c_cc[VSWTCH]=255;  /* CTRL-z */

tbuf.c_cc[VSTOP]=255; /* CTRL-s */

tbuf.c_cc[VSTART]=255;  /* CTRL-q */

ioctl(0,TCSETA,&tbuf);/* 设置当前终端 */

2.下落动画控制

在Unix系统中,有两种输入模式可供选择:一种是标准模式,一种是原始模式。在标准模式下,输入字符存储在输入队列的缓冲区中,直到读入换行符或是EOT(^-d)字符后才将所有数据一次输出;在原始模式下,字符一键入就立即输出,没有缓冲区。系统默认的是标准模式,但在游戏中,我们要不断在两种模式间切换,完成切换要用到tbuf.c_lflag[ICANON]来完成,如果设为ON,则默认为标准输入模式,否则为原始模式。

在游戏中,我们要求每一个方块在产生后,便能自动地下落。实现这个动画效果,要用到原始模式下的两个重要标志:VMIN和 VTIME,它们分别表示read系统调用返回前所需读取的最少字数和最长时间,

要控制方块自动下落,可用下面两句:

tbuf.c_cc[VMIN]=0;

tbuf.c_cc[VTIME]=1;

ioctl(0,TCSETA,&tbuf);

功能:read在收到一个字符或未收到字符但定时一秒时返回

3.速度控制

在俄罗斯方块中,游戏的可玩性还在于速度在不断的变化中。在这里,我们就要用到间隔化技术。所谓间隔化技术,就是在指定了开始位置和结束位置的情况下,确定游戏间隔步骤过程的技术。我们可以用一个空循环来实现方块因得分不同而使每一次下落的速度不同。定义速度常数 SPEED为十万(可根据机器速度不同自行定义),然后根据不同的行分而改变循环次数,如下边所写(score为用户当前得分):

if(score<10000) for(i=0;i else for(i=0;i五、游戏操作的实现 在游戏中,对方块的操作主要是由几个光标功能键来控制,功能定义如下:

1、↑ 翻转

2、↓ 速降

3、← 左移

4、→ 右移 5、Esc结束 6、c 刷屏

7、p 暂停

由于在图形方式下不能完成对方块的各种操作,这就使我们要找到合适的函数来定义各功能键。在Unix中,↑↓ ← →各键的引导字符是27,对游戏操作的实现也就是改变方块显示位置及显示不同方块类型的转换。当然还可以定义一些秘键:减速、增速、使对手增行、清空自己所有行等。

六、游戏的记录

1.记录结构的定义:

struct user_data

{

char name[8]; /* 用户姓名 */

int score; /* 用户最高得分 */

int line; /* 最高分时所消除方块行数 */

}

2.记录文件的几种操作:

在程序中要用到记录文件来存放用户记录,本游戏中记录文件名为user.dat,以下是几种文件的常用操作。在操作前要先定义一个FILE类型的指针 (FILE *fp):

fopen() 打开文件

fscanf() 从文件中读数据

access() 检测文件存在否及文件属性

creat() 建立新文件

fseek() 文件定位

fprintf() 写数据到文件中

fclose() 关闭文件

用下面的一段程序便可测试用户记录文件存在否。如不存在,则建立新的文件,并写一个空的入门成绩到用户记录文件中。游戏中你可用这几个函数来往记录文件中追加新的记录或改写记录。

if(access(“user.dat”,00)) /* 检测有无用户记录文件 */

{

creat(“user.dat“,0644); /* 如无文件则建立新的文件 */

fp=fopen(“user.dat”,“r+“); /* 写入一个空记录 */

fprintf(fp,“入门成绩 3000   20\\n”);fclose(fp);

七、联机对战的实现

联机对战的主要思路是在各个不同用户间传递信息。在Unix 下,我们可以用消息队列来进行数据的传递。消息队列能将格式化的数据送往任意的进程,所用到的有关系统调用如下。

1.建构一个新的消息队列或取得一个现存的消息队列的标识符:

#include “sys/types.h“

#include “sys/ipc.h”

#include “sys/msg.h“

int msgget(key_t key,int flags)

key是指消息队列的名字,它的值若是IPC_PRIVATE(值为零),指该消息队列为该进程专用,否则表示为一个以上的进程所共用。

flags用于表示消息队列的存取权限。

2.取得或修改已存在的消息队列的属性:

int msgctl(int msgid,int cmd,struct msqid_ds *mbuf)

msgid是消息队列的标识符。

cmd为符号常数: IPC_STAT(拷贝消息队列到MBUF所指向的地址)、IPC_SET(设定消息队列的存取权限)、IPC_RMID(删除消息队列)。

3.发送和接收消息:

int msgsnd(int msgid,const void *msgp,size_t msgsz,int msgflg)

int msgrcv(int msgid,void *msgp,size_t msgsz,long msgtyp,int msgflg)

msgid:消息队列的标识符。

msgp:消息缓冲区,暂时存储发送与接收的消息。

msgsz:消息的大小。

msgtyp:消息的类型。

msgflg:用来指明核心程序在队列没有数据的状况下,所应采取的行动。

八、游戏中的各种标志位

最重要的标志位是位置方块标志:定义一个二维数组,对应于游戏中方块的区域大小。如play[25][80],然后根据该标志为0或1来判断该位置有无方块,其他标志都是根据这个标志来工作的。所用到的标志还有游戏左右界标志、消行标志、增行标志(联机对战中)、能否移动标志、游戏结束标志等。

九、其他功能

游戏主体内容建立后,还有一些功能需要用户自己来完成。如清除上次显示方块、显示下一方块提示信息、无敌作弊法、记录排序、游戏速度的精确计算、增删行函数、速降函数、方块变换等,还需要进一步完善才成为完整的程序。

附例程:从标准输入读字符,如为光标移动键返回该键值,否则返回该字符值。

int mygetch()

{

int i;

char c;

struct termio *old_tbuf,tbuf;

ioctl(0,TCGETA,&old_tbuf);/* 取当前终端信息 */

tbuf=old_tbuf;

tbuf.c_lflag&=~ICANON; /* 设为原始模式 */

tbuf.c_cc[VNUM]=1;/* 设最少输入一个字符 */

tbuf.c_cc[VTIME]=0;/* 等待时间为0 */

ioctl(0,TCSETA,&tbuf);

i=read(0,&c,1);

if(c==27){/* 如为27则为光标键前导码 */

read(0,&c,1);read(0,&c,1);

switch(c){

case ‘A':return(56);break;/* UP */

case ‘B':return(50);break;/* DOWN */

case ‘C':return(54);break;/* RIGHT */

case ‘D':return(52);break;/* LEFT */

case 27:return(27);break;/* ESC */

}

ioctl(0,TCSETA,&old_tbuf);

return(c);

}

【发表回复】【查看CU论坛原帖】【添加到收藏夹】【关闭】

原文转自:www.ltesting.net

篇6:UNIX开发系统程序调试例举Windows系统

来看看在哪些情况下需要对程序进行调试, 第一种情况(这是大多数用户都会碰到的),程序在运行过程中忽然跳了出来,屏幕上显示一个xxxx-coredumped消息, 然后Shell提示符就又显示出来了,其中xxxx表示出错原因。这种情况的出现一般是系统核心认为进程的执

来看看在哪些情况下需要对程序进行调试。

第一种情况(这是大多数用户都会碰到的),程序在运行过程中忽然跳了出来,屏幕上显示一个xxxx-core dumped消息,

然后Shell提示符就又显示出来了,其中xxxx表示出错原因。这种情况的出现一般是系统核心认为进程的执行出现了异常,

如进程试图去访问一块不允许它访问的存储区域(Memory Fault,Segmentation Fault);或者扫描某个无终止符的字符串

(Bus Error);或者浮点运算溢出或被0除(Arithmetic Exception),等等。此时操作系统会把进程当时的内存映象写到

当前目录下的一个名叫core的文件中。这种情况下我们可以使用sdb来检查此core文件,以决定出错的地点以及程序执行

的状态,如函数间的调用关系、变量的值,等等。

第二种情况,程序可能并没有什么异常行为,但就是怎么也得不到正确的输出结果。这时需要在该进程运行过程中对之进

行调试。这种情况下我们可以使用sdb逐条语句地跟踪程序的执行过程,并在执行过程中检查有关变量的值的变化情况。

上述两种情况并不是绝然分开的。实际上它们可以结合在一起使用。例如,当我们利用core文件对某个已终止的进程进行

调试时,可以在sdb中重新启动相应程序的运行,然后对语句的执行进行一些控制。这样我们就能够知道在出现异常之前哪

个程序到底是如何动作的。

为了使sdb能够很好地对程序进行调试,在编译程序时应指示编译程序和链接程序在目标代码中加入调试用的各种信息,如

程序中的变量名、函数名及其在源程序中的行号等。我们知道,使用-g选项可以完成这一点。如我们可以用如下命令编译

前一章给出的有毛病的程序代码:

$clearcase/” target=“_blank” >cc-o myprog myprog.c myfunc.c

myprog.c:

myfunc.c:

$ ls -l myprog

-rwx-xr-x 1 yxz users 4224 Sep 1 10:17 myprog

$ cc -g -o myprog myprog.c myfunc.c

myprog.c

myfunc.c

$ ls -l myprog

total 26

-rwxr-xr-x 1 yxz users 5404 Sep 1 10:21 myprog

$

这时我们会发现,新生成的myprog比不带-g 选项生成的myprog要大的多。故在程序调试完成之后应将可执行程序中的调试

用信息去掉。最简单的方法当然是使用不带-g 选项的cc命令重新编译一遍。另外UNIX系统提供了另外一个名为strip的工具,

使用此命令也可以将程序中的调试信息去掉。

现在我们可以试着运行一下那个有问题的程序myprog。在shell提示符下输入:

$ myprog 1 111

Arithmetic Exception -core dumped

$

我们看到,程序由于异常而推出了,并且在当前目录下将生成一个名为core 的文件。这个文件有时非常庞大。在文件系统

的维护中,有一条就是要定期找出各目录下的core 文件并将其删除掉。

发生此种情况时可以使用sdb来对之进行调试。输入:

$ sdb myprog

即可进入sdb调试程序。

sdb将接受三个参数:

待调试的可执行文件名;

待调试的core文件名,一般缺省是core;

由冒号分隔的一个目录表,sdb将在这些目录表中去查找有关的源文件。此目录表的缺省设置是当前目录

有时当前目录下的core文件可能并不是待调试的程序的core 文件,此时用这个core 文件进行调试就是不合适的了。为防止

这一点,可在命令行中指定第二个参数为减号(-),如下所示:

$ sdb myprog -

这里的“-”告诉sdb忽略当前目录下的core文件。

第三种情况,我们试用对活动过程(正在运行的进程)进行调试的情况。例如,假定某个程序正在后台运行,但我们注意到

该程序的某些部分执行起来非常慢,这时我们可以在不杀死这个进程的情况下对之进行调试:

$ sdb /proc/1111

这里1111为待调试进程的进程号,用户可以用PS命令得到。系统在/proc目录下用文件的形式保存了每一个活动进程的信息,

而文件名正好就是相应的进程号。

指定的进程将在执行时遇到第一个系统调用或调用sdb后收到某个软中断信号时暂停其运行,我们就可以在sdb中检查变量的值、

设置断点、恢复执行,等等。在退出sdb时,控制又返回程序,执行进程又从其原停止的地方继续执行。

第四种情况,一般情况下当被调试的活动进程在收到某个软中断信号时sdb会停止该进程。为了防止这一点,可以使用-s 选项。

例如:

$ sdb -s 14 myprog

将告诉sdb不要因为软中断信号14(闹钟报警信号)而使进程的执行停止。此时该信号被传给相应进程。在程序接收并处理多个

软中断信号的情况下,可以使用多个-s选项。

在sdb命令行中还有其他一些选项,对此我们不再一一列举,读者可以参考命令帮助。

在使用上述方法之一进入sdb之后,便可以进行在前一节中提到的各种操作,如显示或设置变量值、函数调用关系、控制语句的

执行等。下一节我们将详细讨论完成这些操作的方法。

sdb命令的使用

同我们前面介绍过的mail,ftp一类工具类似,sdb也是一个命令解释程序。也就是说,用户在sdb提示符(一个星号*)下输入sdb

能够识别的命令,sdb将根据被调试的程序的具体情况给出响应。

例如,在运行myprog出错,生成core文件之后进入sdb时,sdb将给出如下的响应:

$ sdb myprog

12: return ((100/atoi(ValueInput))? TESTOK:! TESTOK);

*

sdb给出来的实际上是程序出错所在的函数,在源程序文件中的行号以及出错那一行的语句。

在sdb的使用中要注意三个“当前”概念:

(1)当前文件 即当前将要被执行的语句所在的那个源程序文件

(2)当前函数 即当前将要被执行的语句所在的那个函数

(3)当前行 这个概念只有在编译时加入-g选项才会有,它指的是将要被执行的那条语句,

与当前行相应,有一个行号的概念。

它指的是每条语句在程序中位于第几行。注意行号是从文件头开始计算的,第一行的行号为1,空白行和注释也包括在内。

在用core文件进行调试时,当前行和当前函数分别被设成是程序出错时所执行的那条语句所在地行和函数(如同上面显示出来

的那样)。但如果在编译时未加-g选项,显示出来的将只有函数名和函数的地址了。

在对活动进程进行排错时,sdb将把当前函数和当前行分别设成是main()函数和main()函数的第一个可执行的语句行。

不论是哪种情况,sdb都将显示出*提示符。在此提示符之下我们可以输入各种sdb命令,以控制程序的执行或观察变量的变化

情况,等等。在下面的几个小节中我们将分别详细讨论这些问题。

源程序的显示和搜索

程序出错一般来说不只是出错的那条语句本身造成的。事实上出现错误经常是前面或相关的代码执行了不正确的操作或少了某

些必要的处理。因此调试过程中经常要观察一下源程序中的语句,或者在程序中搜索某个符号出现在什么地方。其中字符串的

搜索功能同vi基本上是相同的,而文件的显示则同另外一个我们没有具体讨论的编辑器ed类似。下面我们将具体介绍这些命令。

1.源程序的显示

在用core进入sdb之后,在*提示符后输入w命令,该命令指示sdb显示源程序中的当前行为中心的前后10行的内容并保持当前行

不变:

* w

7:int

8: TestInput(char * ValueInput)

9: {while ( * ValueInput)

10: if (! isdigit( * ValueInput)) return (! TESTOK);

11: else ????ValueInput++;

12: return ((100/atoi(ValueInput))? TESTOK:! TESTOK);

13: }

*

我们看到,在进入sdb时,当前行是第12行,以该行为中心的10行内容正好就是上面所显示出来的。其他可以显示源程序语

句的sdb命令如下:

P 显示当前行

l 显示对应于当前指令的那条语句

Z 显示当前行开始的下面10条语句

Ctrl+D 显示当前行之后(不包括当前行)的第10条语句

n 显示第n条语句,这里n是一个数

注意这些命令显示出的是源程序语句还是汇编语句(后面我们将要介绍)取决于最近一次显示出的是什么。

2.改变当前行

在用户显示语句时,当前行也会相应地发生变化。例如,Z命令将使当前行向程序尾移动9行,而Ctrl+D则使当前行向后移

动10行。

在使用数字来显示某行语句时将使该行语句成为当前行。而在*提示符之后按一下回车,当前行将下移一行。例如,接着上面

的例子,输入:

* 8p

8: TEstInput(char * ValueInput)

* 回车

9: { while ( * ValueInput)}

*

这里8p实际上是两条命令的组合。它使当前行移至源文件的第八行,然后再显示出新的当前行。按回车键将使当前行后移一行。

3.改变当前源文件

在vi中我们可以用e命令对另外某个文件进行编辑。sdb也提供了e命令,可以用此命令来改变当前文件,如:

* e myprog.c

current file is now myprog.c

* 8p

8: main(int argc,char * argv[])

*

我们看到,当前文件改变之后,sdb将第一行设为是当前行。如果此文件的第一行是个函数,那么该函数便成为当前函数。

否则将临时出现没有当前函数的情况。

在上一节中,我们介绍过在命令行中可以指定源文件搜索目录名列表(缺省情况为当前目录)。如果某个文件不在此搜索

目录中,则可以用e命令将其加入:

* e Another SourceDir

这里Another SourceDir是一个目录名。如果要显示该目录下的某个文件,只需要输入:

* e FileName.c

当然直接使用:

* e Another SourceDir/FileName.c

也能达到同样的效果。

使用:

* e FunctionName

将使包含函数FunctionName的文件名成为当前文件,而当前函数不言而喻将成为FunctionName。当前行则理所当然的是该

函数的第一行。同一程序中函数名在各模块中的唯一性保证了这一点是能够成功的,但如果包含指定函数的文件不在当前

搜索目录列表中,则必须用e命令将其加入。

4.字符串的搜索

在vi中,我们可以在命令方式下使用“/“或者“?”命令,从当前位置向后或者向前搜索某个字符串,在sdb中也同样可

以完成这一点。使用这两个命令我们可以查找源程序中某个或某类符号的出现。之所以说某类,是因为我们可以用正规表

达式来指定待搜索的串(也即在搜索串中可以使用*,?,[,],-,^这类特殊字符)。

例如,为了查找myprog.c中argv出现在那些行上,可输入:

* /argv/

8: main(ini argc,char * argv[])

sdb将从当前行开始向文件尾搜索,到达文件尾之后又从文件头开始直至搜索到某个匹配的串或到达当前行为止。

与/相反,?命令将从当前行向文件头方向搜索,因此如果我们将上述/argv/换成:

* ? argv?

14: printf(“The %dth value' %s'\\tis BAD! \\n”,i,argv[i]);

*

所得的结果一般是不同的。

/或?命令之后的/或?并不是必须的。另外如果要在同一方向上继续搜索上次搜索过的串,只需要直接输入/或者?即可。

BOCAIX 回复于:-11-30 11:56:48十分感谢!!!

Red_Crow 回复于:2004-11-30 15:59:49:em02: !谢了。

原文转自:www.ltesting.net

篇7:iOS开发UI篇―以微博界面为例使用纯代码自定义cell程序编码全过

一、storyboard的处理

直接让控制器继承uitableview controller,然后在storyboard中把继承自uiviewcontroller的控制器干掉,重新拖一个tableview controller,和主控制器进行连线,

项目结构和plist文件

二、程序逻辑业务的处理

第一步,把配图和plist中拿到项目中,加载plist数据(非png的图片放到spooding files中)

第二步,字典转模型,完成plist中数据的加载。属性的注意点(number vip是bool类型,本质是整型的)kvc会智能的把nsnumber转换成bool型的。

第三步,懒加载。

第四步,有了数据之后直接实现数据源方法

(1)一共有几组(如果有一组的,那么可以不写,默认为一组)

(2)每组一共有多少行(数组有多少个元素,就有多少组)

(3)展示数据

1)到缓存中取cell

2)没有的话就创建

3)设置数据

4)返回cell

三、代码

视图部分

YYweiboCell.h文件

复制代码

1 //

2 // YYweiboCell.h

3 // 微博基本信息展示

4 //

5 // Created by 孔医己 on 14-6-2.

6 // Copyright (c) 2014年 itcast. All rights reserved.

7 //

8

9 #import

10

11 @class YYweiboModel;

12 @interface YYweiboCell : UITableViewCell

13

14 @property(nonatomic,strong)YYweiboModel *weibo;

15 @end

复制代码

YYweiboCell.m文件

复制代码

1 //

2 // YYweiboCell.m

3 // 微博基本信息展示

4 //

5 // Created by 孔医己 on 14-6-2.

6 // Copyright (c) 2014年 itcast. All rights reserved.

7 //

8

9 #import “YYweiboCell.h”

10 #import “YYweiboModel.h”

11

12 @interface YYweiboCell()

13 /**

14 * 头像

15 */

16 @property(nonatomic,weak)UIImageView *iconView;

17 /**

18 * vip图标

19 */

20 @property(nonatomic,weak)UIImageView *vipView;

21 /**

22 * 微博昵称

23 */

24 @property(nonatomic,weak)UILabel *nameLabel;

25 /**

26 * 配图

27 */

28 @property(nonatomic,weak)UIImageView *pictureView;

29 /**

30 * 正文

31 */

32 @property(nonatomic,weak)UILabel *textLab;

33

34 @end

35

36 @implementation YYweiboCell

37

38 //重写构造方法,让自定义的cell一创建出来就有五个子控件

39 - (id)initWithStyle.:(UITableViewCellStyle)style. reuseIdentifier:(NSString *)reuseIdentifier

40 {

41  self = [super initWithStyle.:style. reuseIdentifier:reuseIdentifier];

42  if (self) {

43    //1.添加头像

44    UIImageView *img=[[UIImageView alloc]init];

45    [self.contentView addSubview:img];

46    self.iconView=img;

47

48    //2.添加昵称

49    UILabel *namelab=[[UILabel alloc]init];

50    [self.contentView addSubview:namelab];

51    self.nameLabel=namelab;

52

53    //3.vip

54    UIImageView *vipview=[[UIImageView alloc]init];

55    [self.contentView addSubview:vipview];

56    self.vipView=vipview;

57

58    //4.正文

59    UILabel *textlab=[[UILabel alloc]init];

60    [self.contentView addSubview:textlab];

61    self.textLab=textlab;

62

63    //5.图片

64    UIImageView *picture=[[UIImageView alloc]init];

65    [self.contentView addSubview:picture];

66    self.pictureView=picture;

67  }

68  return self;

69 }

70

71 /**

72 * 重写set方法

73 *

74 * @param weibo 微博

75 */

76 -(void)setWeibo:(YYweiboModel *)weibo

77 {

78  //不要忘了,记录传递进来的模型

网站程序开发求职简历

Windows 7更新程序怎么卸载?Win7 更新程序卸载电脑新手办公/数码

一个SCO UNIX下实现F3行复制功能键的C程序Windows系统

下载windows开发记事本程序纪实(一)界面篇(共7篇)
windows开发记事本程序纪实(一)界面篇.doc
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档
最新范文更多
    热门文章
      猜你喜欢
      点击下载本文文档