SOL9 2.0 Class: RowColumn

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

Source code

/*
 * RowColumn.h 
 * Copyright (c) 2011 Antillia.com TOSHIYUKI ARAI. ALL RIGHTS RESERVED. 
 */


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

#include <sol\Composite.h>
#include <sol\ClientDC.h>

namespace SOL {

class RowColumn :public Composite {
private:
    static const long STYLE = WS_CHILD|WS_VISIBLE;

private:
    int        margin;
    int        spacing;
    int        column;

protected:
    long size(Event& event)
    {
        LPARAM lParam = event.getLParam();
        int  w = LOWORD(lParam);
        int  h = HIWORD(lParam);

        ClientDC cdc(this);
        char*  label = "A";
        Size size;
        cdc.getTextExtent(label, strlen(label), &size);
        int  ch = size.cy*3/2;

        int  cw = (w-margin)/column;

        int  num = 0;
        int  x = margin;
        int  y = margin;

        HWND self = getWindow();
        HWND child = ::GetWindow(self, GW_CHILD);
        while(child) {
            if(num >0 && (num%column)== 0) {
                y = y + ch + spacing;
            }
            x = margin + cw * (num % column);
            ::MoveWindow(child, x, y, cw-margin, ch, FALSE);
            child = ::GetWindow(child, GW_HWNDNEXT);
            num++;
        }
        update();
        return NULL;
    }

    int        getMargin() { return margin;  }

    int        getSpacing(){ return spacing; }

    int        getColumn() { return column;  }

public:
    RowColumn():Composite() { }

public:
    RowColumn(View* parent)
        :Composite(parent) { }
  

public:
    RowColumn(View* parent, const char* name, Args& args)
    :Composite(parent, name, 
        args.set(XmNclassStyle, NULL)
            .set(XmNstyle, (ulong)STYLE)
            .set(XmNclassName, "RowColumn"))
    {
        margin  = 4;
        spacing = 4;
        column  = 2;
        addEventHandler(WM_SIZE, this,
            (Handler)&RowColumn::size, NULL);
        setValues(args);
    }

public:
    ~RowColumn() { }

public:
    virtual Boolean create(View* parent, const char* name, Args& args)
    {
        Boolean rc = Composite::create(parent, name, 
            args.set(XmNclassStyle, NULL)
                .set(XmNstyle, (ulong)STYLE)
                .set(XmNclassName, "RowColumn"));

        margin  = 4;
        spacing = 4;
        column  = 2;
        addEventHandler(WM_SIZE, this,
            (Handler)&RowColumn::size, NULL);
        setValues(args);

        return rc;
    }

public:
    void    setValues(Args& args)
    {
        ulong  val;
        if (args.get(XmNmargin, &val))
            margin = (int)val;
        if (args.get(XmNspacing, &val))
            spacing = (int)val;
        if (args.get(XmNcolumn, &val))
            column = (int)val;
    }

};

}


Last modified: 1 Feb 2012

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