大家帮我看看这段代码,哪儿错了

hamzsy 2002-11-19 06:50:49
运行后显示'CreateWindow failed',请帮忙看看原因。

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

TMyData=record
lpszInfo:PChar;
dwNumber:DWORD;
end;

PMyData=^TMyData;

var
Form1: TForm1;

implementation

{$R *.dfm}

function WindowProc(TheWindow:HWnd;TheMessage,WParam,
LParam:Longint):Longint;stdcall;
var
lpszInfoString:PChar;
dwInfoNumber:DWORD;
begin
case TheMessage of
WM_CREATE:
begin
lpszInfoString:=PMyData(PCreateStruct(LParam).lpCreateParams).lpszInfo;
dwInfoNumber:=PMyData(PCreateStruct(LParam).lpCreateParams).dwNumber;
ShowMessage(Format('String:%s'+Chr(13)+'Number:%d',
[lpszInfoString,dwInfoNumber]));
end;
WM_DESTROY:
begin
PostQuitMessage(0);
Exit;
end;
end;
end;

function RegisterClass:Boolean;
var
WindowClass:TWndClass;
begin
WindowClass.style:=CS_HREDRAW or CS_VREDRAW;
WindowClass.lpfnWndProc:=@WindowProc;
WindowClass.cbClsExtra:=0;
WindowClass.cbWndExtra:=0;
WindowClass.hInstance:=hInstance;
WindowClass.hIcon:=LoadIcon(0,IDI_WINLOGO);
WindowClass.hCursor:=LoadCursor(0,IDC_APPSTARTING);
WindowClass.hbrBackground:=COLOR_WINDOW;
WindowClass.lpszClassName:='TestClass';
Result:=Windows.RegisterClass(WindowClass)<>0;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
hWindow:HWND;
ExtraCreationData:TMyData;
begin
if not RegisterClass then
begin
ShowMessage('RegisterClass failed');
Exit;
end;

ExtraCreationData.lpszInfo:='ExtraCreationData information string';
ExtraCreationData.dwNumber:=12345;

hWindow:=CreateWindow('TestClass',
'API Window',
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
Form1.Handle,
0,
hInstance,
@ExtraCreationData
);
if hWindow<>0 then
begin
ShowWindow(hWindow,SW_SHOWNORMAL);
UpdateWindow(hWindow);
end
else
begin
ShowMessage('CreateWindow failed');
Exit;
end;
end;

end.
...全文
18 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
hamzsy 2002-11-23
  • 打赏
  • 举报
回复
第一次认真搞了一下API,问题已一一解决了,多谢各位帮忙,少走了许多弯路。
hamzsy 2002-11-23
  • 打赏
  • 举报
回复
楼上的应该是
begin
ShowWindow(hWindow,SW_SHOWNORMAL);
UpdateWindow(hWindow);
while GetMessage(uMsg, 0, 0, 0) do
begin
TranslateMessage(uMsg);
DispatchMessage(uMsg);
end;
end
hamzsy 2002-11-23
  • 打赏
  • 举报
回复
这段代码是CORE API上的,没想到代码这么多缺陷
试试先
xzgyb 2002-11-23
  • 打赏
  • 举报
回复
加一消息循环
声明
uMsg: TMsg;

if hWindow<>0 then
begin
ShowWindow(hWindow,SW_SHOWNORMAL);
UpdateWindow(hWindow);
while not GetMessage(uMsg, 0, 0, 0) do
begin
TranslateMessage(uMsg);
DispatchMessage(uMsg);
end;
end
hamzsy 2002-11-22
  • 打赏
  • 举报
回复
感谢halfdream(哈欠),上面的代码已调试通过
但下面的代码运行后窗体只是闪了一下,如何修改才能保持住?

program Project1;

uses
Windows,
Messages,
SysUtils,
Variants,
Classes,
Dialogs;

{$R *.res}
type
TMyData=record
lpszInfo:PChar;
dwNumber:DWORD;
end;

PMyData=^TMyData;

function WindowProc(TheWindow:HWnd;TheMessage,WParam,
LParam:Longint):Longint;stdcall;
var
lpszInfoString:PChar;
dwInfoNumber:DWORD;
begin
case TheMessage of
WM_CREATE:
begin
lpszInfoString:=PMyData(PCreateStruct(LParam).lpCreateParams).lpszInfo;
dwInfoNumber:=PMyData(PCreateStruct(LParam).lpCreateParams).dwNumber;
// ShowMessage(Format('String:%s'+Chr(13)+'Number:%d',
// [lpszInfoString,dwInfoNumber]));
end;
WM_DESTROY:
begin
PostQuitMessage(0);
Exit;
end
else Result:=DefWindowProc(theWindow,theMessage,WParam,LParam);
end;
end;

function RegisterClass:Boolean;
var
WindowClass:TWndClass;
begin
WindowClass.style:=CS_HREDRAW or CS_VREDRAW;
WindowClass.lpfnWndProc:=@WindowProc;
WindowClass.cbClsExtra:=0;
WindowClass.cbWndExtra:=0;
WindowClass.hInstance:=hInstance;
WindowClass.hIcon:=LoadIcon(0,IDI_WINLOGO);
WindowClass.hCursor:=LoadCursor(0,IDC_APPSTARTING);
//WindowClass.hCursor:=LoadCursor(0,IDC_ARROW);
WindowClass.hbrBackground:=COLOR_WINDOW;
WindowClass.lpszClassName:='TestClass';
Result:=Windows.RegisterClass(WindowClass)<>0;
end;

var
hWindow:HWND;
ExtraCreationData:TMyData;
begin
if not RegisterClass then
begin
ShowMessage('RegisterClass failed');
Exit;
end;

ExtraCreationData.lpszInfo:='ExtraCreationData information string';
ExtraCreationData.dwNumber:=12345;

hWindow:=CreateWindow('TestClass',
'API Window',
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
0,
0,
hInstance,
@ExtraCreationData
);
if hWindow<>0 then
begin
ShowWindow(hWindow,SW_SHOWNORMAL);
UpdateWindow(hWindow);
end
else
begin
ShowMessage('CreateWindow failed');
Exit;
end;

end.
hamzsy 2002-11-22
  • 打赏
  • 举报
回复
再看看
halfdream 2002-11-22
  • 打赏
  • 举报
回复
是你的WindowProc函数写的问题。

你在其中应该加上一个缺省处理,
case theMessage of
....
else Result:=DefWindowProc(theWindow,theMessage,WParam,LParam);
end;
hamzsy 2002-11-21
  • 打赏
  • 举报
回复
这也会有冲突?
dext 2002-11-20
  • 打赏
  • 举报
回复
如果你把这段代码修改一下放在一个单独的工程文件中(只有一个工程文件)
应该可以运行。
我认为问题就出在,你又用了VCL,又用了API.
hamzsy 2002-11-20
  • 打赏
  • 举报
回复
还不行啊,各位
hamzsy 2002-11-20
  • 打赏
  • 举报
回复
试试先
netxeyes 2002-11-20
  • 打赏
  • 举报
回复
var
windowclass : WNDCLASS;
Wnyu 2002-11-20
  • 打赏
  • 举报
回复
var
WindowClass:TWndClass;
begin
FillChar(WindowClass,sizeof(TWndClass),0); // Add this!
WindowClass.style:=CS_HREDRAW or CS_VREDRAW;
.....
......

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧