SOL9 2.0 Class: Column

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

Source code

/*
 * Column.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 Column :public Composite {
private:
    int        margin;
    int        spacing;
    int        column;
    int        labelWidth;

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

        ClientDC cdc(this);
        TCHAR*  label = _T("A");

        SIZE size;
        cdc.getTextExtent(label, strlen(label), &size);
        int  ch = size.cy * 3/2; 

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

        HWND self = getWindow();
        HWND child = ::GetWindow(self, GW_CHILD);
        TCHAR    text[256];
        if (labelWidth == 0) {
            while(child) {
                if((num % 2) == 0) {
                    ::GetWindowText(child, text, sizeof(text));
                    SIZE size; 
                    cdc.getTextExtent(text, strlen(text), &size);
                    if(size.cx >= (WORD)labelWidth) 
                        labelWidth = size.cx;
                }
                child = ::GetWindow(child, GW_HWNDNEXT);
                num++;
            }
            labelWidth = labelWidth+2*margin;
        }

        child = ::GetWindow(self, GW_CHILD);
        num = 0;
        int res;
        int ss;
        x = margin;
        while(child) {
            res = num % column;
            if(num >0 && res == 0) {
                y = y + ch + spacing;
            }
            if(res == 0) {
                x = margin;
                ss = labelWidth-margin;
            }
            if(res == 1) {
                x = labelWidth+margin;
                ss = w - x - margin;
            }
//        x = margin + cw * (num % column);
            ::MoveWindow(child, x, y, ss, ch, FALSE);
            child = ::GetWindow(child, GW_HWNDNEXT);
            num++;
        }

        update(NULL);
        return NULL;
}

public:
    Column():Composite() { }

public:
    Column(View* parent, const TCHAR* name, Args& args)
    :Composite(parent, name, 
        args.set(XmNclassStyle, NULL)
            .set(XmNclassName, _T("Column")))
    {
        margin  = 4;
        spacing = 4;
        column  = 2;
        addEventHandler(WM_SIZE, this,
            (Handler)&Column::size, NULL);
        labelWidth = 0;
        setValues(args);
    }

public:
    virtual Boolean create(View* parent, const TCHAR* name, Args& args)
    {
        Boolean rc = Composite::create(parent, name, 
            args.set(XmNclassStyle, NULL)
            .set(XmNclassName, _T("Column")));

        margin  = 4;
        spacing = 4;
        column  = 2;
        addEventHandler(WM_SIZE, this,
            (Handler)&Column::size, NULL);
        labelWidth = 0;
        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.