比较VC和Delphi的WinTest工程

Kelly1983Y

Kelly1983Y

2016-02-19 18:26

今天天气好晴朗处处好风光,好天气好开始,图老师又来和大家分享啦。下面给大家推荐比较VC和Delphi的WinTest工程,希望大家看完后也有个好心情,快快行动吧!
 

  看过几篇关于VC和Delphi比较的文章,自己也有心写写代码试试,我在VC6下新建了一个工程,叫WinTest。代码如下:
  
  #include windows.h

  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;
    }

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

    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;
  }

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  
  其中选择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 (hwndButton0) 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可以比的。 Delphi也同样可以不使用VCL写程序,像网上有人将Quake2的源码翻译成了Delphi的,效果与C写的相差无几。


展开更多 50%)
分享

猜你喜欢

比较VC和Delphi的WinTest工程

编程语言 网络编程
比较VC和Delphi的WinTest工程

清理VC工程

编程语言 网络编程
清理VC工程

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

VC和Delphi程序只运行一个实例的方法

编程语言 网络编程
VC和Delphi程序只运行一个实例的方法

使用回调函数(VC & Delphi)

编程语言 网络编程
使用回调函数(VC & Delphi)

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

VC中多文件工程的PCLint使用详解

编程语言 网络编程
VC中多文件工程的PCLint使用详解

Delphi多层开发方案比较

编程语言 网络编程
Delphi多层开发方案比较

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

Win7媒体播放器刻张CD

Win7媒体播放器刻张CD

把最小化图标放到任务栏右下角

把最小化图标放到任务栏右下角
下拉加载更多内容 ↓