当前位置:首页 » 编程语言 » C语言widget变量
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

C语言widget变量

发布时间: 2022-05-22 21:36:31

Ⅰ 我是一名c语言新手,想搞一点资料、题目、代码,求助

#include<gtk/gtk.h>
#include<stdlib.h>
GtkWidget * xmp_label_box(gchar * xpm_filename,gchar * label_text)
{
GtkWidget *box;
GtkWidget *image;
GtkWidget *label;
box=gtk_hbox_new(FALSE,0);
gtk_container_set_border_width(GTK_CONTAINER (box),2);
image=gtk_image_new_from_file(xpm_filename);
label=gtk_label_new(label_text);
gtk_box_pack_start(GTK_BOX(box),image,FALSE,FALSE,3);
gtk_box_pack_start(GTK_BOX(box),label,FALSE,FASLSE,3);
gtk_widget_show(image);
gtk_widget_show(label);
return box;
}
void callback(GtkWidget *widget,gpointer data)
{
g_print("你按了按钮喔!\n",(char *)data);
}
int main(int argc,char *argv[])
{
GtkWidget *window;
GtkWidget *button;
GtkWidget *box;
window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window),"带图片的按钮");
g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);
gtk_container_set_border_width(GTK_CONTAINER(window).10);
button=gtk_button_new();
g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(callback).(gpointer)"cool button");
box=xpm_label_box("info.xpm","cool button");
gtk_widget_show(box);
gtk_container_add(GTK_CONATINER(button).box);
gtk_widget_show(button);
gtk_container_add(GTK_CONTAINER(window),button);
gtk_widget_show(window);
gtk_main();
return 0;
}
我刚写完的。

Ⅱ C语言函数问题 步骤看不明白

子函数fun实际是求一个字符串长度
首先*p=s, 此时两个的地址是相同的,然后wihile(*p!=0) p++;是将p指针移到字符串尾部,字符串是以0结束的。然后用此时exec是qdiolog特有的 用于在对话框强制显示到最上面来 而show可以说是所有widget都有 只是普通的显示 和hide相反p的指针地址与s的指针地址相减,即字符串的长度。

fun("0ABCDEF")就是一个简单的函数调用。

Ⅲ C语言如何创建窗口

windows下通过调用API来创建窗口:
#include<windows.h>
int main()
{
MessageBox(NULL,"Hello World!","C图形程序",MB_OK);
return 0;
}
linux下通过调用图形库来创建窗口。
楼主如果是学C的话,先不要急于搞这些东西,把基础打扎实才是最重要的,GUI可以后学。基础扎实了,这些只是很简单的东西。

Ⅳ c语言关于typedef的用法。

typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。
在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。

Ⅳ 本人刚开始学习QT,有一些C语言基础,了解一点点C++,以下是一个QT例子,其中有很多语言不懂,望高人指点~

Ticker(QWidget *parent = 0);//为什么在括号内要有(QWidget *parent = 0)?
这是构造函数的参数。C++可以使用默认参数。其实写成iQWidget *parent = NULL;就是没有父窗口,就更容易理解了。

void paintEvent(QPaintEvent *event);//(QPaintEvent *event)又是什么意思?定义了event一个指针?如果说定义一个event指针那为什么下面三句又定义了event指针?
你这么问,应该是基础不好,C/C++的参数名是任意的,只要符合语法要求就可以,因此是可以相同的,这个只是函数的参数,而不是定义变量。三个event指针,是三个不同类型的事件指针,是三个函数的参数,不是定义变量。

Ticker::Ticker(QWidget *parent) : QWidget(parent)//前一个ticker指的是类,第二个ticker是成员函数还是?,那后面的两个括号内指的是什么?
第二个是构造函数,Ticker(QWidget *parent)是构造函数,QWidget *parent是构造函数的参数;
: QWidget(parent)是初始化列表的格式,你可以搜索一下 初始化列表 来查一下更具体的内容。

void Ticker::showEvent(QShowEvent * /* event */)//定义类和成员函数?括号内又是干什么的?是否可以将QShowEvent *换成QShowEvent * event ?
可以,函数定义的时候,是可以写参数,也可以不写,只简写参数的类型。

QWidget::timerEvent(event);//调用类和成员函数?括号内event怎么又没有*号了?
感觉你的基础真的不好,函数定义的时候,参数是要写类型的,所以那个*是表示指针类型。
而函数调用的时候,参数是指针类型的,就可以直接使用啊。如果不是指针,就用取地址符号(&)转成地址(指针就是地址)。
void paintEvent(QPaintEvent *event);//这样是定义,其实这么写更好一些
void paintEvent( QPaintEvent * event);//这个函数的参数是event,event的类型是QPaintEvent * 。感觉你的理解是这个函数的参数时 * event,而参数类型是QPaintEvent ,那样就错了。不知道你明白没有。

给你一些建议,因为你的基础看起来不是很好,建议看看谭浩强的《C++程序设计》等你完全理解这些问题了,再看看钱能的《C++程序设计》。再看国外的经典书。基础很重要,很重要。

Ⅵ vc++ 中动态数组 ventor 的操作问题

Vector用法介绍
这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作。本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用。通过阅读这篇文章读者应该能够有效地使用vector容器,而且应该不会再去使用C类型的动态数组了。
Vector总览
vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。
为了可以使用vector,必须在你的头文件中包含下面的代码:
#include <vector>

vector属于std命名域的,因此需要通过命名限定,如下完成你的代码:
using std::vector; vector<int> vInts;

或者连在一起,使用全名:
std::vector<int> vInts;

建议使用全局的命名域方式:
using namespace std;

在后面的操作中全局的命名域方式会造成一些问题。vector容器提供了很多接口,在下面的表中列出vector的成员函数和操作。

Vector的函数

c.assign(beg,end)
将[beg; end)区间中的数据赋值给c。
c.assign(n,elem)
将n个elem的拷贝赋值给c。

c.at(idx)
传回索引idx所指的数据,如果idx越界,抛出out_of_range。

c.back()
传回最后一个数据,不检查这个数据是否存在。

c.begin()
传回迭代器中的一个数据。

c.capacity()
返回容器中数据个数。

c.clear()
移除容器中所有数据。

c.empty()
判断容器是否为空。

c.end()
指向迭代器中的最后一个数据地址。

c.erase(pos)
删除pos位置的数据,传回下一个数据的位置。
c.erase(beg,end)
删除[beg,end)区间的数据,传回下一个数据的位置。

c.front()
传回地一个数据。

get_allocator
使用构造函数返回一个拷贝。

c.insert(pos,elem)
在pos位置插入一个elem拷贝,传回新数据位置。
c.insert(pos,n,elem)
在pos位置插入n个elem数据。无返回值。
c.insert(pos,beg,end)
在pos位置插入在[beg,end)区间的数据。无返回值。

c.max_size()
返回容器中最大数据的数量。

c.pop_back()
删除最后一个数据。

c.push_back(elem)
在尾部加入一个数据。

c.rbegin()
传回一个逆向队列的第一个数据。

c.rend()
传回一个逆向队列的最后一个数据的下一个位置。

c.resize(num)
重新指定队列的长度。

c.reserve()
保留适当的容量。

c.size()
返回容器中实际数据的个数。

c1.swap(c2) swap(c1,c2)
将c1和c2元素互换。
同上操作。

vector <Elem> c 创建一个空的vector。
vector <Elem> c1(c2) 用c2拷贝c1
vector <Elem> c(n) 创建一个vector,含有n个数据,数据均已缺省构造产生。
vector <Elem> c(n, elem) 创建一个含有n个elem拷贝的vector。
vector <Elem> c(beg,end) 创建一个以[beg;end)区间的vector。
c.~ vector <Elem>() 销毁所有数据,释放内存。

Vector操作
函数描述

operator[]
返回容器中指定位置的一个引用。

创建一个vector
vector容器提供了多种创建方法,下面介绍几种常用的。
创建一个Widget类型的空的vector对象:
vector<Widget> vWidgets;
// ------
// |
// |- Since vector is a container, its member functions
// operate on iterators and the container itself so
// it can hold objects of any type.
创建一个包含500个Widget类型数据的vector:
vector<Widget> vWidgets(500);

创建一个包含500个Widget类型数据的vector,并且都初始化为0:
vector<Widget> vWidgets(500, Widget(0));

创建一个Widget的拷贝:
vector<Widget> vWidgetsFromAnother(vWidgets);
向vector添加一个数据
vector添加数据的缺省方法是push_back()。push_back()函数表示将数据添加到vector的尾部,并按需要来分配内存。例如:向vector<Widget>中添加10个数据,需要如下编写代码:
for(int i= 0; i<10; i++)
vWidgets.push_back(Widget(i));

获取vector中制定位置的数据
很多时候我们不必要知道vector里面有多少数据,vector里面的数据是动态分配的,使用push_back()的一系列分配空间常常决定于文件或一些数据源。如果你想知道vector存放了多少数据,你可以使用empty()。获取vector的大小,可以使用size()。例如,如果你想获取一个vector v的大小,但不知道它是否为空,或者已经包含了数据,如果为空想设置为-1,你可以使用下面的代码实现:
int nSize = v.empty() ? -1 : static_cast<int>(v.size());
访问vector中的数据
使用两种方法来访问vector。
1、 vector::at()
2、 vector::operator[]
operator[]主要是为了与C语言进行兼容。它可以像C语言数组一样操作。但at()是我们的首选,因为at()进行了边界检查,如果访问超过了vector的范围,将抛出一个例外。由于operator[]容易造成一些错误,所有我们很少用它,下面进行验证一下:
分析下面的代码:
vector<int> v;
v.reserve(10);
for(int i=0; i<7; i++)
v.push_back(i);
try
{
int iVal1 = v[7]; // not bounds checked - will not throw
int iVal2 = v.at(7); // bounds checked - will throw if out of range
}
catch(const exception& e)
{
cout << e.what();
}

我们使用reserve()分配了10个int型的空间,但并不没有初始化。
你可以在这个代码中尝试不同条件,观察它的结果,但是无论何时使用at(),都是正确的。
删除vector中的数据
vector能够非常容易地添加数据,也能很方便地取出数据,同样vector提供了erase(),pop_back(),clear()来删除数据,当你删除数据的时候,你应该知道要删除尾部的数据,或者是删除所有数据,还是个别的数据。在考虑删除等操作之前让我们静下来考虑一下在STL中的一些应用。
Remove_if()算法
现在我们考虑操作里面的数据。如果要使用remove_if(),我们需要在头文件中包含如下代码::
#include <algorithm>

Remove_if()有三个参数:
1、 iterator _First:指向第一个数据的迭代指针。
2、 iterator _Last:指向最后一个数据的迭代指针。
3、 predicate _Pred:一个可以对迭代操作的条件函数。
条件函数
条件函数是一个按照用户定义的条件返回是或否的结果,是最基本的函数指针,或者是一个函数对象。这个函数对象需要支持所有的函数调用操作,重载operator()()操作。remove_if()是通过unary_function继承下来的,允许传递数据作为条件。
例如,假如你想从一个vector<CString>中删除匹配的数据,如果字串中包含了一个值,从这个值开始,从这个值结束。首先你应该建立一个数据结构来包含这些数据,类似代码如下:
#include <functional>
enum findmodes
{
FM_INVALID = 0,
FM_IS,
FM_STARTSWITH,
FM_ENDSWITH,
FM_CONTAINS
};
typedef struct tagFindStr
{
UINT iMode;
CString szMatchStr;
} FindStr;
typedef FindStr* LPFINDSTR;

然后处理条件判断:
class FindMatchingString : public std::unary_function<CString, bool>
{
public:
FindMatchingString(const LPFINDSTR lpFS) : m_lpFS(lpFS) {}
bool operator()(CString& szStringToCompare) const
{
bool retVal = false;
switch(m_lpFS->iMode)
{
case FM_IS:
{
retVal = (szStringToCompare == m_lpFDD->szMatchStr);
break;
}
case FM_STARTSWITH:
{
retVal = (szStringToCompare.Left(m_lpFDD->szMatchStr.GetLength())
== m_lpFDD->szWindowTitle);
break;
}
case FM_ENDSWITH:
{
retVal = (szStringToCompare.Right(m_lpFDD->szMatchStr.GetLength())
== m_lpFDD->szMatchStr);
break;
}
case FM_CONTAINS:
{
retVal = (szStringToCompare.Find(m_lpFDD->szMatchStr) != -1);
break;
}
}
return retVal;
}
private:
LPFINDSTR m_lpFS;
};

通过这个操作你可以从vector中有效地删除数据:
// remove all strings containing the value of
// szRemove from vector<CString> vs.
FindStr fs;
fs.iMode = FM_CONTAINS;
fs.szMatchStr = szRemove;
vs.erase(std::remove_if(vs.begin(), vs.end(), FindMatchingString(&fs)), vs.end());

Remove_if()能做什么?
你可能会疑惑,对于上面那个例子在调用remove_if()的时候还要使用erase()呢?这是因为大家并不熟悉STL中的算法。Remove(),remove_if()等所有的移出操作都是建立在一个迭代范围上的,那么不能操作容器中的数据。所以在使用remove_if(),实际上操作的时容器里数据的上面的。思考上面的例子:
1、 szRemove = “o”.
2、 vs见下面图表中的显示。
观察这个结果,我们可以看到remove_if()实际上是根据条件对迭代地址进行了修改,在数据的后面存在一些残余的数据,那些需要删除的数据。剩下的数据的位置可能不是原来的数据,但他们是不知道的。
调用erase()来删除那些残余的数据。注意上面例子中通过erase()删除remove_if()的结果和vs.enc()范围的数据。
压缩一个臃肿的vector
很多时候大量的删除数据,或者通过使用reserve(),结果vector的空间远远大于实际需要的。所有需要压缩vector到它实际的大小。resize()能够增加vector的大小。Clear()仅仅能够改变缓存的大小,所有的这些对于vector释放内存等九非常重要了。如何来解决这些问题呢,让我们来操作一下。
我们可以通过一个vector创建另一个vector。让我们看看这将发生什么。假定我们已经有一个vector v,它的内存大小为1000,当我们调用size()的时候,它的大小仅为7。我们浪费了大量的内存。让我们在它的基础上创建一个vector。
std::vector<CString> vNew(v);
cout << vNew.capacity();

vNew.capacity()返回的是7。这说明新创建的只是根据实际大小来分配的空间。现在我们不想释放v,因为我们要在其它地方用到它,我们可以使用swap()将v和vNew互相交换一下
vNew.swap(v);
cout << vNew.capacity();
cout << v.capacity();

有趣的是:vNew.capacity()是1000,而v.capacity()是7。
现在是达到我的目的了,但是并不是很好的解决方法,我们可以像下面这么写:
std::vector<CString>(v).swap(v);

你可以看到我们做了什么?我们创建了一个临时变量代替那个命名的,然后使用swap(),这样我们就去掉了不必要的空间,得到实际大小的v

Ⅶ 什么叫C语言中的可执行语句

可执行语句执行一项操作。它调用过程、分支到代码中的另一个位置、循环执行多个语句中,或计算表达式的值。赋值语句是可执行语句的一种特殊情况。
下面的示例使用
If...Then...Else
控制结构根据变量的值运行不同的代码块。在每个代码块内,For...Next
循环将运行指定的次数。
VB
Public
Sub
startWidget(ByVal
aWidget
As
widget,
_
ByVal
clockwise
As
Boolean,
ByVal
revolutions
As
Integer)
Dim
counter
As
Integer
If
clockwise
=
True
Then
For
counter
=
1
To
revolutions
aWidget.spinClockwise()
Next
counter
Else
For
counter
=
1
To
revolutions
aWidget.spinCounterClockwise()
Next
counter
End
If
End
Sub
前面示例中的
If
语句检查参数
clockwise
的值。如果该值为
True,它将调用
aWidget

spinClockwise
方法。如果该值为
False,它将调用
aWidget

spinCounterClockwise
方法。If...Then...Else
控制结构以
End
If
结尾。
每个块内的
For...Next
循环将调用相应的方法一定的次数(与
revolutions
参数的值相等)。

Ⅷ 编写的C语言程序,怎样制作一个UI界面

c语言制作UI界面需要相关的UI库

如windows操作系统本身就提供了UI的接口

一个简单的示例代码如下

#include<windows.h>

LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);

intWINAPIWinMain(HINSTANCEhinstance,HINSTANCEhprevinstance,LPSTRline,intcmd)
{
staticTCHARAppName[]=TEXT("99");
HWNDhwnd;
MSGmsg;
WNDCLASSwndclass;

wndclass.style=CS_HREDRAW|CS_VREDRAW;
wndclass.lpfnWndProc=WndProc;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hInstance=hinstance;
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName=NULL;
wndclass.lpszClassName=AppName;

if(!RegisterClass(&wndclass))
{
MessageBox(NULL,TEXT("ThisprogramrequiresWindowsNT!"),AppName,MB_ICONERROR);
return0;
}

hwnd=CreateWindow(AppName,TEXT("九九乘法口诀表"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hinstance,
NULL);

ShowWindow(hwnd,cmd);
UpdateWindow(hwnd);

while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

returnmsg.wParam;
}

LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwparam,LPARAMlparam)
{
HDChdc;
PAINTSTRUCTps;
RECTrect;
staticx,y;
inti,j;
intlen;
TCHARbuf[50];
TEXTMETRICtm;

switch(message)
{
caseWM_CREATE:
hdc=GetDC(hwnd);
GetTextMetrics(hdc,&tm);
x=tm.tmAveCharWidth;
y=tm.tmHeight+tm.tmExternalLeading;
ReleaseDC(hwnd,hdc);
//MessageBox(NULL,TEXT("CreateSuccessed!"),TEXT("Successed"),MB_OK);
//PlaySound(TEXT("hello.wav"),NULL,SND_FILENAME|SND_ASYNC);
return0;

caseWM_PAINT:
hdc=BeginPaint(hwnd,&ps);
GetClientRect(hwnd,&rect);
//DrawText(hdc,TEXT("HelloWorld!"),-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
//TextOut(hdc,rect.right/2-(strlen("HelloWorld!")/2)*x,rect.bottom/2-y/2,TEXT("HelloWorld!"),12);
for(i=1;i!=10;++i)
{
for(j=1;j!=i+1;++j)
{
len=wsprintf(buf,TEXT("%dx%d=%-4d"),j,i,i*j);
TextOut(hdc,j*len*x,i*y,buf,len);
}
}

EndPaint(hwnd,&ps);
return0;

caseWM_DESTROY:
PostQuitMessage(0);
return0;
}

returnDefWindowProc(hwnd,message,wparam,lparam);
}

上面是一个打印windows下拥有窗口界面的九九乘法口诀表的c语言程序代码


同样的c语言也会有其它的UI库

比如Gtk,Gtk是可移植的UI库

可以使用它在Linux、windows包括mac等等操作系统上做ui程序设计

一个简单的示例代码如下

#include<gtk/gtk.h>

intmain(intargc,char**argv)
{
GtkWidget*win;
GtkWidget*label;
inti,j;
GString*str;

gtk_init(&argc,&argv);

win=gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_position(GTK_WINDOW(win),GTK_WIN_POS_CENTER);
g_signal_connect(G_OBJECT(win),"delete-event",G_CALLBACK(gtk_main_quit),NULL);

str=g_string_new(NULL);

for(i=1;i<=9;++i)
{
for(j=1;j!=i+1;++j)
g_string_append_printf(str,"%dx%d=%-4d",j,i,i*j);

g_string_append(str," ");
}

label=gtk_label_new(str->str);
gtk_container_add(GTK_CONTAINER(win),label);

gtk_widget_show_all(win);
gtk_main();

g_string_free(str,TRUE);
return0;
}

Ⅸ widget是用什么语言来变成的

是用Java语言编写的。需要安装引擎也印证了这一点,因为几年前微软就把sun的Java引擎从系统剥离出去了,害怕Java占了c语言的江山。但是Java语言确实优秀。
楼主注意白字。

Ⅹ widget怎么编写呢

你想编写什么样的widget?各种widget如下

1. Yahoo!Widgets
Yahoo! Widgets桌面应用程序平台由Widget工具和Widget引擎两部分组成。在Yahoo! Widgets工具平台上运行的迷你应用程序就统称为Widget工具
Widget引擎提供了Widget应用程序的运行平台,在Windows和Mac操作系统环境下都可以使用,安装引擎后就能在此平台上运行各式各样的Widget工具了。Yahoo! Widgets引擎开放了基于XML和JavaScript的Widget开发接口,任何人都可以开发新的有趣的Widget,包括各种小工具、小游戏等。当多个Widget同时运行时,每一个Widget又作为独立的程序运行,这可以确保一个Widget出现异常时不会影响到其他的Widget。
2. Apple Dashboard Widget
Dashboard技术 通过Dashboard可以开发一种新的迷你程序 —— Dashboard Widget。
Dashboard是基于WebKit开发的,它为Apple Widget程序提供了一个运行环境。Widget应用可以采用HTML、JavaScript以及CSS等Web技术开发。另外,由于Dashboard是Mac OS系统内置的技术,因此Dashboard Widget还可以调用Mac OS系统本身提供的部分功能。
Dashboard Widget以“.wdgt”为后缀,根据运行所需要的资源,可以分成3种类别。
(1)附件Widget:是自包含的 Widget,它不需要其他应用程序的支持或者访问互联网。时钟、定时器、计算器以及便签都属于这个范畴。
(2)应用程序Widget:它与一个功能完全的应用程序相关联。这种 Widget 为应用程序提供一个复杂度比较低的界面,而且通常是只读的界面,对应用程序进行增强。iTunes 控制器和地址簿 Widget 都属于这个范畴。
(3)信息Widget:这是为了向用户提供来自互联网的数据而设计的。这些 Widget 使用户可以监控某些事件,比如天气、航班状态或者股票价格。
Dashboard 在为Mac OS的最终用户提供强大功能的同时,也为开发者带来了一个新鲜而丰富的开发环境。Widget 开发起来很快且易于部署,还可以调用Mac OS的部分系统功能。对于那些仅使用少量数据或者需要和其他程序交互的场合来说,Widget 是非常完美的技术,而且它还提供一个非常好的方式,来为已经存在的应用程序增加功能。对于开发者来说,这意味着很多机会:可以创建一个新的产品,也可以为现有的产品增加新功能,使之区别于其他同类产品。
3. Google Gadget
Google Gadget是简单的XML和JavaScript小型应用程序,,包括iGoogle、Google地图、Orkut或其他任何网页以及Google Desktop。
另外,Google Gadget还将Google现有的一些服务,例如Calendar、Blog、Map等,以独立模块的形式整合在一起。Google Gadget服务的表现形式是个性化主页或者Google桌面软件。
Google Gadget运行环境可以分为两类:一类是网页环境,如iGoogle、Google 地图、Orkut 或其他任何网页;另外一类就是Google Desktop。目前Google Desktop可以运行在Linux、Windows和Mac三种操作系统之上。运行在网页上的Gadget采用HTML语言编写,为了增强交互效果,可以加入JavaScript、Flash或者Silver light。Desktop Gadgets采用XML和JavaScript编写,也可以采用C、C++、C#或者 VB.net编写。Desktop Gadgets可以使用一些高级功能,如任意形状、透明效果、客户端库,而且能够响应用户来自Gadget外的一些动作
4. Opera Widget
Opera Widget并未提供一个统一的Widget管理工具,如果要运行Widget,需要首先启动Opera浏览器。在浏览器的窗口中,人们可以通过Opera桌面浏览器菜单“饰件→添加Widgets”来访问Opera Widget网站,并且可以进行Widget应用的下载、安装以及运行。
Opera Widget 也是用 HTML、CSS和JavaScrip等Web技术创建的跨平台应用程序,它是按照zip格式压缩的。Opera Widget必须以“.wgt”为后缀,content-type为“application/x-opera-Widgets”。它可以运行在所有安装Opera浏览器的平台上,如个人电脑、移动设备和游戏机。
Opera Widget是在不同设备上快速创建和部署应用程序的很好的方案。因此,用户可以快速轻松地开发Opera Widget,并且只要稍加改动就可以运行在各种不同的设备上。
Opera Widget运行环境可以运行在很多平台上,不同的平台有不同的特性和用例。不同平台的Widget运行环境,都希望最好地支持此设备的特性。运行环境可能会要求Widget以下面4种模式中的一种模式显示:Widget模式、漂浮模式、应用程序模式、全屏模式。
可以通过设置Widget的配置文件config. xml中的Widget的default mode属性来设置Widget的默认模式。Widget运行环境可能会要求Widget在模式间切换,例如从浮动模式先切换到应用程序模式,再切换到全屏模式。
为了方便开发Widget,Opera公司开发了Opera Widgets SDK,该SDK提供了开发工具、库、文档和实例。Opera Dragonfly是一个轻量级的开发工具,它可以调试JavaScript,查看CSS和HTML DOM。
5. JIL Widget
JIL Widget采用HTML、CSS、JavaScript编写的Web应用程序,后缀为“.wgt”。通过分析JIL Widget格式,可以发现JIL Widget与W3C Widget格式极为相似,所以开发者可以将基于W3C Widget格式应用很容易地转换成JIL Widget格式。
JIL Widget运行在JIL Widget引擎之上,JIL Widget引擎在支持Web标准的同时,也扩展了很多新的功能,这主要体现在以下两个方面。
(1)各种终端能力:JIL Widget引擎扩展了Telephony、PIM、Multimedia、Device、Messaging等对象,可以提供电话、通讯录、日程安排、多媒体、文件操作、系统信息等功能。
(2)运营商网络能力:通过扩展接口,可以获得位置、手机号码、在线状态等信息。
6. WRT Widget
Web Run-Time(WRT)是Symbian S60第三版Feature Pack 2平台引入的一个很重要的功能。Web Run-Time扩展了S60 Web浏览器,使之能支持Widget。它所支持的Widget是用标准Web技术开发的轻量级应用。
Web Run-Time的第一个版本专注于在移动终端上提供快速的信息呈现新方法。
从技术角度来看,WRT在流行的S60 Web浏览器中增加了一个Web程序的运行环境,使得S60设备可以运行Widget。事实上,几乎不花什么工夫就可以将桌面Widget迁移到WRT中来,
开发者可以使用现有的编写工具来创建和打包自己的应用。
在最新的S60第5版中整合了S60平台服务,可用标准的HTML和JavaScript技术创建更具个性和环境感知性的Widget。通过获取存储在本地设备上的信息,如日历和通讯录程序,Widget可以整合互联网和本地资源,提供一个全新的、个性化的服务体验。例如,通过访问设备上的GPS功能,Widget可以给用户提供更具相关性和环境感知性的信息。作为Web开发者,可以轻易地使用JavaScript扩展来访问这些新特性。
基于S60 V3.2平台的手机都支持WRT Widget,在Nokia的N97上,用户可以将自己喜欢的Widget应用放在待机屏幕上。目前,Widget应用成为Nokia OVI商店中一种重要的应用形式,可供用户下载的Widget应用有70多种。