王朝网络
分享
 
 
 

比较VC和Delphi的WinTest工程

王朝delphi·作者佚名  2006-01-09
宽屏版  字体: |||超大  

看过几篇关于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;

}

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有