basewindow.cpp
来自「SimpleGraphicOperatingSystem 32位图形化操作系统 」· C++ 代码 · 共 381 行
CPP
381 行
#include <Osdef.h>
#include <System.h>
#include <Api.h> //Sgos api
namespace System{
BaseWindow* GetWindowClass( void* window ){
BaseWindow* p;
p = (BaseWindow*)Window::GetWindowData( window, WindowClass );
return p;
}
BaseWindow::BaseWindow(BaseWindow* parent, string text, int style){
void* ptrParentWindow;
winParent = parent;
if( parent )
ptrParentWindow = parent->window;
else
ptrParentWindow = (void*)0;
//创建窗体,保存指针到window
window = Window::CreateWindow(
ptrParentWindow,
(char*)text.GetData(),
text.Length(),
style,
0,
0,
100,
100
);
//创建位图
bitmap = Bitmap::CreateCompatibleBitmap( (BitmapInfo*)0, 100, 100 );
if( !window || !bitmap ){
DPRINT("!window || !bitmap");
}
Window::SelectBitmap( window, bitmap );
SetData( WindowClass, (int)this );
visible=false;
active=true;
type = TypeNone;
//window style
winStyle.active.backColor = Bitmap::MakeColor(231,231,231);
winStyle.active.borderColor = Bitmap::MakeColor(0,0,0);
winStyle.active.textColor = Bitmap::MakeColor(0,0,0);
winStyle.inactive = winStyle.active;
winStyle.background = (BitmapInfo*)0;
winStyle.useBackground = false;
winStyle.drawBack = false;
winStyle.drawBorder = false;
if( style&WS_DrawBack )
winStyle.drawBack = true;
if( style&WS_DrawBorder )
winStyle.drawBorder = true;
}
BaseWindow::~BaseWindow(){
Dispose();
}
int BaseWindow::Dispose()
{
int cancel;
cancel=false;
OnDispose( cancel );
if( cancel )
return cancel;
if( winStyle.background )
Bitmap::DestroyBitmap(winStyle.background);
Window::DestroyWindow( window );
}
BaseWindow* BaseWindow::Parent(){
return winParent;
}
BitmapInfo* BaseWindow::Bitmap(){
return bitmap;
}
int BaseWindow::OnDispose(int& cancel)
{
DPRINT("Disposing window: %x", window );
}
int BaseWindow::OnKeyDown( int code, char ascii, int flag )
{
}
int BaseWindow::OnKeyUp( int code, char ascii, int flag )
{
}
int BaseWindow::OnMouseDown( int button, Point* p )
{
}
int BaseWindow::OnMouseUp( int button, Point* p )
{
}
int BaseWindow::OnMouseMove( Point* p )
{
}
int BaseWindow::OnPaint()
{
DrawBaseWindow( active );
}
void BaseWindow::DrawBaseWindow( int type )
{
switch( type )
{
case 1:
if( winStyle.drawBack )
Bitmap::RectFill( bitmap, 0, 0, bitmap->Width-1, bitmap->Height-1, winStyle.active.backColor );
if( winStyle.drawBorder )
Bitmap::RectFill( bitmap, 0, 0, bitmap->Width-1, bitmap->Height-1, winStyle.active.borderColor );
case 0:
if( winStyle.drawBack )
Bitmap::RectFill( bitmap, 0, 0, bitmap->Width-1, bitmap->Height-1, winStyle.inactive.backColor );
if( winStyle.drawBorder )
Bitmap::RectFill( bitmap, 0, 0, bitmap->Width-1, bitmap->Height-1, winStyle.inactive.borderColor );
}
}
int BaseWindow::OnActivate(bool a){
active = a;
return a;
}
int BaseWindow::OnSize( int w, int h ){
OnPaint();
}
int BaseWindow::OnMove( int w, int h ){
}
int BaseWindow::OnMouseHover( int button ){
}
int BaseWindow::OnMouseLeave( int button ){
}
int BaseWindow::Refresh()
{
Window::RefreshWindow( window, null );
}
int BaseWindow::Show(){
if(!visible){
visible=true;
Window::ShowWindow( window, true );
}
}
int BaseWindow::Hide(){
visible=false;
Window::ShowWindow( window, false );
}
int BaseWindow::ShowMouse(){
Window::ShowMouse( window, true );
}
int BaseWindow::HideMouse(){
Window::ShowMouse( window, false );
}
int BaseWindow::Refresh(Rect &r)
{
Window::RefreshWindow( window, &r );
}
int BaseWindow::OnMessage( Message* msg )
{
Point p;
switch( msg->message ){
case WM_PAINT:
if(visible)
OnPaint();
break;
case WM_SIZE:
OnSize(msg->param[0],msg->param[1]);
break;
case WM_MOVE:
OnMove(msg->param[0],msg->param[1]);
break;
case WM_MOUSEHOVER:
//param2表示按钮是否按下
OnMouseHover(msg->param[1]);
break;
case WM_MOUSELEAVE:
OnMouseLeave(msg->param[1]);
break;
case WM_ACTIVATE:
if( msg->param[0] )
OnActivate(true);
else
OnActivate(false);
break;
case WM_LBUTTONDOWN:
p.x = (msg->param[0]>>16);
p.y = (msg->param[0]&0xffff);
OnMouseDown( 1, &p );
break;
case WM_LBUTTONUP:
p.x = (msg->param[0]>>16);
p.y = (msg->param[0]&0xffff);
OnMouseUp( 1, &p );
break;
case WM_RBUTTONDOWN:
p.x = (msg->param[0]>>16);
p.y = (msg->param[0]&0xffff);
OnMouseDown( 2, &p );
break;
case WM_RBUTTONUP:
p.x = (msg->param[0]>>16);
p.y = (msg->param[0]&0xffff);
OnMouseUp( 2, &p );
break;
case WM_MBUTTONDOWN:
p.x = (msg->param[0]>>16);
p.y = (msg->param[0]&0xffff);
OnMouseDown( 3, &p );
break;
case WM_MBUTTONUP:
p.x = (msg->param[0]>>16);
p.y = (msg->param[0]&0xffff);
OnMouseUp( 3, &p );
break;
case WM_MOUSEMOVE:
p.x = (msg->param[0]>>16);
p.y = (msg->param[0]&0xffff);
OnMouseMove( &p );
break;
case WM_KEYDOWN:
OnKeyDown( msg->param[1]&0xffff, msg->param[0], msg->param[1]>>16 );
break;
case WM_KEYUP:
OnKeyUp( msg->param[1]&0xffff, msg->param[0], msg->param[1]>>16 );
break;
}
//DPRINT("win:0x%X OnMessage: %d", msg->window, msg->message );
}
//方法
int BaseWindow::SetText( string txt )
{
QuickMessage( window, WM_SETTEXT, (int)txt.GetData(), 0 );
return Window::SetWindowText( window, (char*)txt.GetData(), txt.Length() );
}
int BaseWindow::GetText( string& txt )
{
char *tmp = new char[1024];
Window::GetWindowText( window, tmp, 1023 );
txt = tmp;
delete[] tmp;
return true;
}
int BaseWindow::SetData( int pos, int value )
{
return Window::SetWindowData( window, pos, value );
}
int BaseWindow::Activate( )
{
return Window::SetActiveWindow( window );
}
int BaseWindow::GetData( int pos )
{
int value;
value = Window::GetWindowData( window, pos );;
return value;
}
int BaseWindow::Move( int x, int y, int w, int h ){
if( w>0 && h>0 && Height()* Width() != w*h ){
BitmapInfo* bitmap2;
bitmap = Bitmap::CreateCompatibleBitmap( bitmap, w, h );
bitmap2 = Window::SelectBitmap( window, bitmap );
Bitmap::DestroyBitmap( bitmap2 );
}
return Window::MoveWindow( window, x, y, w, h );
}
int BaseWindow::OnLoad()
{
return true;
}
int BaseWindow::MoveToTop( bool always )
{
Window::MoveToTop( window, always );
}
int BaseWindow::MoveToBottom( bool always )
{
Window::MoveToBottom( window, always );
}
int BaseWindow::Move( int x, int y ){
return Move( x, y, 0, 0 );
}
int BaseWindow::Height(){
Rect r;
Window::GetWindowRect(window, &r );
return r.bottom-r.top ;
}
int BaseWindow::Width(){
Rect r;
Window::GetWindowRect(window, &r );
return r.right-r.left ;
}
int BaseWindow::Left(){
Rect r;
Window::GetWindowRect(window, &r );
return r.left ;
}
int BaseWindow::Top(){
Rect r;
Window::GetWindowRect(window, &r );
return r.top ;
}
int BaseWindow::GetRect( Rect &r ){
return Window::GetWindowRect(window, &r );
}
int BaseWindow::SetSize( int w, int h ){
return Move( -1, -1, w, h );
}
int BaseWindow::SetBackground( BitmapInfo* bi )
{
winStyle.background = bi;
if( bi )
winStyle.useBackground = true;
else
winStyle.useBackground = false;
}
int BaseWindow::SetBackground( string fileName )
{
if( fileName == "" )
{
winStyle.useBackground = false;
return true;
}else{
winStyle.background = Bitmap::LoadBitmap( fileName );
if( winStyle.background )
winStyle.useBackground = true;
return true;
}
}
int BaseWindow::SetBackColor( int activeColor, int inactiveColor )
{
if( activeColor )
winStyle.active.backColor = activeColor;
if( inactiveColor )
winStyle.inactive.backColor = inactiveColor;
}
int BaseWindow::SetBorderColor( int activeColor, int inactiveColor )
{
if( activeColor )
winStyle.active.borderColor = activeColor;
if( inactiveColor )
winStyle.inactive.borderColor = inactiveColor;
}
int BaseWindow::SetTextColor( int activeColor, int inactiveColor )
{
if( activeColor )
winStyle.active.textColor = activeColor;
if( inactiveColor )
winStyle.inactive.textColor = inactiveColor;
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?