📄 clmain.pas
字号:
unit clMain;
//mir2 gui:今天才发现mir2的源码结构实在太糟糕,类的封装太烦琐,但是为了研究学习,本工程还是保留了源程序中的
//封装逻辑:即 clmain->IntroScn->Drawscrn
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DWinCtl, WIL, ExtCtrls, DXDraws, DXClass, IntroScn,Drawscrn,
StdCtrls;
const
SCREENWIDTH=800;
SCREENHEIGHT=600;
type
TFrmMain = class(TDxForm)
DXDraw1: TDXDraw;
DWinMan: TDWinManager;
WProgUse: TWMImages;
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure FormKeyPress(Sender: TObject; var Key: Char);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormDestroy(Sender: TObject);
//下面这二个实际上是自定义的,但放在了窗体文件中相当于内定的函数
procedure DXDraw1Initialize(Sender: TObject);
procedure DXDraw1Finalize(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
topleft:string;
{ Public declarations }
procedure AppOnIdle (Sender: TObject; var Done: Boolean);
end;
var
ToolMenuHook: HHOOK;
LastHookKey: integer;
LastHookKeyTime: longword;
FrmMain: TFrmMain;
DScreen: TDrawScreen;
IntroScene: TIntroScene;
LoginScene: TLoginScene;
implementation
uses FState;
{$R *.dfm}
function KeyboardHookProc (Code: Integer; WParam: Longint; var Msg: TMsg): Longint; stdcall;
begin
if ((WParam = 9){ or (WParam = 13)}) and (LastHookKey = 18) and (GetTickCount - LastHookKeyTime < 500) then begin
if FrmMain.WindowState <> wsMinimized then begin
FrmMain.WindowState := wsMinimized;
end else
Result := CallNextHookEx(ToolMenuHook, Code, WParam, Longint(@Msg));
exit;
end;
LastHookKey := WParam;
LastHookKeyTime := GetTickCount;
Result := CallNextHookEx(ToolMenuHook, Code, WParam, Longint(@Msg));
end;
procedure TFrmMain.FormCreate(Sender: TObject);
begin
Timer1.Enabled:=false;
MainWinHandle := DxDraw1.Handle;
Application.OnIdle := AppOnIdle;
ToolMenuHook := SetWindowsHookEx(WH_KEYBOARD, @KeyboardHookProc, 0, GetCurrentThreadID);
DScreen := TDrawScreen.Create;
IntroScene := TIntroScene.Create;
//知道为什么这个程序只有登录窗口而没有门吗,,开门其实是introscene的作用,,
//introscn单元里定义的只是一个虚基类的introscene,,因此没有任何的作为
LoginScene := TLoginScene.Create;
end;
procedure TFrmMain.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
{如果按了Esc,则退出}
if Key=VK_ESCAPE then
Timer1.Enabled:=true;
{全屏模式和窗口模式的切换}
if (ssAlt in Shift) and (Key=VK_RETURN) then
begin
DXDraw1.Finalize;
if doFullScreen in DXDraw1.Options then
begin
RestoreWindow;
BorderStyle := bsSizeable;
DXDraw1.Options := DXDraw1.Options - [doFullScreen];
end else
begin
StoreWindow;
DXDraw1.Cursor := crNone;
BorderStyle := bsNone;
DXDraw1.Options := DXDraw1.Options + [doFullScreen];
end;
DXDraw1.Initialize;
end;
end;
procedure TFrmMain.FormKeyPress(Sender: TObject; var Key: Char);
begin
//sdf
end;
procedure TFrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
//action 可以删除以减化逻辑?
begin
//oii
end;
procedure TFrmMain.FormDestroy(Sender: TObject);
begin
if ToolMenuHook <> 0 then UnhookWindowsHookEx(ToolMenuHook);
WProgUse.Finalize;
IntroScene.Free;
LoginScene.Free;
DScreen.Finalize;
DScreen.Free;
end;
procedure TFrmMain.DXDraw1Initialize(Sender: TObject);
begin
DxDraw1.SurfaceWidth := 800;
DxDraw1.SurfaceHeight := 600;
WProgUse.DDraw := DxDraw1.DDraw; //属性窗口中可设置
WProgUse.Initialize;
DXDraw1.DefColorTable := WProgUse.MainPalette;
DXDraw1.ColorTable := DXDraw1.DefColorTable;
DXDraw1.UpdatePalette;
FrmDlg.Initialize; //这个过程可复杂了
DScreen.Initialize;
// if doFullScreen in DxDraw1.Options then begin
// UseDIBSurface : = TRUE; //这个对程序有作用?
end;
{--------------------- Mouse Interface ----------------------}
procedure TFrmMain.DXDraw1Finalize(Sender: TObject);
begin
//DXTimer.Enabled := FALSE;
end;
procedure TFrmMain.AppOnIdle (Sender: TObject; var Done: Boolean);
begin
Done := TRUE;
if not DXDraw1.CanDraw then exit;
// ProcessKeyMessages;
DScreen.DrawScreen (DxDraw1.Surface);
DWinMan.DirectPaint (DxDraw1.Surface);
with DXDraw1.Surface.Canvas do
begin
topleft:='按下ESC模拟网络连接,,,2秒钟之后连接成功...';
textout(10,10,topleft);
Release;
end;
dxdraw1.Flip;
// DxDraw1.Primary.Draw (0, 0, DxDraw1.Surface.ClientRect, DxDraw1.Surface, FALSE);
end;
procedure TFrmMain.Timer1Timer(Sender: TObject);
begin
//LoginScene.ChangeLoginState(lsLogin);
//DScreen.ChangeScene (stIntro);
DScreen.ChangeScene (stlogin);
Timer1.Enabled:=false;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -