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可以比的