VC와 Delphi를 비교하는 것에 관한 몇 가지 기사를 읽었으며, Code를 작성하여 Wintest라는 새로운 프로젝트를 작성했습니다. 코드는 다음과 같습니다.
#include <windows.h>
hwnd hwndbutton;
int cx, cy;
lresult 콜백 Mainwndproc (Hwnd Hwindow, UINT NMSG, WPARAM WPRM, LPARAM LPRM)
{
HDC DC;
페인트 스트럽 PS;
rect rc;
스위치 (NMSG)
{
사례 WM_CREATE :
{
Textmetric TM;
dc = getdc (hwindow);
selectObject (dc, getStockoBject (System_Fixed_Font));
getTextMetrics (dc, & tm);
cx = tm.tmevecharwidth * 30;
cy = (tm.tmheight + tm.tmexternalleading) * 2;
릴리스 C (Hwindow, DC);
hwndbutton = CreateWindow (
"단추",
"여기를 클릭하십시오",
WS_CHILD | WS_VISIBE |
0, 0, cx, cy,
hwindow,
(hmenu) 1,
((lpcreatestruct) lprm)-> Hinstance,
널
);
반환 0;
부서지다;
}
사례 WM_DESTROY :
{
PostQuitMessage (0);
반환 0;
부서지다;
}
CASE WM_PAINT :
{
dc = beginpaint (hwindow, & ps);
getClientRect (HWINDOW, & RC);
rc.bottom = rc.bottom / 2;
DrawText (DC, "Hello, World!", -1, & rc,
DT_SINGLELINE | DT_VCENTER.
EndPaint (Hwindow, & PS);
반환 0;
부서지다;
}
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);
}
반환 0;
부서지다;
}
사례 WM_COMMAND :
{
if (loword (wprm) == 1 && hiword (wprm) == bn_clicked &&
(hwnd) lprm == hwndbutton)
{
Destroywindow (Hwindow);
}
반환 0;
부서지다;
}
}
반환 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 |
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.hbrackground = (hbrush) (color_window+1);
wcex.lpszclassname = "wintestwin";
wcex.hiconsm = loadicon (null, idi_application);
RegisterClassex (& wcex);
hwindowmain = CreateWindow (
"Wintestwin",
"안녕하세요",
ws_overlappedwindow,
cw_usedefault,
cw_usedefault,
cw_usedefault,
cw_usedefault,
0,
0,
Hinst,
널
);
Showwindow (Hwindowmain, nshow);
UpdateWindow (hwindowmain);
while (getMessage (& mymsg, 0, 0, 0))
{
TransleMessage (& mymsg);
DispatchMessage (& MyMSG);
}
mymsg.wparam을 반환합니다.
}
컴파일하려는 릴리스를 선택하고 VC6의 최소 코드 최적화를 켜고 컴파일에서 생성 된 실행 코드는 36.0KB입니다.
그런 다음 다음과 같이 델파이 코드로 변환하십시오.
프로그램 Wintest;
용도
창, 메시지;
var
hwndbutton : hwnd;
CX, CY : 정수;
함수 mainwndproc (hwindow : hwnd; nmsg : uint; wprm : wparam; lprm : lparam) : lresult; stdcall;
var
DC : HDC;
추신 : 페인트 스트럭;
RC : Trect;
TM : TextMetric;
PCTST : pcreatestruct;
시작하다
사례 nmsg
WM_CREATE :
시작하다
DC : = getdc (Hwindow);
selectObject (dc, getStockoBject (System_Fixed_Font));
getTextMetrics (DC, TM);
cx : = tm.tmevecharwidth * 30;
cy : = (tm.tmheight + tm.tmexternalleading) * 2;
릴리스 C (Hwindow, DC);
pctst : = pcreatestruct (lprm);
hwndbutton : = CreateWindow (
'단추',
'여기를 클릭하십시오',
ws_child 또는 ws_visible 또는 bs_pushbutton,
0, 0, cx, cy,
hwindow,
hmenu (1),
pctst^.Hinstance,
무
);
결과 : = 0;
출구;
끝;
WM_DESTROY :
시작하다
PostQuitMessage (0);
결과 : = 0;
출구;
끝;
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);
결과 : = 0;
출구;
끝;
WM_SIZE :
시작하다
if (hwndbutton <> 0) 및 (wprm = sizefullscreen) 또는 (wprm = sizenormal)
시작하다
rc.left : = 라운드 ((Loword (lprm) -CX) / 2);
rc.top : = Round (hiword (lprm) * 3 / 4- cy / 2);
MoveWindow (hwndbutton, rc.left, rc.top, cx, cy, true);
끝;
결과 : = 0;
출구;
끝;
WM_COMMAND :
시작하다
if (loword (wprm) = 1) 및 (hiword (wprm) = bn_clicked) 및
(hwnd (lprm) = hwndbutton)
시작하다
Destroywindow (Hwindow);
끝;
결과 : = 0;
출구;
끝;
끝;
결과 : = defwindowproc (Hwindow, nmsg, wprm, lprm);
끝;
// Winmain
var
hwindowmain : hwnd;
MyMSG : MSG;
wcex : wndclassex;
시작하다
wcex.cbsize : = sizeof (wndclassex);
wcex.style : = CS_HREDRAW 또는 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.hbrackground : = hbrush (color_window+1);
wcex.lpszclassname : = 'wintestwin';
wcex.hiconsm : = loadicon (0, idi_application);
RegisterClassex (WCEX);
Hwindowmain : = CreateWindow (
'Wintestwin',
'안녕하세요',
ws_overlappedwindow,
cw_usedefault,
cw_usedefault,
cw_usedefault,
cw_usedefault,
0,
0,
메인 스탠스,
무
);
Showwindow (Hwindowmain, Cmdshow);
UpdateWindow (hwindowmain);
getMessage (mymsg, 0, 0, 0) = true do
시작하다
TranslateMessage (MyMSG);
DispatchMessage (MyMSG);
끝;
끝.
마지막으로, 델파이에 의해 생성 된 코드는 16.5k에 불과한 것으로 밝혀졌으며, 이는 VC보다 절반 이상 작다. 이는 Delphi가 좋은 컴파일러를 가지고 있으며 VCL 시각화 기능은 우수한 개발 도구 여야합니다. 제 생각에 Delphi는 대형 시스템을 개발하는 데 아무런 문제가 없으며 VC의 높은 포장 수준은 VCL을 일반적으로 크게 만드는 것입니다. . Delphi는 또한 VCL을 사용하여 프로그램을 작성할 수 없습니다.