| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663 |
- unit Win2K2;
- INTERFACE
- Uses CoolKey,CoolMice,Graph,Dos;
- {$I Wtypes.inc}
- {$I Errors.inc}
- {$I WMs.inc}
- {Main procedures}
- var
- GlobalPalette : TPalette;
- Function InitWin2K2:UInt16;
- Function DoneWin2K2:UInt16;
- Function MainRunLoop:UInt16;
- Function Alloc(cbSize:Uint32):Pointer;
- Function RegisterClass(aName:String;MainWndProc:TWndProc):UInt16;
- Function CreateWindow(aTitle,aClassName:string;
- aStyles:UINT32;
- aX,aY,aW,aH:Int16;
- aParent:HWND;
- aMenu:HMENU
- ):hWnd;
- Function DefWindowProc(ahWnd:HWND;aMsg: UINT32; awParam,alParam:UINT32):UInt32;
- Function PostQuitMessage(ahWnd:HWND):INT16;
- Function SendMessage(ahWnd:HWND;aMsg,wParam,lParam:UINT32):UINT32;
- Function PostMessage(ahWnd:HWND;aMsg,wParam,lParam:UINT32):UINT32;
- Function FindWindow(aT,aC : PString):HWND;
- Function FindChildWindow(aH:HWND;aT,aC : PString):HWND;
- Function WindowFromPoint(aP:POINT):HWND;
- Function ChildWindowFromPoint(aParent:hWnd;aP:POINT):HWND;
- Function GetWindowText(aH:HWND;aS:PString;StrLen:UINT8):UINT8;
- Function SetWindowText(aH:HWND;aS:PString):UINT8;
- Function PrintChar(SC:UINT8):boolean;
- Function AddOnFrameMessage(aH:hWnd):boolean;
- Function DelOnFrameMessage(aH:hWnd):boolean;
- {---}
- Procedure GetClientRect(aH:HWND;aR:LPRECT);
- Procedure GetGlobalRect(aH:HWND;aR:LPRECT);
- PRocedure GlobalToClient(aH:HWND;aX,aY:INT16;aR:LPPOINT);
- Function GetParent(aH:HWND):HWND;
- Function IsKeyActive(aH:HWND):Boolean;
- {GDI}
- Function BeginPaint(aH:HWND):LPPAINTSTRUCT;
- Procedure EndPaint(aP:LPPAINTSTRUCT);
- Procedure wSetBgColor(aP:LPPAINTSTRUCT;aNewColor:INT8);
- Procedure wSetColor(aP:LPPAINTSTRUCT;aNewColor:INT8);
- Procedure wSetFont(aP:LPPAINTSTRUCT;aNewFont:INT8);
- Procedure wSetFontJustify(aP:LPPAINTSTRUCT;aNewH,aNewV:INT8);
- Procedure wSetStyle(aP:LPPAINTSTRUCT;aNewStyle:INT8);
- Procedure wSetFontSize(aP:LPPAINTSTRUCT;aNewColor:INT8);
- Function wMoveToEx(aP:LPPAINTSTRUCT;X,Y:INT16;lP:LPPOINT):Boolean;
- Function wLineTo(aP:LPPAINTSTRUCT;X,Y:INT16):Boolean;
- Function wTextOut(aP:LPPAINTSTRUCT;X,Y:INT16;aStr:PString):Boolean;
- Function wRectangle(aP:LPPAINTSTRUCT;X1,Y1,X2,Y2:INT16):Boolean;
- Function wLine(aP:LPPAINTSTRUCT;X1,Y1,X2,Y2:INT16):Boolean;
- Function wBar(aP:LPPAINTSTRUCT;X1,Y1,X2,Y2:INT16):Boolean;
- Function wFillCircle(aP:LPPAINTSTRUCT;X1,Y1,Rad:INT16):Boolean;
- IMPLEMENTATION
- Var
- AllClasses : PClassArray;
- AllWindows : PWindow;
- TopMost : PWindow;
- AllFonts : PFontDefArray;
- FontCount : UINT16;
- AllMenus : PMenuList;
- KillList : PWndList;
- OnFrameList : PWndList;
- AllCursors : PCursorArr;
- CursorCnt : UINT8;
- {-----------------------------------------------------------------------}
- CONST
- GlobHandle : hWnd = 1;
- gResizeThr : INT16 = 4;
- LastError : Uint16 = 0;
- ClassesInitCnt : Uint16 = 20;
- ClassesCntInc : UInt16 = 5;
- ClassesCnt : Uint16 = 0;
- bNeedRender : boolean = true;
- {-----------------------------------------------------------------}
- Procedure EGAVGADriver;external;
- {$I procW2K2.inc}
- Function InitWin2K2:UInt16;
- Begin
-
- LastError := wInitKeyboard;
- if (LastError <> ERR_OK) then
- begin
- InitWin2K2 := LastError;
- Exit;
- end;
- LastError := wInitMouse;
- if (LastError <> ERR_OK) then
- begin
- InitWin2K2 := LastError;
- Exit;
- end;
- LastError := wInitGraph;
- if (LastError <> ERR_OK) then
- begin
- InitWin2K2 := LastError;
- Exit;
- end;
- New(AllMenus);
- AllMenus^.Handle :=0;
- AllMenus^.Next := nil;
- AllMenus^.Mn := nil;
- AllClasses := PClassArray(Alloc(ClassesInitCnt * sizeof(TClass)));
- if AllClasses = nil then
- begin
- InitWin2K2 := ERR_NOMEM;
- LastError := ERR_NOMEM;
- Exit;
- end;
- New(AllWindows);
- With AllWindows^ do
- begin
- WClass := nil;
- Handle := 0;
- Parent := Nil;
- Child := nil;
- Brother:= nil;
- Title := nil;
- Queue := nil;
- zOrder := nil;
- Next := nil;
- end;
- TopMost := AllWindows;
- KillList := nil;
- wInitGlobalPalette;
- wInitFonts;
- wInitTitleButtons;
- LastError := ERR_OK;
- InitWin2K2 := ERR_OK;
- end;{}
- {-----------------------------------}
- Function DoneWin2K2:UInt16;
- var
- c : PWindow;
- i : UINT16;
- kl: PWndList;
- Begin
- IF AllClasses <> nil then
- begin
- For i:=0 to ClassesCnt-1 do FreeMem(AllClasses^[i].Name,ord(AllClasses^[i].Name^[0])+1);
- FreeMem(AllCLasses, ClassesInitCnt * sizeof(TClass));
- end;
- While AllWindows <> nil do
- begin
- c:=AllWindows^.Next;
- if AllWindows^.Title <> nil then
- FreeMem(AllWindows^.Title,ord(AllWindows^.Title^[0])+1);
- Dispose(AllWindows);
- AllWindows := C;
- end;
- while KillList <> nil do
- begin
- wDestroyWindow(KillList^.Wnd);
- kl := KillList^.Next;
- Dispose(KillList);
- KillList:=kl;
- end;
- while OnFrameList <> nil do
- begin
- kl := OnFrameList^.Next;
- Dispose(OnFrameList);
- OnFrameList:=kl;
- end;
- wDoneGraph;
- wDoneMouse;
- wDoneKeyboard;
- DoneWin2k2 := 0;
- LastError := ERR_OK;
- end;{}
- {-----------------------------------}
- Function MainRunLoop:UInt16;
- var
- c : PWindow;
- q,nq : PMessageList;
- kl : PWndList;
- Begin
- while (AllWindows^.Next <> nil) do
- begin
- ProcessKeyboard;
- ShowMouse;
- ProcessMouse;
- c := AllWindows^.Next;
- while c <> nil do
- begin
- q := c^.Queue^.Next;
- while q <> nil do
- begin
- wSendMessage(c,q^.msg.Message,q^.msg.wParam,q^.msg.lParam);
- nq := q^.next;
- Dispose(q);
- q := nq;
- end;
- c^.Queue^.Next := nil;
- c := c^.next;
- end;
- while KillList <> nil do
- begin
- wDestroyWindow(KillList^.Wnd);
- kl := KillList^.Next;
- Dispose(KillList);
- KillList:=kl;
- end;
- kl := OnFrameList;
- while kl <> nil do
- begin
- wSendMessage(kl^.wnd,WM_ONFRAME,0,0);
- kl := kl^.next;
- end;
- if bNeedRender then wRenderAll;
- end;
- end;{}
- {-----------------------------------}
- Function RegisterClass(aName:String;MainWndProc:TWndProc):UInt16;
- Var
- cp : PClass;
- na : PClassArray;
- Begin
- cp := wGetClass(aName);
- if (cp <> nil) then
- begin
- RegisterClass:=ERR_CLASSEXIST;
- LastError := ERR_CLASSEXIST;
- exit;
- end;
- if ClassesCnt = ClassesInitCnt then
- begin
- na := Alloc(sizeof(TClass) * (ClassesInitCnt + ClassesCntInc));
- if (na = nil) then
- begin
- RegisterClass := ERR_NOMEM;
- LastError := ERR_NOMEM;
- Exit;
- end;
- Move(AllClasses,Na,sizeof(TClass) * (ClassesInitCnt));
- Inc(ClassesInitCnt,ClassesCntInc);
- end;
- with AllClasses^[ClassesCnt] do
- begin
- Name := Alloc(ord(aName[0])+1);
- Name^ := aName;
- WndProc := MainWndProc;
- end;
- Inc(ClassesCNT);
- RegisterClass := ERR_OK;
- LastError := ERR_OK;
- end;{}
- {-----------------------------------}
- Function CreateWindow(aTitle,aClassName:string;aStyles:UINT32;aX,aY,aW,aH:Int16;
- aParent:HWND;aMenu:HMENU):hWNd;
- Var
- mNew, c : PWindow;
- mClass : PClass;
- g1 : hWnd;
- Begin
- mClass := wGetClass(aClassName);
- if mClass = nil then
- begin
- CreateWindow := 0;
- LastError := ERR_BADCLASS;
- Exit;
- end;
- New(mNew);
- with mNew^ do
- begin
- WClass := mClass;
- Handle := GlobHandle;Inc(GlobHandle);
- Style := aStyles;
- Parent := nil;
- New(Palette);
- Palette^ := GlobalPalette;
- New(Child);
- Child^.Brother := nil;
- Brother:= nil;
- if aParent <> NULL then
- begin
- Parent := wGetWndByhWnd(aParent);
- if Parent=NIL then
- begin
- CreateWindow := 0;
- LastError := ERR_NOPARENT;
- Dispose(mNew);
- Exit;
- end;
- c := Parent^.Child;
- while c^.Brother <> nil do c:=c^.Brother;
- c^.Brother := mNew;
- end;
- Title := PString(Alloc(ord(aTitle[0])+1));
- Title^ := aTitle;
- Pos.A.x :=aX; Pos.a.y := aY; Pos.B.X := aW; Pos.B.Y := aH;
- New(Queue);
- Menu := nil;
- if aMenu <> NULL then
- begin
- Menu := wGetMenuByhMenu(aMenu);
- if Menu = nil then
- begin
- CreateWindow := 0;
- LastError := ERR_BADMENU;
- Dispose(mNew);
- Exit;
- end;
- end;
- Queue^.Next := Nil;
- zOrder := nil;
- Next := nil;
- end;
- if mNew^.Parent = nil then
- begin
- mNew^.zOrder := TopMost^.zOrder;
- TopMost^.zOrder := mNew;
- mNew^.bActive := true;
- KeyActive := mNew;
- gActiveParent := mNew;
- gActiveWindow := mNew;
- end;
- c := AllWindows;
- while c^.next <> nil do c:=c^.next;
- c^.next := mNew;
- if (mNew^.Style AND WS_TITLE) = WS_TITLE then
- begin
- g1:=CreateWindow('','CLOSEBUTTON',WS_CHILD,
- aW-mNew^.Palette^.ActTitleSize-2,-mNew^.Palette^.ActTitleSize+2,
- mNew^.Palette^.ActTitleSize-5,mNew^.Palette^.ActTitleSize-5,
- mNew^.Handle,NULL);
- if (mNew^.Style AND WS_MINMAX) = WS_MINMAX then
- begin
- g1:=CreateWindow('','MINBUTTON',WS_CHILD,
- aW-3*mNew^.Palette^.ActTitleSize-2,-mNew^.Palette^.ActTitleSize+2,
- mNew^.Palette^.ActTitleSize-5,mNew^.Palette^.ActTitleSize-5,
- mNew^.Handle,NULL);
- g1:=CreateWindow('','MAXBUTTON',WS_CHILD,
- aW-2*mNew^.Palette^.ActTitleSize-4,-mNew^.Palette^.ActTitleSize+2,
- mNew^.Palette^.ActTitleSize-5,mNew^.Palette^.ActTitleSize-5,
- mNew^.Handle,NULL);
- end;
- end;
- wSendMessage(mNew, WM_CREATE, 0, UINT32(mNew));
- LastError := ERR_OK;
- CreateWindow := mNew^.Handle
- end;{}
- {-----------------------------------}
- Function SendMessage(ahWnd:HWND;aMsg,wParam,lParam:UINT32):UINT32;
- var
- c : PWindow;
- begin
- c := wGetWndByhWnd(ahWnd);
- if (c=nil) then
- begin
- LastError := ERR_BADHANDLE;
- Exit;
- end;
- SendMessage := c^.WClass^.WndProc(c^.Handle,aMsg,wParam,lParam);
- LastError := ERR_OK;
- end;
- {-----------------------------------}
- Function PostMessage(ahWnd:HWND;aMsg,wParam,lParam:UINT32):UINT32;
- var
- c : PWindow;
- begin
- c := wGetWndByhWnd(ahWnd);
- if c=nil then
- begin
- PostMessage := ERR_BADHANDLE;
- LastError := ERR_BADHANDLE;
- Exit;
- end;
- PostMessage := wPostMessage(c,aMsg,wParam,lParam);
- PostMessage := ERR_OK;
- LastError := ERR_OK;
- end;
- {-----------------------------------}
- Function WindowFromPoint(aP:POINT):HWND;
- var
- c : PWindow;
- begin
- WindowFromPoint := NULL;
- c := wWindowFromPoint(aP);
- if c <> nil then WindowFromPoint := c^.handle;
- LastError := ERR_OK;
- end; {WindowFromPoint}
- {-----------------------------------}
- Function ChildWindowFromPoint(aParent:hWnd;aP:POINT):HWND;
- var
- c : PWindow;
- begin
- ChildWindowFromPoint := aParent;
- c := wGetWndByHWND(aParent);
- if c=nil then
- begin
- LastError := ERR_BADHANDLE;
- ChildWindowFromPoint := NULL;
- Exit;
- end;
- c := wChildWindowFromPoint(c,aP);
- if c <> nil then ChildWindowFromPoint := c^.Handle;
- end; {ChildWindowFromPoint}
- {-----------------------------------}
- Function DefWindowProc(ahWnd:HWND;aMsg: UINT32; awParam,alParam:UINT32):UInt32;
- begin
- case aMsg of
- WM_DESTROY:PostQuitMessage(ahWnd);
- WM_SETTEXT:SetWindowText(ahWnd,PString(alParam));
- WM_GETTEXT:GetWindowText(ahWnd,PString(alParam),awParam);
- end;
- end;
- {-----------------------------------}
- Function PostQuitMessage;
- var
- aNew,c : PWndList;
- wnd : PWindow;
- begin
- Wnd := wGetWndByHWND(ahWnd);
- if Wnd = nil then
- begin
- LastError := ERR_BADHANDLE;
- Exit;
- end;
- New(aNew);
- aNew^.Wnd := Wnd;
- aNew^.Next := nil;
- c := KillList;
- if c<>nil then
- begin
- while c^.Next <> nil do c:=c^.next;
- c^.next := aNew;
- end
- else
- KillList := aNew;
- end;
- {-----------------------------------------------}
- Procedure GetClientRect(aH:HWND;aR:LPRECT);
- var
- wnd : PWindow;
- begin
- wnd:=wGetWndByHWND(aH);
- if (wnd = nil) or (aR = nil) then
- begin
- LastError := ERR_BADHANDLE;
- Exit;
- end;
- aR^.A.X:=0;
- aR^.A.Y:=0;
- aR^.B.X:=wnd^.Pos.B.X-1;
- aR^.B.Y:=wnd^.Pos.B.Y-1;
- if (wnd^.Style AND WS_CHILD) = WS_CHILD then Exit;
- if wnd^.bActive then
- begin
- Dec(aR^.B.X, 2*wnd^.Palette^.ActBorderSize);
- Dec(aR^.B.Y, 2*wnd^.Palette^.ActBorderSize);
- if (wnd^.Style AND WS_TITLE) = WS_TITLE then
- Dec(aR^.B.Y,wnd^.Palette^.ActTitleSize);
- end
- else
- begin
- Dec(aR^.B.X, 2*wnd^.Palette^.NoActBorderSize);
- Dec(aR^.B.Y, 2*wnd^.Palette^.NoActBorderSize);
- if (wnd^.Style AND WS_TITLE) = WS_TITLE then
- Dec(aR^.B.Y,wnd^.Palette^.NoActTitleSize);
- end;
- end;
- {-----------------------------------}
- {$I GDI.inc}
- Procedure GetGlobalRect(aH:HWND;aR:LPRECT);
- var
- wnd, c : PWindow;
- begin
- wnd := wGetWndByHWND(aH);
- if (wnd = nil) or (aR = NIL) then Exit;
- wGetGlobalRect(wnd,aR);
- end;
- {-----------------------------------}
- Procedure GlobalToClient(aH:HWND;aX,aY:INT16;aR:LPPOINT);
- var
- gR : RECT;
- begin
- GetGlobalRect(aH,@gR);
- if aR = nil then exit;
- aR^.X := aX-gR.A.X;
- aR^.Y := aY-gR.A.Y;
- end;
- {-----------------------------------}
- Function GetParent(aH:HWND):HWND;
- var
- wnd : PWindow;
- begin
- GetParent := NULL;
- wnd := wGetWndByHWND(aH);
- if wnd^.Parent <> nil then
- GetParent := wnd^.Parent^.Handle;
- end;
- {-----------------------------------}
- Function GetWindowText(aH:HWND;aS:PString;StrLen:UINT8):UINT8;
- var
- wnd : PWindow;
- begin
- wnd := wGetWndByHWND(aH);
- if (wnd = nil) OR (AS = nil) then
- begin
- GetWindowText := 0;
- LastError := ERR_BADHANDLE;
- Exit;
- end;
- aS^ := Copy(wnd^.Title^,0,StrLen);
- GetWindowText := Length(aS^);
- end;
- {-----------------------------------}
- Function SetWindowText(aH:HWND;aS:PString):UINT8;
- var
- wnd : PWindow;
- begin
- wnd := wGetWndByHWND(aH);
- if (wnd = nil) OR (AS = nil) then
- begin
- SetWindowText := 0;
- LastError := ERR_BADHANDLE;
- Exit;
- end;
- FreeMem(wnd^.Title,ord(wnd^.Title^[0])+1);
- wnd^.Title := Alloc(ord(aS^[0])+1);
- wnd^.Title^ := aS^;
- SetWindowText := Length(aS^);
- wPostMessage(wnd,WM_PAINT,0,0);
- end;
- {-----------------------------------}
- Function FindWindow(aT,aC : PString):HWND;
- var
- wnd : PWindow;
- begin
- FindWindow:=NULL;
- wnd := AllWindows^.Next;
- while (wnd <> nil) do
- begin
- if (aT <> nil) AND (aT^ = wnd^.Title^) then break;
- if (aC <> nil) AND (aC^ = wnd^.wClass^.Name^) then break;
- wnd := wnd^.next;
- end;
- if wnd <> nil then
- FindWindow := wnd^.Handle;
- end;
- {-----------------------------------}
- Function FindChildWindow(aH:HWND;aT,aC : PString):HWND;
- var
- wnd : PWindow;
- begin
- FindChildWindow:=NULL;
- wnd := wGetWndByHWND(aH);
- wnd := wnd^.Child^.Brother;
- while (wnd <> nil) do
- begin
- if (aT <> nil) AND (aT^ = wnd^.Title^) then break;
- if (aC <> nil) AND (aC^ = wnd^.wClass^.Name^) then break;
- wnd := wnd^.Brother;
- end;
- if wnd <> nil then
- FindChildWindow := wnd^.Handle;
- end;
- {-----------------------------------}
- Function PrintChar(SC:UINT8):boolean;
- begin
- PrintChar := EScanCode(SC) in [SC_Q..SC_P,SC_A..SC_L,SC_Z..SC_M,
- SC_1..SC_0,SC_MINUS, SC_EQUAL, SC_BACKSLASH, SC_LBR,SC_RBR,
- SC_SEMICOLON,SC_AMPERSAND,SC_COMMA, SC_PERIOD, SC_SLASH,SC_SPACE];
- end;
- Function AddOnFrameMessage(aH:hWnd):boolean;
- var
- Wnd:PWindow;
- aNew,c : PWndList;
- begin
- Wnd := wGetWndByHWND(aH);
- if Wnd = nil then
- begin
- LastError := ERR_BADHANDLE;
- AddOnFrameMessage := false;
- Exit;
- end;
- New(aNew);
- aNew^.Wnd := Wnd;
- aNew^.Next := nil;
- c := OnFrameList;
- if c<>nil then
- begin
- while c^.Next <> nil do c:=c^.next;
- c^.next := aNew;
- end
- else
- OnFrameList := aNew;
- AddOnFrameMessage := true;
- end;
- Function DelOnFrameMessage(aH:hWnd):boolean;
- var
- Wnd : PWindow;
- c,d : PWndList;
- begin
- DelOnFrameMessage := false; { Be pessimistic :) }
- Wnd := wGetWndByHWND(aH);
- if Wnd = nil then
- begin
- LastError := ERR_BADHANDLE;
- Exit;
- end;
- c := OnFrameList;
- if c = nil then exit;
- if c^.Wnd<>Wnd then
- begin
- while (C^.Next <> nil) AND (c^.Next^.Wnd <> Wnd) do c:=c^.next;
- if c^.next = nil then exit;
- d:=c^.next;
- c^.next := d^.next;
- dispose(d);
- end
- else
- begin
- OnFrameList := c^.Next;
- Dispose(C);
- end;
- DelOnFrameMessage:=true;
- end;
- Function IsKeyActive(aH:HWND):Boolean;
- begin
- IsKeyActive := KeyActive^.Handle = aH;
- end;
- END.
|