图形用户界面已经成为用户界面的最佳选择。然而 ,尽管 G U I 出乎意料的很受欢迎 ,却很少有几个应用程序具有良好的界面设计。此外 , 通过现有的资料去解释什么是好的、直观的 *** 作界面 , 是极其困难的。本文主要描述好的界面的基本规则。
1 要了解用户
应用软件必须反映出用户的想法和行为特点。要充分了解用户 ,开发者必须首先了解人 ,因为我们都有着共同的特点。人通过辨识比强记更容易学习知识。一般人能完整记得大约2000至3000个词的话 , 但能识别到五万多字。与其提供一个清单、数据值 ,供用户选择 ,不如让用户记住关键按键。
2 要注意理解的不同角度
当涉及到图标设计或应用软件整体设计 ,许多设计师在不知不觉中落入角度的陷阱。最近 , 我看到了一个显示“卷起来 ”的总数为一种会计系统图标设计。为了显示这个功能 ,设计师花了很多工夫创造一个有图标类似于卷轴。不幸的是 ,从设计师的角度来看 ,即使这是完全直观的 ,该系统的用户还是不知道图标想隐喻的是什么。
3 使界面设计更清晰
对于终端用户 , 应用程序的GUI 图形界面往往不太明确的。其中一个有效的途径 , 就是开发和使用保留字列表以增加应用软件的清晰度。大多用户有一个共同的不满 , 就是应用软件中有些条款不明确或一致。
4 设计一致性
好的图形界面设计应该沿用其他一些已获得成功、认可的应用软件的经验和设计 ,并保持这些设计的一致性。当编写商业应用的软件时 , 应该为用户提供尽可能多的成功设计的一致性的设计。
5 提供视觉反馈
如果你曾尝试过凝视鼠标沙漏等待程序执行结束 , 你就能体会到缺乏视觉反馈所带来的沮丧感。你的用户很希望能知道他们程序执行结束到底要等待多久。一般来说 ,当程序执行完成需要超过7到10秒时 ,大多数用户希望有一个信息对话框与进度指示能给予提示。
6 提供声音反馈
这个提示的声音当作是环境噪音的一部分。同样的情况也出现在GUI的设计里面。然而 ,声音反馈在需要提醒用户的一个迫在眉睫的严重问题情况下 ,还是非常管用的 ,比如说当某个程序进一步运行可能造成数据的丢失 , 这时候提供警报的声音反馈就极为必要。所以GUI设计中 ,除了当发生错误而必须加以处理的情况 ,我们应该设定允许用户禁用音频反馈。
图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机 *** 作用户界面。
总的来说,GUI设计师就是设计图形用户界面的。就像你使用的window桌面界面
只有矩形有圆形能移动,其它实现起来麻烦点,办法有的只是代码太多。
画圆弧改成了画曲线,圆弧稍麻烦,当然方法是很简单的,你可以自己思考一下。
双击13个颜色中的任意一个都会d出颜色选择器。
有保存与打开功能。扩展名请用 jdr
基本满足条件,细节可能不是很好,另,代码比较乱,怕不好看懂咯,呼呼。
import javaawt;
import javaawtevent;
import javaawtgeom;
import javaawtimageBufferedImage;
import javaio;
import javautilArrayList;
import javaxswing;
import javaxswingfilechooserFileNameExtensionFilter;
public class JDraw {
public static void main(String[] args) {
JFrame f=new JFrame();
fsetDefaultCloseOperation(3);
fsetSize(880,600);
fsetLocationRelativeTo(null);
fgetContentPane()add(Mc);
fgetContentPane()add(Mm,"South");
fsetVisible(true);
}
}
class CVS extends Component implements ComponentListener,MouseListener,MouseMotionListener{
public void componentHidden(ComponentEvent e) {}
public void componentMoved(ComponentEvent e) {}
public void componentResized(ComponentEvent e) {resized();}
public void componentShown(ComponentEvent e) {}
private void resized() {
int w=thisgetWidth();
int h=thisgetHeight();
tbuff=new BufferedImage(w,h,3);
makeBuff(w,h);
}
private void makeBuff(int w,int h) {
Graphics g = tbuffgetGraphics();
gdrawImage(buff,0,0,null);
gdispose();
buff=new BufferedImage(w,h,3);
g=buffgetGraphics();
gdrawImage(tbuff,0,0,null);
gdispose();
}
BufferedImage buff,tbuff;
CVS(){
thisaddComponentListener(this);
thisaddMouseListener(this);
thisaddMouseMotionListener(this);
buff=new BufferedImage(1,1,3);
}
public void paint(Graphics gr){
Graphics2D g = buffcreateGraphics();
gsetBackground(new Color(0xff000000,true));
gclearRect(0,0,getWidth(),getHeight());
gsetRenderingHint(RenderingHintsKEY_ANTIALIASING,
RenderingHintsVALUE_ANTIALIAS_ON);
MsadrawAll(g);
if(Mts!=null)
Mtsdraw(g);
gdispose();
grdrawImage(buff,0,0,this);
grdispose();
}
public void mouseClicked(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mousePressed(MouseEvent e) {
Mmp(egetPoint());
}
public void mouseReleased(MouseEvent e) {
Mmr(egetPoint());
}
public void mouseDragged(MouseEvent e) {
Mmd(egetPoint());
}
public void mouseMoved(MouseEvent e) {}
}
class Menu extends JComponent implements MouseListener,ActionListener{
JComboBox sbox,method;
CLabel[] cl;
JCheckBox fillC,drawB;
JRadioButton fc,bc;
ButtonGroup bg;
JButton clear,up,down,save,load;
Menu(){
thissetLayout(new FlowLayout());
method=new JComboBox(new Object[]{"draw","move","erase",});
add(method);
sbox=new JComboBox(new Object[]{"Pt","Ln","Rect","Cir","Arc",});
add(sbox);
cl=new CLabel[13];
for(int i=0; i<cllength; i++){
cl[i]=new CLabel();
cl[i]addMouseListener(this);
add(cl[i]);
}
fc=new JRadioButton("fc",true);
bc=new JRadioButton("bc");
bg=new ButtonGroup();
bgadd(fc);bgadd(bc);
add(fc);add(bc);
fcsetOpaque(true);
bcsetOpaque(true);
fcsetBackground(Colorwhite);
bcsetBackground(Colorblue);
fillC=new JCheckBox("Fill",true);
drawB=new JCheckBox("Draw",true);
fillCaddActionListener(this);
drawBaddActionListener(this);
add(fillC);add(drawB);
clear=new JButton("clear");
clearaddActionListener(this);
add(clear);
up=new JButton("zUp");
upaddActionListener(this);
add(up);
down=new JButton("zDown");
downaddActionListener(this);
add(down);
save=new JButton("Save");
saveaddActionListener(this);
add(save);
load=new JButton("Load");
loadaddActionListener(this);
add(load);
}
public void mouseClicked(MouseEvent e) {
JLabel l=(JLabel)egetSource();
if(egetClickCount()==2){
Color sc=JColorChoosershowDialog(null, "Color chooser", lgetBackground());
lsetBackground(sc);
mousePressed(e);
}
}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mousePressed(MouseEvent e) {
Color c=((JLabel)egetSource())getBackground();
if(fcisSelected())
fcsetBackground(c);
else if(bcisSelected())
bcsetBackground(c);
Mcp();
}
public void mouseReleased(MouseEvent e) {}
public void actionPerformed(ActionEvent e) {
if(egetSource()==clear)Mclear();
else if(egetSource()==up)Mup();
else if(egetSource()==down)Mdown();
else if(egetSource()==save)Msave();
else if(egetSource()==load)Mload();
else if(egetSource()==fillC||egetSource()==drawB)Mcp();
}
}
class CLabel extends JLabel{
static Color[] cs={Colorred,Colororange,Coloryellow,Colorgreen,Colorcyan,
Colorblue,Colormagenta,Colormagentabrighter(),
Colorwhite,Colorblack,Colorgray,ColorLIGHT_GRAY,ColorDARK_GRAY,};
static int i;
CLabel(){
thissetOpaque(true);
thissetBackground(cs[i++]);
thissetBorder(BorderFactorycreateLineBorder(Colorblack));
thissetPreferredSize(new Dimension(10,20));
}
}
class M{
static JFileChooser jfc=new JFileChooser();
static Menu m=new Menu();
static CVS c=new CVS();
static SA sa=new SA();
static S ts=null,selected=null;
static Color fc,bc;
static void clear(){
sassclear();
crepaint();
}
public static void cp() {
Systemoutprintln(selected);
if(selected!=null){
selectedfillColor=mfcgetBackground();
selectedborderColor=mbcgetBackground();
selectedfc=mfillCisSelected();
selecteddb=mdrawBisSelected();
crepaint();
}
}
public static void up() {
if(selected!=null){
saupZ(selected);
crepaint();
}
}
public static void down(){
if(selected!=null){
sadownZ(selected);
crepaint();
}
}
static{
jfcsetFileFilter(new FileNameExtensionFilter("JDraw file (jdraw,jdr)","jdr","jdraw"));
}
static void save(){
int x=jfcshowSaveDialog(c);
if(x==JFileChooserAPPROVE_OPTION){
File f = jfcgetSelectedFile();
try{
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(f));
ooswriteObject(sa);
oosflush();
oosclose();
}catch(Exception e){}
}
}
static void load(){
int x=jfcshowOpenDialog(c);
if(x==JFileChooserAPPROVE_OPTION){
File f = jfcgetSelectedFile();
try{
ObjectInputStream oos=new ObjectInputStream(new FileInputStream(f));
Object r=oosreadObject();
if(r!=null){
sa=(SA)r;
crepaint();
}
oosclose();
}catch(Exception e){eprintStackTrace();}
}
}
static int mx,my,tx,ty,ox,oy;
static int pc=0,pmax;
static int sm;
static boolean ne=true;
static int mid;
static void mp(Point p){
mid=mmethodgetSelectedIndex();
if(mid==0){
if(ne){
mx=px;my=py;
pc=0;
sm=msboxgetSelectedIndex();
pmax=sm==42:1;
ne=false;
}
++pc;
}
else if(mid==1){
checkSel(p);
mx=px;my=py;
}
else if(mid==2){
checkSel(p);
if(selected!=null){
sassremove(selected);
crepaint();
}
}
}
private static void checkSel(Point p) {
selected=null;
for(int i=sasssize();i>0; i--)
if(sassget(i-1)shapecontains(p)){
selected=sassget(i-1);break;
}
saselect(selected);
crepaint();
}
static void mt(){
Shape s=null;
int cx,cy,cw,ch;
switch(sm){
case 0:
case 2:
cx=Mathmin(mx,tx);
cy=Mathmin(my,ty);
cw=Mathabs(mx-tx);
ch=Mathabs(my-ty);
if(sm==0)
s=new Ellipse2DDouble(cx,cy,cw,ch);
else
s=new Rectangle(cx,cy,cw,ch);
break;
case 1:
s=new Line2DFloat(mx,my,tx,ty);
break;
case 3:
cw=Mathabs(mx-tx);
ch=Mathabs(my-ty);
int cd=(int)Mathsqrt(Mathpow(mx-tx,2)+Mathpow(my-ty,2))2;
cx=mx-cd/2;
cy=my-cd/2;
s=new Ellipse2DDouble(cx,cy,cd,cd);
break;
case 4:
Path2D p=new Path2DDouble();
pmoveTo(mx,my);
if(pc==1){
plineTo(tx, ty);
}
else{
pquadTo(ox,oy,tx,ty);
}
s=p;
break;
}
ts=new S(s,mfcgetBackground(),mbcgetBackground(),mfillCisSelected(),mdrawBisSelected(),null);
crepaint();
}
static void md(Point p){
if(mid==0){
if(!sassisEmpty()){
sassget(sasssize()-1)sel=false;
}
if(pc>1){
ox=px;oy=py;
}
else{
tx=px;ty=py;
}
mt();
}
else if(mid==1){
if(selected!=null){
moveTo(selected,p);
crepaint();
}
}
else if(mid==2){
checkSel(p);
if(selected!=null){
sassremove(selected);
crepaint();
}
}
}
static void moveTo(S s, Point p) {
if(sshape instanceof Rectangle){
Rectangle r=(Rectangle)sshape;
rsetLocation(rx+px-mx,ry+py-my);
mx=px;my=py;
}
else if(sshape instanceof Ellipse2D){
Ellipse2D e=(Ellipse2D)sshape;
esetFrame(egetX()+px-mx,egetY()+py-my,egetWidth(),egetHeight());
mx=px;my=py;
}
}
static void mr(Point p) {
if(pc==pmax){
pc=0;
ne=true;
saadd(ts);
selected=ts;
ts=null;
}
}
}
class S implements Serializable{
boolean fc,db,sel=true;
Shape shape;
Color fillColor,borderColor;
Stroke stroke;
static Stroke bstroke=new MyBasicStroke();
static Stroke selectStroke=new BasicStroke(1,BasicStrokeCAP_BUTT,BasicStrokeJOIN_MITER,1,new float[]{5,2},1);
S(Shape s,Color c,Color b,boolean f,boolean d,Stroke k){
thisshape=s;thisfillColor=c;thisborderColor=b;thisfc=f;thisdb=d;thisstroke=k==nullbstroke:k;
}
void draw(Graphics2D g){
if(fc){
gsetColor(fillColor);
gfill(shape);
}
if(db){
gsetColor(borderColor);
gsetStroke(stroke);
gdraw(shape);
}
if(sel){
gsetColor(Colorgreen);
gsetStroke(selectStroke);
gdraw(shapegetBounds());
}
}
}
class MyBasicStroke extends BasicStroke implements Serializable{}
class SA implements Serializable{
ArrayList<S> ss=new ArrayList<S>();
void add(S s){
if(s!=null){
for(S sx:ss)
sxsel=false;
ssadd(s);
}
}
S remove(int i){
return ssremove(i);
}
void remove(S s){
ssremove(s);
}
void upZ(S s){
indexZ(s,1);
}
void downZ(S s){
indexZ(s,-1);
}
void indexZ(S s, int i) {
int si=ssindexOf(s);
if(si+i<0||si+i>sssize()-1)return;
swap(s,ssget(si+i));
}
void swap(S a,S b){
int ai=ssindexOf(a);
int bi=ssindexOf(b);
ssset(ai,b);
ssset(bi,a);
}
void select(S s){
for(S x:ss)
xsel=false;
if(s!=null)
ssel=true;
}
void drawAll(Graphics2D g){
for(S s:ss)
sdraw(g);
}
}
1可以用 winC ,就是直接在windows下编程。这个比较麻烦,因为所有的东西都必须自己写(如创建窗口,初始化等一些基本的)以前老师上课的时候讲过,理解了之后,感觉其实很简单,而且都是一个套路,看个例子就能明白的
2可以用MFC创建界面,里面要具体实现的东西,直接用C语言写就可以了,很方便,其实MFC就是对winC的一种封装,就是第一点说的你要写的那些基本的东西(创建窗口,初始化之类的),他都给你弄好了,不用自己写,直接创建一个工程就OK了
3可以创建C#工程,用C#创建界面(直接拖控件就行,像VB那样),然后,你要实现的东西用C语言写。或者,你先将要实现的东西,用C语言写好,编译成动态链接库DLL,然后在C#工程中调用该DLL。C#工程实际上就起到一个界面封装的目的,也比较方便
ATL简介 一 什么是ATL 自从1993年Microsoft首次公布了COM技术以后,Windows平台上的开发模式发生了巨大的变化,以COM为基础的一系列软件组件化技术将Windows编程带入了组件化时代。广大的开发人员在为COM带来的软件组件化趋势欢欣鼓舞的同时,对于COM开发技术的难度和烦琐的细节也感到极其的不便。COM编程一度被视为一种高不可攀的技术,令人望而却步。开发人员希望能够有一种方便快捷的COM开发工具,提高开发效率,更好地利用这项技术。 针对这种情况,Microsoft公司在推出COM SDK以后,为简化COM编程,提高开发效率,采取了许多方案,特别是在MFC(Microsoft Foundation Class)中加入了对COM和OLE的支持。但是随着Internet的发展,分布式的组件技术要求COM组件能够在网络上传输,而又尽量节约宝贵的网络带宽资源。采用MFC开发的COM组件由于种种限制不能很好地满足这种需求,因此Microsoft在1995年又推出了一种全新的COM开发工具ATL。 ATL是ActiveX Template Library 的缩写,它是一套C++模板库。使用ATL能够快速地开发出高效、简洁的代码(Effective and Slim code),同时对COM组件的开发提供最大限度的代码自动生成以及可视化支持。为了方便使用,从Microsoft Visual C++50版本开始,Microsoft把ATL集成到Visual C++开发环境中。1998年9月推出的Visual Studio 60 集成了ATL 30版本。目前,ATL已经成为Microsoft标准开发工具中的一个重要成员,日益受到C++开发人员的重视。 ATL究竟给开发人员带来了什么样的益处呢?这还要先从ATL产生以前的COM开发方式说起。 在ATL产生以前,开发COM组件的方法主要有两种:一是使用COM SDK直接开发COM组件,另一种方式是通过MFC提供的COM支持来实现。 直接使用COM SDK开发COM组件是最基本也是最灵活的方式。通过使用Microsoft提供的开发包,我们可以直接编写COM程序。但是,这种开发方式的难度和工作量都很大,一方面,要求开发者对于COM的技术原理具有比较深入的了解(虽然对技术本身的深刻理解对使用任何一种工具都是非常有益的,但对于COM这样一整套复杂的技术而言,在短时间内完全掌握是很难的),另一方面,直接使用COM SDK要求开发人员自己去实现COM应用的每一个细节,完成大量的重复性工作。这样做的结果是,不仅降低了工作效率,同时也使开发人员不得不把许多精力投入到与应用需求本身无关的技术细节中。虽然这种开发方式对于某些特殊的应用很有必要,但这种编程方式并不符合组件化程序设计方法所倡导的可重用性,因此,直接采用COM SDK不是一种理想的开发方式。 使用MFC提供的COM支持开发COM应用可以说在使用COM SDK基础上提高了自动化程度,缩短了开发时间。MFC采用面向对象的方式将COM的基本功能封装在若干MFC的C++类中,开发者通过继承这些类得到COM支持功能。为了使派生类方便地获得COM对象的各种特性,MFC中有许多预定义宏,这些宏的功能主要是实现COM接口的定义和对象的注册等通常在COM对象中要用到的功能。开发者可以使用这些宏来定制COM对象的特性。 另外,在MFC中还提供对Automation 和 ActiveX Control的支持,对于这两个方面,Visual C++也提供了相应的AppWizard和ClassWizard支持,这种可视化的工具更加方便了COM应用的开发。 MFC对COM和OLE 的支持确实比手工编写COM程序有了很大的进步。但是MFC对COM的支持是不够完善和彻底的,例如对COM接口定义的IDL语言,MFC并没有任何支持,此外对于近些年来COM和ActiveX技术的新发展MFC也没有提供灵活的支持。这是由MFC设计的基本出发点决定的。MFC被设计成对Windows平台编程开发的面向对象的封装,自然要涉及Windows编程的方方面面,COM作为Windows平台编程开发的一个部分也得到MFC的支持,但是MFC对COM的支持是以其全局目标为出发点的,因此对COM 的支持必然要服从其全局目标。从这个方面而言,MFC对COM的支持不能很好的满足开发者的要求。
以上就是关于matlab的gui界面设计和代码有什么联系全部的内容,包括:matlab的gui界面设计和代码有什么联系、cwindows应用程序的唯一入口点是、UI设计师必知:6大GUI设计原则等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)