CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  Windows SDK/API

有关创建FORM的API函数

楼主Liusp(夜深千帐灯)2002-04-10 13:19:35 在 Delphi / Windows SDK/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

相关问题

  • 怎样用API函数创建菜单和子菜单?附API函数说明
  • ???如何在vb下用api函数创建一个窗体???
  • 等待!创建DESKTOP SHORTCUT的API函数是哪个
  • 用api函数怎么创建一个窗体啊
  • Form自动创建的那个函数是干什么的?
  • api函数
  • 求API函数?
  • API函数
  • API函数
  • API 函数!

关键词

  • 函数
  • 密码
  • ws
  • utilwindowclass
  • hedit
  • hwindow
  • classregistered
  • 句柄
  • textlength
  • daubster

得分解答快速导航

  • 帖主:Liusp
  • weizhi
  • inbud

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo