其他语言

位置:IT落伍者 >> 其他语言 >> 浏览文章

比较VC和Delphi的WinTest工程


发布日期:2023年10月30日
 
比较VC和Delphi的WinTest工程
#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 = tmtmAveCharWidth * ;

cy = (tmtmHeight + tmtmExternalLeading) * ;

ReleaseDC (hWindow dc);

hwndButton = CreateWindow (

button

Click Here

WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON

cx cy

hWindow

(HMENU)

((LPCREATESTRUCT) lPrm)>hInstance

NULL

);

return ;

break;

}

case WM_DESTROY:

{

PostQuitMessage ();

return ;

break;

}

case WM_PAINT:

{

dc = BeginPaint (hWindow &ps);

GetClientRect (hWindow &rc);

rcbottom = rcbottom / ;

DrawText (dc Hello World! &rc

DT_SINGLELINE | DT_CENTER | DT_VCENTER);

EndPaint (hWindow &ps);

return ;

break;

}

case WM_SIZE:

{

if (hwndButton && (wPrm == SIZEFULLSCREEN ||wPrm == SIZENORMAL))

{

rcleft = (LOWORD(lPrm) cx) / ;

rctop = HIWORD(lPrm) * / cy / ;

MoveWindow (hwndButtonrcleft rctop cx cy TRUE);

}

return ;

break;

}

case WM_COMMAND:

{

if (LOWORD(wPrm) == && HIWORD(wPrm) == BN_CLICKED &&

(HWND) lPrm == hwndButton)

{

DestroyWindow (hWindow);

}

return ;

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;

wcexcbSize = sizeof(WNDCLASSEX);

wcexstyle = CS_HREDRAW | CS_VREDRAW;

wcexlpfnWndProc = (WNDPROC)MainWndProc;

wcexcbClsExtra= ;

wcexcbWndExtra= ;

wcexhInstance= hInst;

wcexhIcon = LoadIcon (NULL IDI_APPLICATION);

wcexhCursor= LoadCursor (NULL IDC_ARROW);

wcexhbrBackground = (HBRUSH)(COLOR_WINDOW+);

wcexlpszClassName = WinTestWin;

wcexhIconSm= LoadIcon (NULL IDI_APPLICATION);

RegisterClassEx (&wcex);

hWindowMain = CreateWindow (

WinTestWin

Hello

WS_OVERLAPPEDWINDOW

CW_USEDEFAULT

CW_USEDEFAULT

CW_USEDEFAULT

CW_USEDEFAULT

hInst

NULL

);

ShowWindow (hWindowMain nShow);

UpdateWindow (hWindowMain);

while (GetMessage (&MyMsg ))

{

TranslateMessage (&MyMsg);

DispatchMessage (&MyMsg);

}

return MyMsgwParam;

}

其中选择Release方式编译打开VC的最小代码优化编译生成的执行码为KB

然后将其翻译成Delphi代码如下

program WinTest;

uses

WindowsMessages;

var

hwndButton:HWND;

cxcy: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 := tmtmAveCharWidth * ;

cy := (tmtmHeight + tmtmExternalLeading) * ;

ReleaseDC (hWindow dc);

pctst:= PCREATESTRUCT(lPrm);

hwndButton := CreateWindow(

button

Click Here

WS_CHILD or WS_VISIBLE or BS_PUSHBUTTON

cx cy

hWindow

HMENU()

pctst^hInstance

nil

);

Result:=;

Exit;

end;

WM_DESTROY:

begin

PostQuitMessage();

Result:=;

Exit;

end;

WM_PAINT:

begin

dc := BeginPaint (hWindow ps);

GetClientRect (hWindow rc);

rcbottom := Round(rcbottom / );

DrawText (dc Hello World! rc

DT_SINGLELINE or DT_CENTER or DT_VCENTER);

EndPaint (hWindow ps);

Result:= ;

Exit;

end;

WM_SIZE:

begin

if (hwndButton<>) and (wPrm = SIZEFULLSCREEN)or (wPrm = SIZENORMAL) then

begin

rcleft := Round((LOWORD(lPrm) cx) / );

rctop := Round(HIWORD(lPrm) * / cy / );

MoveWindow (hwndButtonrcleft rctop cx cy True);

end;

Result:= ;

Exit;

end;

WM_COMMAND:

begin

if (LOWORD(wPrm) = ) and (HIWORD(wPrm) = BN_CLICKED) and

(HWND(lPrm) = hwndButton) then

begin

DestroyWindow (hWindow);

end;

Result:= ;

Exit;

end;

end;

Result:=DefWindowProc (hWindow nMsg wPrm lPrm);

end;

//winmain

var

hWindowMain:HWND;

MyMsg:MSG;

wcex:WNDCLASSEX;

begin

wcexcbSize := SizeOf(WNDCLASSEX);

wcexstyle := CS_HREDRAW or CS_VREDRAW;

wcexlpfnWndProc := @MainWndProc;

wcexcbClsExtra := ;

wcexcbWndExtra := ;

wcexhInstance := MainInstance;

wcexhIcon := LoadIcon ( IDI_APPLICATION);

wcexhCursor := LoadCursor ( IDC_ARROW);

wcexhbrBackground := HBRUSH(COLOR_WINDOW+);

wcexlpszClassName := WinTestWin;

wcexhIconSm := LoadIcon ( IDI_APPLICATION);

RegisterClassEx (wcex);

hWindowMain := CreateWindow (

WinTestWin

Hello

WS_OVERLAPPEDWINDOW

CW_USEDEFAULT

CW_USEDEFAULT

CW_USEDEFAULT

CW_USEDEFAULT

MainInstance

nil

);

ShowWindow (hWindowMain CmdShow);

UpdateWindow (hWindowMain);

while GetMessage (MyMsg )=True do

begin

TranslateMessage (MyMsg);

DispatchMessage (MyMsg);

end;

end

最后发现Delphi生成的代码仅有k比VC小了一半以上说明Delphi有一个不错的编译器加之VCL的可视化功能应该是一个很好的开发工具 以我来看Delphi开发大型系统是一点问题没有的甚至可能性能将超过VC只是VCL的高封装层次使得使用VCL的程序通常都大但开发效率却不是VC可以比的

上一篇:Delphi中关于动态代理应用技巧

下一篇:利用Delphi轻松编制压缩助理程序