请教一个windows编程最基本的问题:createwindow。(50分)

  • 主题发起人 主题发起人 Theo
  • 开始时间 开始时间
T

Theo

Unregistered / Unconfirmed
GUEST, unregistred user!
我用的是Win2k,Delphi 7,发现用Delphi生成的一个空白窗体的执行文件居然就有360k,
往窗体上随便在加几个东西,生成的可执行文件就上1MB了。难道Delphi生成的代码的效率...???
不敢妄下定论,听听大家的意见。
于是想用API建个窗口,代码如下,有:Runtime erro 出现,无法编译。 
不知错在哪?请指出,谢谢!

program Project1;
uses windows,messages;

var MainWndClass : tagWndClassExA;
hMainWnd : HWND;
hI :HWND;
msg : tagMSG;
Terminated : BOOL;

procedure MainWndProc(hWnd:HWND; cMsg:Cardinal;wParam:Integer;lParam:Integer);
begin
DefWindowProc(hWnd,cMsg,wParam,lParam);
end;

begin
hI:=GetModuleHandle(NIL);
Terminated := False;

MainWndClass.cbSize := SizeOf(tagWndClassExA);
MainWndClass.style := CS_HREDRAW or CS_VREDRAW;
MainWndClass.lpfnWndProc := @MainWndProc;
MainWndClass.cbClsExtra := 0;
MainWndClass.cbWndExtra := 0;
MainWndClass.hInstance := hI;
MainWndClass.hbrBackGround := COLOR_WINDOW;
MainWndClass.lpszMenuName := nil;
MainWndClass.lpszClassName := 'MainWndClass';
MainWndClass.hIcon := LoadIcon(0,IDI_APPLICATION);
MainWndClass.hIconSm := 0;
MainWndClass.hCursor := LoadCursor(0,IDC_ARROW);
RegisterClassEX(MainWndClass);

hMainWnd:=CreateWindow('MainWndClass','Hello',WS_OVERLAPPEDWINDOW,
0, 0,300,400,
0,0,hI,nil);
ShowWindow(hMainWnd,SW_SHOWNORMAL);
UpdateWindow(hMainWnd);

repeat
GetMessage(msg,hMainWnd,0,0);

if msg.message = WM_CLOSE or WM_QUIT or WM_DESTROY then Terminated := true;

TranslateMessage(msg);
DispatchMessage(msg);

until Terminated;

PostQuitMessage(0);

end.

把MainWndClass.lpfnWndProc 设为 @DefWindowProc 就可以运行,可是无法退出程序。
为什么呢?窗体上的关闭按钮返回什么值给msg.message?
问题不难,送上50分。
 
MainWndProc要是Stdcall的才行。DefWindowProc中没有处理关闭消息,所以不能退出程序。
 
据说delphi程序巨大是因为delphi地运行库包含在其中,之所以vc小是因为
m$ windows带了自家vc地运行库
 
谢谢jiangxiancheng 和 tt.t。
加上stdcall程序可以运行了。可是消息循环里还是捕捉不到wm_quit,无法退出程序。
我试过很多种办法了,还是解决不了。怎么办?
能给写一下代码吗?
谢谢!
 
while GetMessage(msg,hMainWnd,0,0) do
begin
TranslateMessage(msg);
DispatchMessage(msg);
end;
大致是在这样的。
 
谢谢Bluebridge.
这我已经试过不行,退出不了。窗口关闭后程序还再while循环,结束不了。
我怀疑getmessage返回的不是0。
 
procedure MainWndProc(hWnd:HWND; cMsg:Cardinal;wParam:Integer;lParam:Integer);
begin
case cMsg of
WM_QUIT:
PostQuitMessage(0);
else
DefWindowProc(hWnd,cMsg,wParam,lParam);
end;
end;
 
program Project1;

uses windows,messages;

var MainWndClass : tagWndClassExA;
hMainWnd : HWND;
hI :HWND;
msg : tagMSG;
Terminated : BOOL;

procedure MainWndProc(hWnd:HWND; cMsg:Cardinal;wParam:Integer;lParam:Integer);stdcall;
begin
case cMsg of
WM_CLOSE:
PostQuitMessage(0);
// WM_QUIT:
// PostQuitMessage(0);
// WM_DESTROY:
// PostQuitMessage(0);
// end;
else
DefWindowProc(hWnd,cMsg,wParam,lParam);
end;
end;

begin
hI:=GetModuleHandle(NIL);
Terminated := False;

MainWndClass.cbSize := SizeOf(tagWndClassExA);
MainWndClass.style := CS_HREDRAW or CS_VREDRAW;
MainWndClass.lpfnWndProc := @MainWndProc;
MainWndClass.cbClsExtra := 0;
MainWndClass.cbWndExtra := 0;
MainWndClass.hInstance := hI;
MainWndClass.hbrBackGround := COLOR_WINDOW;
MainWndClass.lpszMenuName := nil;
MainWndClass.lpszClassName := 'MainWndClass';
MainWndClass.hIcon := LoadIcon(0,IDI_APPLICATION);
MainWndClass.hIconSm := 0;
MainWndClass.hCursor := LoadCursor(0,IDC_ARROW);
RegisterClassEX(MainWndClass);

hMainWnd:=CreateWindow('MainWndClass','Hello',WS_OVERLAPPEDWINDOW,
0, 0,300,400,
0,0,hI,nil);
ShowWindow(hMainWnd,SW_SHOWNORMAL);
UpdateWindow(hMainWnd);



while GetMessage(msg,hMainWnd,0,0) do begin
TranslateMessage(msg);
DispatchMessage(msg);
end;
end.

因为你没有处理 WM_CLOSE 消息。
 
后退
顶部