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 + -
显示快捷键?