首页 | 互联网 | IT动态 | 网络设备 | 服务器 | IDC | 安全 | Cisco | Windows | Linux | Java | .Net | Oracle | CIW | 华为 | 专题
IT技术 | 网页设计 | 平面设计 | 电子书下载 | 教学视频 | 方案 | 数字网校 | 直播室 | 虚拟考场 | 面授培训 | 搜索 | 博客 | 沙龙 | 论坛
首页 | JAVA | C# | VB | VB.NET | C/C++ | delphi | 工程管理 | 其他语言 | 论坛
免费注册一站通帐号,参与直播、论坛、下载、博客、网摘、评论,展现我的风采!
您现在的位置: 中国IT实验室 >> 桌面开发 >> Delphi >> 文章正文
比较VC和Delphi的WinTest工程
来源:中国IT实验室整理  时间:2007-4-5

  #include
  
  HWND hwndButton;
  int cx, cy;
  
  LRESULT CALLBACK MainWndProc (HWND hWindow, UINT nMsg, WPARAM wPrm, LPARAM lPrm)
  {
  
  HDC dc;
  PAINTSTRUCT ps;
  RECT rc;
  switch (nMsg)
  {
  case WM_CREATE:
  {
  TEXTMETRIC tm;
  
  dc = GetDC (hWindow);
  SelectObject (dc, GetStockObject (SYSTEM_FIXED_FONT));
  GetTextMetrics (dc, &tm);
  cx = tm.tmAveCharWidth * 30;
  cy = (tm.tmHeight + tm.tmExternalLeading) * 2;
  ReleaseDC (hWindow, dc);
  
  hwndButton = CreateWindow (
  "button",
  "Click Here",
  WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
  0, 0, cx, cy,
  hWindow,
  (HMENU) 1,
  ((LPCREATESTRUCT) lPrm)->hInstance,
  NULL
  );
  
  return 0;
  break;
  }
  
  case WM_DESTROY:
  {
  PostQuitMessage (0);
  return 0;
  break;
  }
  
  case WM_PAINT:
  {
  dc = BeginPaint (hWindow, &ps);
  GetClientRect (hWindow, &rc);
  
  rc.bottom = rc.bottom / 2;
  DrawText (dc, "Hello, World!", -1, &rc,
  DT_SINGLELINE | DT_CENTER | DT_VCENTER);
  
  EndPaint (hWindow, &ps);
  return 0;
  break;
  }
  
  case WM_SIZE:
  {
  if (hwndButton && (wPrm == SIZEFULLSCREEN ||wPrm == SIZENORMAL))
  {
  rc.left = (LOWORD(lPrm) - cx) / 2;
  rc.top = HIWORD(lPrm) * 3 / 4 - cy / 2;
  MoveWindow (hwndButton,rc.left, rc.top, cx, cy, TRUE);
  }
  return 0;
  break;
  }
  
  case WM_COMMAND:
  {
  if (LOWORD(wPrm) == 1 && HIWORD(wPrm) == BN_CLICKED &&
  (HWND) lPrm == hwndButton)
  {
  DestroyWindow (hWindow);
  }
  return 0;
  break;
  }
  }
  
  return DefWindowProc (hWindow, nMsg, wPrm, lPrm);
  }
  
  //winmain
  int __stdcall WinMain (HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmd, int nShow)
  {
  HWND hWindowMain;
  MSG MyMsg;
  
  WNDCLASSEX wcex;
  
  wcex.cbSize = sizeof(WNDCLASSEX);
  wcex.style  = CS_HREDRAW | CS_VREDRAW;
  wcex.lpfnWndProc = (WNDPROC)MainWndProc;
  wcex.cbClsExtra = 0;
  wcex.cbWndExtra = 0;
  wcex.hInstance = hInst;
  wcex.hIcon  = LoadIcon (NULL, IDI_APPLICATION);
  wcex.hCursor = LoadCursor (NULL, IDC_ARROW);
  wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
  wcex.lpszClassName = "WinTestWin";
  wcex.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
  
  
  RegisterClassEx (&wcex);
  
  hWindowMain = CreateWindow (
  "WinTestWin",
  "Hello",
  WS_OVERLAPPEDWINDOW,
  CW_USEDEFAULT,
  CW_USEDEFAULT,
  CW_USEDEFAULT,
  CW_USEDEFAULT,
  0,
  0,
  hInst,
  NULL
  );
  
  ShowWindow (hWindowMain, nShow);
  UpdateWindow (hWindowMain);
  
  while (GetMessage (&MyMsg, 0, 0, 0))
  {
  TranslateMessage (&MyMsg);
  DispatchMessage (&MyMsg);
  }
  return MyMsg.wParam;
  }
  
  
  其中选择Release方式编译,打开VC6的最小代码优化,编译生成的执行码为36.0KB,
  然后将其翻译成Delphi代码,如下:
  
  program WinTest;
  
  uses
  Windows,Messages;
  
  var
  hwndButton:HWND;
  cx,cy:Integer;
  
  function MainWndProc (hWindow:HWND;nMsg:UINT;wPrm:WPARAM;lPrm:LPARAM):LRESULT;stdcall;
  var
  dc:HDC;
  ps:PAINTSTRUCT;
  rc:TRect;
  tm:TEXTMETRIC;
  pctst:PCREATESTRUCT;
  begin
  case nMsg of
  WM_CREATE:
  begin
  dc := GetDC (hWindow);
  SelectObject (dc, GetStockObject (SYSTEM_FIXED_FONT));
  GetTextMetrics (dc, tm);
  cx := tm.tmAveCharWidth * 30;
  cy := (tm.tmHeight + tm.tmExternalLeading) * 2;
  ReleaseDC (hWindow, dc);
  pctst:= PCREATESTRUCT(lPrm);
  hwndButton := CreateWindow(
  'button',
  'Click Here',
  WS_CHILD or WS_VISIBLE or BS_PUSHBUTTON,
  0, 0, cx, cy,
  hWindow,
  HMENU(1),
  pctst^.hInstance,
  nil
  );
  Result:=0;
  Exit;
  end;
  
  WM_DESTROY:
  begin
  PostQuitMessage(0);
  Result:=0;
  Exit;
  end;
  
  WM_PAINT:
  begin
  dc := BeginPaint (hWindow, ps);
  GetClientRect (hWindow, rc);
  
  rc.bottom := Round(rc.bottom / 2);
  DrawText (dc, 'Hello, World!', -1, rc,
  DT_SINGLELINE or DT_CENTER or DT_VCENTER);
  
  EndPaint (hWindow, ps);
  Result:= 0;
  Exit;
  end;
  
  WM_SIZE:
  begin
  if (hwndButton<>0) and (wPrm = SIZEFULLSCREEN) or (wPrm = SIZENORMAL) then
  begin
  rc.left := Round((LOWORD(lPrm) - cx) / 2);
  rc.top := Round(HIWORD(lPrm) * 3 / 4 - cy / 2);
  MoveWindow (hwndButton,rc.left, rc.top, cx, cy, True);
  end;
  Result:= 0;
  Exit;
  end;
  
  WM_COMMAND:
  begin
  if (LOWORD(wPrm) = 1) and (HIWORD(wPrm) = BN_CLICKED) and
  (HWND(lPrm) = hwndButton) then
  begin
  DestroyWindow (hWindow);
  end;
  Result:= 0;
  Exit;
  end;
  
  end;
  
  Result:=DefWindowProc (hWindow, nMsg, wPrm, lPrm);
  
  end;
  
  //winmain
  var
  hWindowMain:HWND;
  MyMsg:MSG;
  wcex:WNDCLASSEX;
  begin
  wcex.cbSize := SizeOf(WNDCLASSEX);
  wcex.style := CS_HREDRAW or CS_VREDRAW;
  wcex.lpfnWndProc := @MainWndProc;
  wcex.cbClsExtra := 0;
  wcex.cbWndExtra := 0;
  wcex.hInstance := MainInstance;
  wcex.hIcon := LoadIcon (0, IDI_APPLICATION);
  wcex.hCursor := LoadCursor (0, IDC_ARROW);
  wcex.hbrBackground := HBRUSH(COLOR_WINDOW+1);
  wcex.lpszClassName := 'WinTestWin';
  wcex.hIconSm := LoadIcon (0, IDI_APPLICATION);
  
  RegisterClassEx (wcex);
  
  hWindowMain := CreateWindow (
  'WinTestWin',
  'Hello',
  WS_OVERLAPPEDWINDOW,
  CW_USEDEFAULT,
  CW_USEDEFAULT,
  CW_USEDEFAULT,
  CW_USEDEFAULT,
  0,
  0,
  MainInstance,
  nil
  );
  
  ShowWindow (hWindowMain, CmdShow);
  UpdateWindow (hWindowMain);
  
  while GetMessage (MyMsg, 0, 0, 0)=True do
  begin
  TranslateMessage (MyMsg);
  DispatchMessage (MyMsg);
  end;
  
  end.
  
  最后发现Delphi生成的代码仅有16.5k,比VC小了一半以上。说明Delphi有一个不错的编译器,加之VCL的可视化功能,应该是一个很好的开发工具。 以我来看,Delphi开发大型系统是一点问题没有的,甚至可能性能将超过VC,只是VCL的高封装层次使得使用VCL的程序通常都大,但开发效率却不是VC可以比的。
【责编:Lili】

中国IT教育热线咨询

相关文章
Delphi初学者应小心的六大陷阱
VC开发多语言界面支持的简单方法
基于Delphi的异常处理技术探究
Delphi中用API实现在MSN的信息提示
VC中利用MFC设计绘图程序初步
Delphi中"包"的妙用
如何用Delphi实现子目录级的文件查询
VC中三种常见中文内码的转换方法
推荐文章
· 用C#创建COM对象
· IT管理十大失误及其对策
· VC中利用MFC设计绘图程序初步
· JAVA中对象创建和初始化过程
· C语言中的位域的使用
· 浅谈Java桌面应用程序开发
· C#的前途如何?
· 几种VC++数据库开发技术的相对比较
 精彩友情推荐
·锐捷交换机报价
·锐捷交换机
·锐捷网络网络交换机
·smc交换机
·smc交换机报价
·IDC资讯大全
·机房品质万里行
·IDC托管必备知识
·全国IDC报价
·网站推广优化
最新更新 推荐文章
·Visual Basic 9.0隐式类型的局部…09-30
·JMX+J2SE5.0实现Web应用的安全管…09-30
·多线程、Socket技术及委托技术的…09-21
·Visual C#多线程参数传递浅析09-21
·浅谈Java中利用JCOM实现仿Excel编…09-21
·基于Java的界面布局DSL的设计与实…09-21
·Java开发中的事件驱动模型实例详…09-21
·并发工程原则应用到软件项目中09-06
·Delphi初学者应小心的六大陷阱09-06
·VC开发多语言界面支持的简单方法09-06
·用C#创建COM对象09-06
·用C#创建COM对象09-06
·IT管理十大失误及其对策08-30
·VC中利用MFC设计绘图程序初步08-23
·JAVA中对象创建和初始化过程08-23
·C语言中的位域的使用08-09
·浅谈Java桌面应用程序开发08-09
·C#的前途如何?08-02
·几种VC++数据库开发技术的相对比较07-12
·用Visual C#实现网络封包监视07-12
·VB.NET中的TextBox控件详解07-12
·VB.NET实现PC与掌上电脑PPC的双向通信07-05
  培训中心