SOL9 2.0 Class: Primitive

 SOL9 C++ Class Library  SOL9 Samples  SOL9 Tutorial  SOL9 FAQ  SOL9 ClassTree 

Source code

/*
 * Primitive.h 
 * Copyright (c) 2009 Antillia.com TOSHIYUKI ARAI. ALL RIGHTS RESERVED. 
 */


// SOL++2000
// 2000.02.18
#pragma once

#include <sol\View.h>

#include <sol\FileStream.h>
#include <sol\Application.h>
#include <sol\ClientDC.h>

namespace SOL {

class Primitive :public View {

private:
    static int stylesCount()
    {
            int count = 0;
            styles(&count);
            return count;
    }

    static Arg* styles(int* count = NULL) {
        static Arg _styles[] = {
        {XmNgroup,         WS_GROUP},
        {XmNdisabled,         WS_DISABLED},
        {XmNtabStop,         WS_TABSTOP},
        {XmNborderWidth,     WS_BORDER},
        };
        if (count) {
            *count = XtNumber(_styles);
        }
        return _styles;
    }

private:
    WNDPROC     newProc;    
    WNDPROC     oldProc;    
 

protected:
    void Primitive::resize(const TCHAR* label)
    {
        if(label && strlen(label)) {
            ClientDC cdc(this);
            HFONT hfont = null;
            Font* font = getFont();
            if (font) {
                hfont = (HFONT)cdc.select(font);
            }
            SIZE size;
            cdc.getTextExtent(label, strlen(label), &size);
            int w = size.cx;
            int h = size.cy;
            int x, y;
            getLocation(x, y);
            h = cdc.getTextHeight();
            reshape(x, y, w+h*2, h+10);//h*7/4);
            if (hfont) cdc.select(hfont);
        }
    }
    
    
protected:
    LRESULT    defaultProc(Event& event)
    {
        if(oldProc) {
    
#ifdef STRICT
            return ::CallWindowProc(oldProc, 
#else
            return ::CallWindowProc((FARPROC)oldProc, 
#endif
                     getWindow(), 
                     event.getMessage(), 
                     event.getWParam(),
                     event.getLParam());
        }
        return View::defaultProc(event);
    }

protected:
    LRESULT discardInput(Event& event)
    {
        View* view = getParent();
        if(view) {
            HWND parent = view -> getWindow();

            POINT p;
            ::GetCursorPos(&p);
            ::ScreenToClient(parent, &p);

            switch(event.getMessage()) {

            case WM_KEYDOWN:
            case WM_KEYUP:
            case WM_SETFOCUS:
            case WM_CHAR:
                return 0L;

            case WM_MOUSEMOVE:
            case WM_LBUTTONDOWN:
            case WM_LBUTTONUP:
            case WM_LBUTTONDBLCLK:
                return view -> send(event.getMessage(), 0,
                    MAKELONG(p.x, p.y));

            default:
                break;
            }
        }
        return Primitive::defaultProc(event);
    }
    
    WNDPROC        getNewProc() { return newProc; }

public:
    Primitive()
    :View()
    {
        newProc = NULL;
        oldProc = NULL;
    }

public:
    Primitive(View* parent, HWND hwnd)
    :View(parent)
    {
        newProc = NULL;
        oldProc = NULL;
        setWindow(hwnd);
        Application::add(hwnd, this);    
        setDestructable(FALSE);
    }

public:
    Primitive(View* parent, const TCHAR* name, Args& args)
    :View(parent, name,
            args.set(styles(), stylesCount())
                .set(XmNstyle, (ulong)WS_CHILD|WS_VISIBLE))
    {
        newProc = NULL;
        oldProc = NULL;
    }

public:
    Primitive::~Primitive()
    {
    }


public:
    virtual Boolean create(View* parent, const TCHAR* name, Args& args)
    {
        return View::create(parent, name,
                args.set(styles(), stylesCount())
                    .set(XmNstyle, (ulong)WS_CHILD|WS_VISIBLE));
    }


    virtual BOOL hasCallback() { return TRUE; }
    
    virtual const TCHAR* defaultCallbackName() { return NULL; }
    

    virtual void setSensitivity(BOOL flag) {
            disable();
    }


public:
    void layout(int x, int y, int w, int h)
    {
        reshape(x, y, w, h);
    }

public:
    void replaceWindowProc()
    {
        WNDPROC proc   = (WNDPROC)getWindowLong(GWL_WNDPROC);
        Application& applet = Application::getApplet(NULL);

        HINSTANCE hins = applet.getInstance();//Application::getInstance();
            
        if(newProc == NULL) {
            newProc = (WNDPROC)View::procedure;

            oldProc = proc;
            setWindowLong(GWL_WNDPROC, (LPARAM)newProc);
        }
    }


public:
    void restoreWindowProc()
    {
        if(oldProc) {
            setWindowLong(GWL_WNDPROC, (LONG)oldProc);
            oldProc = NULL;
            if(newProc) {
                newProc = NULL;
            }
        }
    }
};

}



Last modified: 19 Dec 2009

Copyright (c) 2009 Antillia.com ALL RIGHTS RESERVED.