说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

做一个OpenGL控件-Delphi资料

HTML文档下载 WORD文档下载 PDF文档下载
做一个OpenGL控件-Delphi资料

OpenGL是一个独立于窗口的图形库,而图形最终是在窗口系统里绘制出来的,那么OpenGL的绘图命令是怎么在窗口里生成输出的呢?

这就是各个系统上的OpenGL实现者需要做的工作了。在Windows里是通过wgl库完成的,在X-Windows里是通过glx服务器来完成的,至于这些OpenGL实现具体是怎么工作的,请参考sgi发布的sample implement源码,不过那个代码是用C写的。

在MS-Windows里,wgl库负责将OpenGL的绘制设备RenderContext与GDI的DeviceContext联系起来,使得发到OpenGL的RC里的命令生成的位图能够在GDI DC里绘制出来,你可以把它想象成OpenGL在RC里有一个FrameBuffer,记录着生成的图案,而wgl则负责把FrameBuffer的内容BitBlt到DC上。当然,这并不是它实际的工作方法,如果想了解更多请参考SGI发布的SDK资料或联系MS公司。

为了使GDI DC能够接受OpenGL RC的输出,必须为DC选定特别的像素格式,然后建立RC,再用wglMakeCurrent把当前要使用的RC和DC联系起来。此后我们就可以用OpenGL命令正常工作了。在一个程序里可以创建多个RC和多个DC,程序中的OpenGL命令会发到被wglMakeCurrent指定为当前的那一组合中。

我并不认为这个初始化过程是个很有意思的工作,这个世界上有很多聪明的程序员也这么想,所以他们发明了glaux库和glut库。glaux是在著名的OpenGL Programmer Guide里提出的,这本书是OpenGL编程的官方文档,因为它的封皮是红色的,所以通常简称为RedBook。故名思意,glaux是一套输助库,它使得你无须关心在具体窗口系统里初始化、消息响应的细节,而是使用传统的c/dos程序风格编制OpenGL程序。

int main(int argc

char** argv)

{ auxInitDisplayMode( AUX_SINGLE|AUX_RGB|AUX_DEPTH16);//使用单缓冲、RGB彩色模式、16位浓度

auxInitPosition(0

0

250

250);

auxInitWindow("Title");//以上两行在(0

0)片建立了一个大小为250X250的窗口,其标题为"Title"。

myinit();//建立OpenGL透视投影环境

auxReshapeFunc(myReshape);//指定窗口大小变化的响应函数

auxMainLoop(display);//指定绘制函数

return 0; }

由于glaux是为教学目的开发的,所以实用价值很限,所以又有程序员开发了glut,这套库被广泛使用,它的工作方式与glaux极为类似,但功能完善得多,特别是对交互、全屏等的支持要理想得多,所以许多的OpenGL演示程序使用它,比如SGI网站上提供的多数演示程序都需要使用它。同时这套库已经被移植到多种平台上,所以要是想用简单的方法开发在windows/macos/os2/xwindows等系统上都能使用的程序,那么应该选择这套库。

我并不认为一个Delphi程序员会喜欢glaux或glut,因为那意味着你不能利用Delphi的可视开发能力,另外任何真正实用的Delphi程序想直接在其它操作系统上编译运行好象也不现实,即glut的跨平台能力也没有什么吸引力。我们应该开发一个VCL控件,把初始化工作封装起来。

我认为从TCustomPanel派生一个子类比较方便,让我们称它为TGLPanel吧。初始化过程要在WMCreate里完成,之所以要放在这里是因为这个时候Window Handle已经建立,但还没启用。

在WMCreate中会

①调用initDC完成DC调整工作,initDC会以本窗口使用的DC调用PreparePixelFormat,而PixelFormat则真正完成像素格式调整。

②然后WMCreate会调用InitGL完成OpenGL透视投影环境的设定。

③最后调用OnInit给用户一个调整透视投影环境的机会。

注意,如果要在MDI环境中的子窗体中使用OpenGL,还有些附加工作要做,这就是给窗口类的Params.Style加上WS_CLIPCHILDREN和WS_CLIPSIBLINGS属性,这得在Window Handle建立之前就完成,因此要写在CreateParams里。由于SDI应用并不需要该代码,所以应该定义OnPreInit事件,让用户在需要的时候自己加上,在Create里调用OnPreInit。以下代码定义了OnPreInit,但并没有定义CreateParams,如果需要自己加上吧。

在TGLPanel类中实际所做工作的详细说明(按成员可见性组织):

私有

1、加入DC/RC/Pal私有变量

2、定义初始化DC/RC的私有方法

保护:

3、加入FOnPaint

FOnResize

FOnInit

FOnPreInit四个事件响应变量。

4、继承/重载虚方法CreateParams

Paint

Resize

5、响应以下消息

WM_CREATE

TWMCreate

WMCreate

WM_DESTROY

TWMDestroy

WMDestroy

WM_PALETTECHANGED

TWMPaletteChanged

WMPaletteChanged

WM_QUERYNEWPALETTE

TWMQueryNewPalette

WMQueryNewPalette

WM_ERASEBKGND

TWMEraseBkgnd

WMEraseBkgnd

公开:

6、定义建构与析构方法

7、定义必要的其它方法以提供各种特性

发布:

8、以下继承来的属性

__property Alignment;

__property Align;

__property DragCursor;

__property DragMode;

__property Enabled;

__property ParentFont;

__property ParentShowHint;

__property PopupMenu;

__property ShowHint;

__property TabOrder;

__property TabStop;

__property Visible;

9、以下继承来的方法

__property OnClick;

__property OnDblClick;

__property OnDragDrop;

__property OnDragOver;

__property OnEndDrag;

__property OnEnter;

__property OnExit;

__property OnMouseDown;

__property OnMouseMove;

__property OnMouseUp;

__property OnStartDrag;

10、加入以下事件

//初始化OpenGL状态

__property TNotifyEvent OnInit = {read=FOnInit

write=FOnInit};

//专用于修改显示BPP模式

__property TNotifyEvent OnPreInit = {read=FOnPreInit

write=FOnPreInit};

11、重载以下事件

__property TNotifyEvent OnResize = {read=FOnResize

write=FOnResize};

__property TNotifyEvent OnPaint = {read=FOnPaint

write=FOnPaint};

12、将消息与其响应函数连接起来(Delphi中这一步是在定义函数时指定的)

源代码

unit GLPanel;

interface

uses

Windows

Messages

SysUtils

Classes

Graphics

Controls

Forms

Dialogs

ExtCtrls

OpenGL;

type

TGLPanel = class(TCustomPanel)

private

{ Private declarations }

DC: HDC;

RC: HGLRC;

procedure initDC;

procedure initGL;

procedure PreparePixelFormat(var DC: HDC);

protected

{ Protected declarations }

FOnPaint:TNotifyEvent;

FOnInit:TNotifyEvent;

FOnPreInit:TNotifyEvent;

FOnResize:TNotifyEvent;

procedure Paint;override;

procedure Resize;override;

procedure WMDestroy(var Msg: TWMDestroy);message WM_DESTROY;

procedure WMCreate(var Msg:TWMCreate); message WM_CREATE;

public

{ Public declarations }

constructor Create(Owner:TComponent);override;

published

{ Published declarations }

property Alignment;

property Align;

property DragCursor;

property DragMode;

property Enabled;

property ParentFont;

property ParentShowHint;

property PopupMenu;

property ShowHint;

property TabOrder;

property TabStop;

property Visible;

property OnClick;

property OnDblClick;

property OnDragDrop;

property OnDragOver;

property OnEndDrag;

property OnEnter;

property OnExit;

property OnMouseDown;

property OnMouseMove;

property OnMouseUp;

property OnStartDrag;

property OnInit:TNotifyEvent read FOnInit write FOnInit;

property OnPreInit:TNotifyEvent read FOnPreInit write FOnPreInit;

property OnResize:TNotifyEvent read FOnResize write FOnResize;

property OnPaint:TNotifyEvent read FOnPaint write FOnPaint;

end;

procedure Register;

implementation

procedure Register;

begin

RegisterComponents(’Samples’

[TGLPanel]);

end;

//---------------------------------------------

constructor TGLPanel.Create;

begin

inherited;

end;

//---------------------------------------------

procedure TGLPanel.WMDestroy(var Msg: TWMDestroy);

begin

wglMakeCurrent(0

0);

wglDeleteContext(RC);

ReleaseDC(Handle

DC);

end;

//---------------------------------------------------

procedure TGLPanel.initDC;

begin

DC := GetDC(Handle);

PreparePixelFormat(DC);

end;

//---------------------------------------------------

procedure TGLPanel.initGL;

begin

glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

glMatrixMode(GL_PROJECTION);

glLoadIdentity;

glEnable(GL_LIGHTING);

glEnable(GL_LIGHT0);

glOrtho(-1

1

-1

1

-1

50);

glMatrixMode(GL_MODELVIEW);

glLoadIdentity;

glEnable(GL_DEPTH_TEST);

//注意下面这一行是为了做练习程序时可以直接用glColor指定材质而加的,

// 可能使得光照或表面材质发生意想不到的变化,

// 如果不需要可以去掉或在程序中用glDisable(GL_COLOR_MATERIAL);关闭

glEnable(GL_COLOR_MATERIAL);

glShadeModel(GL_SMOOTH);

gluLookAt(2

4

6

0

0

0

0

1

0);

SwapBuffers(DC);

end;

//---------------------------------------------

procedure TGLPanel.PreparePixelFormat(var DC: HDC);

var

PFD : TPixelFormatDescriptor;

ChosenPixelFormat : Integer;

begin

FillChar(PFD

SizeOf(TPixelFormatDescriptor)

0);

with PFD do

begin

nSize := SizeOf(TPixelFormatDescriptor);

nVersion := 1;

dwFlags := PFD_DRAW_TO_WINDOW or

PFD_SUPPORT_OPENGL or

PFD_DOUBLEBUFFER;

iPixelType := PFD_TYPE_RGBA;

cColorBits := 16; // 16位颜色

cDepthBits := 32; // 32位深度缓冲

iLayerType := PFD_MAIN_PLANE;

{ Should be 24

but we must allow for the clunky WKU boxes }

end;

ChosenPixelFormat := ChoosePixelFormat(DC

@PFD);

if ChosenPixelFormat = 0 then

Raise Exception.Create(’ChoosePixelFormat failed!’);

SetPixelFormat(DC

ChosenPixelFormat

@PFD);

end;

procedure TGLPanel.WMCreate(var Msg:TWMCreate);

begin

//在这里做初始化工作

//修改DC的象素格式,使之支持OpenGL绘制

initDC;

RC := wglCreateContext(DC);

wglMakeCurrent(DC

RC);

//初始化GL绘制系统

initGL;

if Assigned(FOnInit) then

begin

if (wglMakeCurrent(DC

RC)=false) then

ShowMessage(’wglMakeCurrent:’ + IntToStr(GetLastError));

FOnInit(self);

end;

end;

//

procedure TGLPanel.Paint;

begin

//TCustomPanel::Paint();

if Assigned(FOnPaint) then

begin

wglMakeCurrent(DC

RC);

FOnPaint(self);

SwapBuffers(DC);

end;

end;

//

procedure TGLPanel.Resize;

begin

inherited;

if Assigned(FOnResize) then

begin

wglMakeCurrent(DC

RC);

glViewport(0

0

ClientWidth

ClientHeight);

FOnResize(self);

end;

end;

end.

以上代码仅用来说明原理及建立一个基本的练习环境,您可以自由使用,转载请注明出处。如果使用从本人主页下载的TGLPanel请遵守内附使用说明的版权申明。如果实际做东西,建议使用Mike Lischke的GLScene控件组(http://www.lischke-online.de/)。

end

else

删除注册表项....................... end;初始化扩展是通过IShellExtInit实现的,当外壳调用IShellExtInit.Initialize时,它传递一个数据对象包含来文件对应的目录的PIDL标识符。Initialize方法需要从数据对象中提取文件名,并把文件名和PIDL标识符保存起来为了以后使用。

function TCXPropSheet.SEIInitialize(pidlFolder: PItemIDList;

lpdobj: IDataObject; hKeyProgID: HKEY): HResult;

var

StgMedium: TStgMedium;

FormatEtc: TFormatEtc;

szFile: array[0..MAX_PATH+1]of Char;

filecount: integer;begin

Result:=E_FAIL;

if(lpdobj=nil)then

begin

Result:=E_INVALIDARG;

messagebox(0

’1’

’错误’

mb_ok);

Exit;

end;

with FormatEtc do

begin

cfFormat:=CF_HDROP;

ptd:=nil;

dwAspect:=DVASPECT_CONTENT;

lindex:=-1;

tymed:=TYMED_HGLOBAL;

end;

Result:=lpdobj.GetData(FormatEtc

StgMedium);

if Failed(Result)then

Exit;

//如果只有一个文件被选中,获得文件名并保存。

filecount:=DragQueryFile(stgmedium.hGlobal

$FFFFFFFF

nil

0);

if filecount=1 then

begin

Result:=NOERROR;

DragQueryFile(stgmedium.hGlobal

0

szFile

SizeOf(szFile));

FFilename:=strpas(szFile);

end;

ReleaseStgMedium(StgMedium);end;添加页面的操作是通过IShellPropSheetExt接口来实现的。如果属性页是和文件相关联,外壳会调用IShellPropSheetExt.AddPages给属性页添加一个页面。如果属性页同控制面板程序相关联,外壳调用IShellPropSheetExt.ReplacePage来替换页面。

IShellPropSheetExt.AddPages方法有两个参数,lpfnAddPage是一个指向AddPropSheetPageProc回调函数的指针,回调函数用来提供要添加的页面信息给外壳。lParam是一个用户自定义的值,这里我们用它来返回给回调函数对象。

一般的IShellPropSheetExt.AddPages方法实现步骤是:

给PROPSHEETPAGE结构设定正确的值,特别是:

把扩展的对象引用记数变量付值给pcRefParent成员,这可以防止页面还在显示时,扩展对象被卸载。

实现PropSheetPageProc回调函数来处理页面创建和销毁的情况。

调用CreatePropertySheetPage函数来创建页面。

调用lpfnAddPage指向的函数来来添加创建好的页面。

function TCXPropSheet.AddPages(lpfnAddPage: TFNADDPROPSHEETPAGE;

lParam: LPARAM): HResult;var

PSP: TPropSheetPage;

HPSP: HPropSheetPage;begin

result:=E_FAIL;

try

psp.dwSize:=SizeOf(psp);

psp.dwFlags:=PSP_USEREFPARENT or PSP_USETITLE or PSP_USECALLBACK;

psp.hInstance:=hInstance;

//这里我们使用了事先储存在wave.res中的对话框模板

模板是用delphi5自带的

//resource workshop编辑的,使用delphi5\bin\brcc32.exe编译的。

psp.pszTemplate:=MakeIntResource(100);

//标题名

psp.pszTitle:=’波文件信息’;

//设定回调函数

psp.pfnDlgProc:=@DialogProc;

psp.pfnCallBack:=@PropCallback;

//设定对象引用记数变量

psp.pcRefParent:=@comserver.objectcount;

//用lParam向回调函数传递对象

psp.lParam:=integer(self);

HPSP:=CreatePropertySheetPage(psp);

if HPSP<>nil then begin

if not lpfnAddPage(HPSP

lParam)then begin

DestroyPropertySheetPage(HPSP);

end else begin

_addref;//增加引用记数,否则一脱离这个方法的作用域,delphi自动释放对象。

result:=S_OK;

end

end

except

on e: exception do begin

e.message:=’添加页面’+e.message;

messagebox(0

pchar(e.message)

’错误’

mb_ok);

end;

end;end;

function TCXPropSheet.ReplacePage(uPageID: UINT;

lpfnReplaceWith: TFNADDPROPSHEETPAGE; lParam: LPARAM): HResult;begin

Result:=E_NOTIMPL;//同文件关联时,外壳不调用ReplacePage

所以不用实现end;回调函数处理属性页的消息,主要要响应WM_INITDIALOG消息来初始化页面显示信息,响应WM_COMMAND消息来处理用户交互,响应WM_NOTIFY消息来处理页面切换或关闭后处理操作结果。

function DialogProc(hwndDlg: HWnd; Msg: UINT; wParam: wParam;

lParam: LPARAM): Bool; stdcall;

var

PageObj: TCXPropSheet;

filename: string;

displayName : string;

SheetHWnd: HWnd;

begin

result:=false;

try

if Msg=WM_INITDIALOG then begin//初始化界面

//获得lparam传递过来的对象

pageObj:=TCXPropSheet(PPropSheetPage(lParam)^.lParam);

//保存对象信息

SetWindowLong(hwndDlg

DWL_USER

integer(pageObj));

//设置界面显示波文件信息

SetDlgItemText(hwndDlg

100

PChar(ExtractFileName(PageObj.FFileName)));

OpenMedia(PageObj.FFileName);

SetDlgItemText(hwndDlg

101

PChar(IntToStr(GetWavStatus(MCI_WAVE_STATUS_AVGBYTESPERSEC))));

SetDlgItemText(hwndDlg

102

PChar(IntToStr(GetWavStatus(MCI_WAVE_STATUS_BITSPERSAMPLE))));

SetDlgItemText(hwndDlg

103

PChar(IntToStr(GetWavStatus(MCI_WAVE_STATUS_CHANNELS))));

CloseMedia;

SetWindowLong(hwndDlg

DWL_MSGRESULT

0);

Result:=TRUE;

end

else if(Msg=WM_COMMAND)then begin

if Lo(wParam)=110 then//用户点击了关于按钮(id=110)

MessageBox(0

’作者:hubdog’+#13#10+’email:hubdog@263.net’

’关于...’

MB_OK);

end else if(msg=WM_NOTIFY)then begin

sheetHwnd:=getparent(hwndDlg);//获得属性页的窗口句柄

case PNMHdr(lparam)^.code of

//页面失去焦点

PSN_KILLACTIVE:

begin

SetWindowLong(hwndDlg

DWL_MSGRESULT

0);

Result:=TRUE;

end;

end;

end;

except

on e: exception do begin

e.message:=’回调处理’+e.message;

messagebox(0

pchar(e.message)

’错误’

mb_ok);

end;

end;

end;

建立同驱动器相关联的属性页扩展用

同上面讲的有两点不同:

IShellExtInit.Initialize方法传递过来的数据对象包含的驱动器路径可能是CFSTR_MOUNTEDVOLUME格式而不是CF_HDROP格式的。标准驱动器是CF_HDROP格式的,而在NTFS文件系统中映射的远程设备则是CFSTR_MOUNTEDVOLUME格式的。

注册表项是HKEY_CLASSES_ROOT\Drive\Shellex\PropertySheetHandlers子键。

建立控制面板属性页扩展

同上面讲的有两点不同:

控制面板程序调用IShellPropSheetExt.ReplacePage方法来替换页面,它不调用IShellPropSheetExt。AddPages方法。

注册方式:子键可以在不同位置创建,这依赖于扩展是针对用户还是针对机器的。对用户方式子键是HKEY_CURRENT_USER\REGSTR_PATH_CONTROLPANEL,否则子键是HKEY_LOCAL_MACHINE\REGSTR_PATH_CONTROLSFOLDER。

本程序在Delphi5,Win NT 4.0,K6-233系统下调试成功。例子程序可以到http://chaozhi.com/lgc去下载

集成开发环境:Qt Creator 2.7.0发布 移动周报:“今日头条”CEO,爱冒险的技术宅 从China Daily的iPad版,看中国纸媒如何摆脱“旧情结” 天睿推出大数据探索平台:“开箱即用”的数据分析 Basho开源Riak CS,与AWS S3兼容的云存储架构 MongoDB Days北京杂记 VMware携手亿阳信通 铺垫混合服务 行业应用,移动优先:移动难七大痛点剖析 HTML5开发必备:游戏开发资源合集 老而弥坚:65岁传奇Android工程师谈开发 2013中国云计算有奖大调查,每周大奖等你拿! Google Reader之死另一个不为人知的原因 小团队谈推广:豆果、金山、微博易、面包旅行 敏捷实战:如何让团队迭代交付周期缩短一半 移动设备管理初创公司AirWatch:首轮融资2亿美元 New Relic:不等应用崩溃,实时监控你的App! Zynga力挽狂澜三步棋:移动+授权+自有网络 巧用MapReduce+HDFS,海量数据去重的五大策略 革自己的命?为带来一致体验 IE11伪装FireFox 最古老的Linux发行版Slackware以及Arch Linux齐弃MySQL JEECG v2.3 发布,基于代码生成器的智能开发框架 Mozilla将设应用工场 Firefox OS瞄准欧洲南美 Summly创始人:12岁开始编程 17岁公司卖了3000万美元 因SaaS与NoSQL,Oracle雄风不在? 那些年云计算领域的大牛们 回顾:那些被平台方封杀的第三方应用 [热帖推荐] 中国的程序员,真的“短命”吗? 聚焦HTML5移动开发 第六届英特尔杯大学生软件开发大赛开幕 虚拟化技术新星Pluribus Networks获中国VC青睐 可穿戴开发!Pebble Watchface SDK 4月发布 我想做个程序员:一位编程小白的App开发故事 有关Acrobat 组件的错误 关于火车查询 CTreeCtrl 的同一item项被多次点击时,会出发什么消息?你知道吗? WINCE的市场 控件ID有何用? 初学XML,请问ASP传回的中文字怎么是乱码? 请问圆锥体侧面积计算公式是什么?快阿,正在考试!!!!!!!!!!!!!! (♂逍遙剑♂) 过来聊聊!进来! 怎样用文件的形式对数据库进行备份? 能在标题栏添加控件吗?谁能告诉我? 谁知道在Activex控件中事件执行顺序的问题 3山好可怜,被女人抓住了把柄,知道了粗细长短,哎。。。 想在odbc里用程序的方法建立驱动,怎么实现? vc编的DLL怎样处理LIB在BCB中可以直接用哦?我用WINAPI那个约定 救命的!!! 深圳的“同志”好多啊!有一个哥们还向我推荐了一个同志网站,可惜我不是同志,如果有同志需要的话,可以去找那些深圳同志接头! 有懂EJB ,weblogic 大连的朋友吗? to fightwolf:give she some color to see see. 装delphi 6之前是不是要装ie5.5? 现在有一个问题:在大数据量传输的情况下,想采用异步传送方式,请问如何实现? 关于比例问题!! 有人说:做程序员很累,但我很快乐?广大程序员朋友们,有谁同意这个说法吗? 那该怎么办? MFC开发的ActiveX怎么都是OCX,可不可以是DLL,如果可以该怎么做。 如何获得当前活动控件的引用? 哪里有获得指定IP地址的机器网卡MAC地址的源程序? 新手上路:请问系统安全的市场前景如何? 'select * from a where b like ''[as]%'''这一句有没有错呢? 哪能找到 VBScript 5.0 的联机文档 为什么第七期的杂志我还没收到啊!!~~,原以为提前先订几期,会早点收到!唉!~~ php打开CSV文件的问题!答来分去! 各位有用过aspchart这个控件的吗?为什么我不能生成图片呢? 我有一个问题大家帮我UP一下 用HTML可以制作留言版吗?有使用mailto的吗? 大哥们,小弟我准备学JAVA了给推荐几本好书吧!小弟不胜感激啊! 因为JAVA,我差点把机子砸了 网络协议相关——向大侠请教 longyear,来一下啊。 我的一个在installshield for vc6.0下制作的安装程序用installshield professional 6.1编译时出错 在运行期间只有这个控键的句柄如何知道它是不是TForm? 如何动态生成组件? CTreeCtrl 的item项已被选中,再次点击怎么触发同样的事件?我明白了,你明白了没有? 为什么有冬瓜、南瓜、西瓜却没北瓜?同样的,为什么有北京、南京、东京却没西京?这个问题困扰了偶好久…… 请问GetPane得到的是什么啊? 号外号外,上海热线的吸铁石电子信箱有60M的空间,是真是假啊,我真怀疑自己看花眼了,哪位帮我确定一下,这1分就请您笑纳了 关于报表的问题--为什么细节带只打印一条记录? 初学者特来请教! 有谁能够告诉我关于RS-232口,RS-485口的有关信息???? 这个VB怎办??? 这个cookie该怎么实现? pe文件原理 英语翻译panel公司的中文是什么`? $1500元等于多少人民币? 力矩单位的换算大家好,请问1N.m等于多少N.mm?如果方便,麻烦请写一下换算过程. 英语翻译 1500毫升=()立方分米填的是分数。 30 ft lbs 等于多少 psi? rear mount on vessel console panel 怎么翻译? 1500毫升=(?)升=(?)立方米 LBS和PSI 有区别吗在美标中的压力:3000LBS,是不是和3000PSI相同的. 我国汉字的"六书”是指什么 1500-2000毫升相当几杯的水啊? 扭力转换:5IN.LBS等于多少kgf.cm 汉字的构造有六书?有哪六书 重量和牛顿是怎样换算的要具体的换算公式啊 国外的扭力in-lbs换算成中国的标准n-m怎么换算,还有kgf-cm,8 IN.LBS是多少Kg啊, 汉字六书指的是什么 牛顿和千克能换算吗?怎么换算呢? 125PSI等于多少KG?100LBS等于多少kg?请解释一下psi和LBS是指什么单位? 汉字有六书之说 指的 lb换算成牛顿还是千克阿? 一个水池的水深度为2米,池底有一个面积为10平方厘米的孔,用塞子塞住,塞子所受水的压强为多少 变阻器是通过改变连入电路中电阻线的()来改变电阻的器件,常见的有()和电位器.一滑轮变阻器的名牌上标有“2A 20Ω“的字样,其中2A表示() 20Ω表示() 汉字构造有六书之说,是指哪六书? 牛顿和千克的换算关于减速机选型,一般要计算扭矩,N*m,其中的“N”指的是牛顿力,或者说是千克力吧,现在问题是,有些地方说1Kg=1N(1米力矩上1牛可以拉动1Kg物体),有些地方说1Kg=9.8牛(自由 3296电位器做可变电阻接法3296电位器是有三个管脚,如何把三个管脚的电位器接成两个管教的可变电阻 根据词语的不同意思写句子尖锐 (1)物体有锋芒,容易刺破其他物体的:---------------------------------------------------------------------------------------------------(2)(言论、斗争等)激烈------------------ 急公斤与牛顿换算问题0.05--0.6KG剩以平方厘米等于多少N剩以平方米? 为什么I2C总线的SCL和SDL要串接电阻呢 根据句子的意思写词语.1:觉得意外或惊喜.2:冬季最寒冷的时期.3:能适应各种环境 在任何环境中都能满足. 牛顿和重量之间是怎么换算的?1牛=?KG. i2c为何加上拉电阻? 根据词语的 不同意思写句子生气:生命力,活力: 公斤和牛顿换算关系 sda?sda?什么来的? 根据词语的意思写句子 公斤和牛顿如何换算 1+1=?sdaasdasdasdadassssssssssssssss 根据下面句子的意思写词语.1.称心如意,感到非常满意的样子.2.争的向前,生怕落后.3.形容极度惊慌,行动失常的样子. 英磅/英寸怎么转换成牛顿/MM 比方说:25.5LB/IN转化成N/MM怎么转换 根据汉字的写法,从() 看() 牧() 友()炙() 书()例如“休”,左边是“人”,右边是“木”,人走到树木旁边,表示歇息的意思.按我上面这种说法来答. 《产品质量法》和国家标准《预包装食品标签通则》(GB7718)规定的食品标签必须标注的内容是什么? 牛顿怎样转换为吨 表示“书写”意思的汉字还有什么 规定国家标准格式的国标是哪个?国标号多少封皮丢了 想自己做一个也就是说国家标准的标准是什么? 液压扭矩扳手上显示单位是压力怎么转换力矩在使用液压扭矩扳手紧M30(10.9级)螺栓时,压力表上显示到350bar,能转换到力矩吗?有多大?M30(10.9级)预紧力极限值是多少?与压力表显示数值关系吗 在括号里填写与前面汉字意思相同的字组词.怨() ()冷 包() 愧() 阻() 枯() 寻() ()啸 胡萝卜素用英语怎么说 压力值怎么换算成力矩值液压力矩扳手上面的读数 (PIS mpa) 怎么换算成力矩值(N.m) 根据汉语意思填写英语不要在晚上和朋友到处闲逛.Don`t______ ________with your friends at night. 我想请问下,GB2760-2011中,固体饮料类的食品添加剂没有β胡萝卜素,但是在其他的食品中属于食品添加剂, 力矩3530N.m 怎么转换成 液压泵的压力MPa扭紧螺栓的时候是用个液压扳手,用力矩扳手,是3530N.m 现在要换算成压力,因为我用的是液压扳手,要看压力的,怎么换算,或者缺什么条件不能换 练好汉字的书写具体有何意义? 请问GB2760?请问GB2760中的甘油和苯甲酸钠的化学名称是什么,它们的规定用量是多少,标准是什么? 1N等于多少g 英语翻译要比较舒服的翻译,什么面板a,版面a,图层a,读着很不顺 1500克等于多少两? 1N/25cm等于多少g/25mm还有,请问1N/25mm等于多少g/25mm? use bracket $1500等于多少人民币 螺栓预紧力矩为17T*M,其中的T*M如何换算成国际单位制!
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn