有关创建FORM的API函数
谁能提供一个在DELPHI中用CreateWindow或CreateWindowEx创建FORM的实例,我要的是实例,有实例才给分! 问题点数:40、回复次数:8Top
1 楼dext(德克斯特)回复于 2002-04-10 13:32:01 得分 0
何谓实例?Top
2 楼weizhi(行者)回复于 2002-04-10 13:33:09 得分 0
呵呵,Delphi中没有必要自己用CreateWindow或CreateWindowEx创建FORM呀,如果你要窗体,就用TForm,如果你不要窗体,只要窗口句柄,就用AllocHWnd()函数呀, 想你可能是要后者,可以看看Delphi的TTimer控件的源码,关键部分如下:
constructor TTimer.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FEnabled := True;
FInterval := 1000;
FWindowHandle := AllocateHWnd(WndProc); //分配了一个窗口句柄
end;
destructor TTimer.Destroy;
begin
FEnabled := False;
UpdateTimer;
DeallocateHWnd(FWindowHandle); //释放窗口句柄
inherited Destroy;
end;
procedure TTimer.WndProc(var Msg: TMessage); //前面分配的窗口的窗口过程
begin
with Msg do
if Msg = WM_TIMER then
try
Timer;
except
Application.HandleException(Self);
end
else
Result := DefWindowProc(FWindowHandle, Msg, wParam, lParam);
end;
呵呵,不知你是这是要这个,一般有句柄就可以处理消息了,而它正好又没有实际的窗口界面!
如果你是要有界面的,直接建TForm的实例就行了!Top
3 楼weizhi(行者)回复于 2002-04-10 13:38:36 得分 0
呵呵,要不你看看Delphi源码的,部分代码如下,其它的你自己找吧!
procedure TWinControl.CreateWindowHandle(const Params: TCreateParams);
begin
with Params do
FHandle := CreateWindowEx(ExStyle, WinClassName, Caption, Style,
X, Y, Width, Height, WndParent, 0, WindowClass.hInstance, Param);
end;
Top
4 楼Liusp(夜深千帐灯)回复于 2002-04-10 13:39:14 得分 0
weizhi, 谢谢你的回复,但我要的是API创建窗体的例子!Top
5 楼weizhi(行者)回复于 2002-04-10 13:39:36 得分 10
呵呵,这个函数应该一定是你要的了:
function AllocateHWnd(Method: TWndMethod): HWND;
var
TempClass: TWndClass;
ClassRegistered: Boolean;
begin
UtilWindowClass.hInstance := HInstance;
ClassRegistered := GetClassInfo(HInstance, UtilWindowClass.lpszClassName,
TempClass);
if not ClassRegistered or (TempClass.lpfnWndProc <> @DefWindowProc) then
begin
if ClassRegistered then
Windows.UnregisterClass(UtilWindowClass.lpszClassName, HInstance);
Windows.RegisterClass(UtilWindowClass);
end;
Result := CreateWindowEx(WS_EX_TOOLWINDOW, UtilWindowClass.lpszClassName,
'', WS_POPUP {!0}, 0, 0, 0, 0, 0, 0, HInstance, nil);
if Assigned(Method) then
SetWindowLong(Result, GWL_WNDPROC, Longint(MakeObjectInstance(Method)));
end;
Top
6 楼inbud(清风侠)回复于 2002-04-10 13:43:23 得分 30
复制下面的代码,编译然后就可以运行了!
program SMALLexe;
uses
Windows, Messages;
var
msg: Tmsg;
WinClass: TWndClassA;
hInst, hWindow, hButton, hStatic, hEdit, hFont: integer;
procedure CheckPassword;
var
Text: PChar;
TextLength: Integer;
begin
TextLength:=GetWindowTextLength(hEdit);
if TextLength=8 then
begin
GetMem(Text, TextLength+1);
GetWindowText(hEdit, Text, TextLength+1);
if Text='Daubster' then MessageBox(hWindow,
'您输入的密码是正确的...'#9,
'密码验证',
MB_OK+MB_ICONINFORMATION);
freeMem(Text);
end
else
MessageBox(hWindow, '您输入的密码不是正确的...', '密码验证', MB_OK+MB_ICONSTOP);
SetFocus(hEdit);
end;
function WindowProc(hWnd:HWND; uMsg:UINT;
wParam:WPARAM; lParam:LPARAM):LRESULT; stdcaLL;
begin
result:=DefWindowProc(hWnd, uMsg, wParam, lParam);
if uMsg=WM_DESTROY then Halt;
if (lParam=hButton) and (uMsg=WM_COMMAND) then CheckPassword;
end;
begin
hInst:= hInstance;
with WinClass do
begin
style:= CS_CLASSDC or CS_PARENTDC;
lpfnWndProc:= @WindowProc;
hInstance:= hInst;
hbrBackground:= COLOR_BTNFACE+1;
lpszClassname:= 'DAUBSTER_SMALL_EXEFILE';
hCursor:= LoadCursor(0, IDC_ARROW);
end;
RegisterClass(WinClass);
hWindow:=CreateWindowEx(WS_EX_WINDOWEDGE,
'DAUBSTER_SMALL_EXEFILE',
'小应用程序',
WS_VISIBLE or WS_SIZEBOX or WS_CAPTION or WS_SYSMENU,
200, 278, 305, 95, 0, 0, hInst, niL);
hButton:=CreateWindow( 'Button',
'确定',
WS_VISIBLE or WS_CHILD or BS_PUSHLIKE or BS_TEXT,
215, 21, 65, 22, hWindow, 0, hInst, niL);
hStatic:=Createwindow( 'Static',
'',
WS_VISIBLE or WS_CHILD or SS_LEFT,
16, 24, 75, 16, hWindow, 0, hInst, niL);
hEdit:=CreateWindowEx( WS_EX_CLIENTEDGE,
'Edit',
'',
WS_CHILD or WS_VISIBLE or WS_BORDER or ES_PASSWORD,
85, 20, 121, 24, hWindow, 0, hInst, niL);
hFont:=CreateFont( -11, 0, 0, 0, 400, 0, 0, 0,
DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH or FF_DONTCARE, 'Times New Roman');
if hFont <> 0 then
begin
SendMessage(hEdit, WM_SETFONT, hFont, 0);
SendMessage(hStatic, WM_SETFONT, hFont, 0);
SendMessage(hButton, WM_SETFONT, hFont, 0);
end;
SetWindowText(hStatic, '请输入密码:');
SetFocus(hEdit);
UpdateWindow(hWindow);
while(GetMessage(msg, hWindow, 0, 0)) do
begin
TranslateMessage(msg);
DispatchMessage(msg);
end;
end.
Top
7 楼weizhi(行者)回复于 2002-04-10 13:50:02 得分 0
呵呵,楼上程序的作者一定是SDK高手!! 在下佩服!!Top
8 楼Liusp(夜深千帐灯)回复于 2002-04-10 13:54:42 得分 0
不错我要的就是清风侠的实例,希望以后能向清风侠多多讨教,顺便问一句,清风侠与清风围棋网站是否有关?Top




