/*
* 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;
}
};
}
|