Window程序设计——自已的窗口
时间:2011-03-03 来源:ManLoveGirls
program HardCore;
uses
Windows,Messages;
{窗口过程}
function WindowProc(TheWindow: HWnd; TheMessage,WParam,LParam: Longint):Longint;stdcall;export;
begin
case TheMessage of
{收到 WM_DESTROY消息后,退出程序}
WM_DESTROY:begin
PostQuitMessage(0);
Result := 0;
end;
end;
{对于所有未处理的过程调用默认的窗口过程}
Result := DefWindowProc(TheWindow,TheMessage,WParam,LParam);
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_APPLICATION);{载入标志}
WindowClass.hCursor :=LoadCursor(0,IDC_UPARROW); {光标}
WindowClass.hbrBackground:=COLOR_WINDOW;{颜色}
WindowClass.lpszMenuName:=Nil; {菜单}
WindowClass.lpszClassName:='Testclass';{注册类名}
{开始注册窗口}
Result := Windows.RegisterClass(WindowClass) <> 0;
end;
var
TheMessage: TMsg;
OurWindow: HWND;
begin
//注册新窗口类
if not RegisterClass then
begin
MessageBox(0,'RegisterClass failed',nil,MB_OK);
Exit;
end;
//在新窗口类的基础上建立窗口
OurWindow := CreateWindowEx(0, //没有扩展风格
'TestClass', //窗体类名
'HardCore Window',//标题栏
WS_OVERLAPPEDWINDOW or WS_VISIBLE, //窗口风格
CW_USEDEFAULT, //left
CW_USEDEFAULT, //top
CW_USEDEFAULT, //w
CW_USEDEFAULT, //h
0, //父窗口句柄
0, //菜单栏
hInstance, //程序实例
nil //没有附加信息
);
//如果窗口没有建立成功,则退出程序
if OurWindow=0 then
begin
MessageBox(0,'CreateWindow Failed',Nil,MB_OK);
exit;
end;
{标准消息循环}
while GetMessage(TheMessage,0,0,0) do
begin
TranslateMessage(TheMessage);
DispatchMessage(TheMessage);
end;
end.
创建一个窗口必须有
窗口处理过程(接收消息类型,处理消息)
function WinProc(hwnd:Hwnd;Msg:TMsg;WParam:WPARAM;lParam:LParam):LResult;stdcall;
窗口类注册(设置类的各种属性)
TwndClass 类是一个结构
在Delphi中我们可以看到
TWndClass = TWndClassA;
TWndClassA=tagWndClassA
tagWNDCLASSA = packed record
style: UINT;
lpfnWndProc: TFNWndProc;
cbClsExtra: Integer;
cbWndExtra: Integer;
hInstance: HINST;
hIcon: HICON;
hCursor: HCURSOR;
hbrBackground: HBRUSH;
lpszMenuName: PAnsiChar;
lpszClassName: PAnsiChar;
这样我们就可以很好的声明了
var
WindowClass:TWndClass;
注册类之后又要在系统中注册
调用
RegisterClass()函数 成功返回true 失败返回false
创建窗口
function CreateWindowEx(dwExStyle: DWORD; lpClassName: PChar;
lpWindowName: PChar; dwStyle: DWORD; X, Y, nWidth, nHeight: Integer;
hWndParent: HWND; hMenu: HMENU; hInstance: HINST; lpParam: Pointer): HWND;
返回窗口句柄
调用标准循环函数获取消息
BOOL GetMessage(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax
参数:
lpMsg:指向MSG结构的指针,该结构从线程的消息队列里接收消息信息。
hWnd:取得其消息的窗口的句柄。这是一个有特殊含义的值(NULL)。GetMessage为任何属于调用线程的窗口检索消息,线程消息通过PostThreadMessage寄送给调用线程。
wMsgFilterMin:指定被检索的最小消息值的整数。
wMsgFilterMax:指定被检索的最大消息值的整数。
相关阅读 更多 +