SOL9 2.0 Class: IconButton

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

Source code

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


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

#include <sol\Button.h>

namespace SOL {

class IconButton :public Button {
private:
    BOOL    capturing;
    HICON    hicon;
    BOOL    deleteFlag; 
    
private:

    LRESULT IconButton::defaultProc(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_KILLFOCUS:
            case WM_CHAR:
                return 0L;

            case WM_SETFOCUS:
                return 0L;

            case WM_MOUSEMOVE:
                {
                    POINT p;
                    RECT r;

                    ::GetCursorPos(&p);
                    getWindowRect(&r);

                    if(capturing == TRUE) {
                        if((p.x < r.left) || (p.y < r.top) ||
                        (p.x > r.right) || (p.y > r.bottom)) {
                             setState(FALSE);
                        }
                        else {
                            setState(TRUE);
                        }
                    }
                    if(capturing == FALSE) {
                        view->send(WM_MOUSEMOVE, 
                            event.getWParam(),    event.getLParam());

                        if((p.x >= r.left+2) && (p.y >= r.top+2) &&
                        (    p.x <= r.right-2) && (p.y <= r.bottom-2)) {
                        ;
                        }
                        else {
                            ;
                        }
                    }
                }
                break;

            case WM_LBUTTONDOWN:
                setState(TRUE);
                capturing = TRUE;
                capture();
                return 0;

            case WM_LBUTTONUP:
                if(capturing && getState()) {
                    callCallback(XmNactivateCallback, (Key)getWindow(),
                        NULL, event);
                }
                capturing = FALSE;
                setState(FALSE);
                ::ReleaseCapture();
                return 0;

            case WM_LBUTTONDBLCLK:
                return 0;

            default:
                break;
            }
        }
        return Primitive::defaultProc(event);
    }

public:
    IconButton(): Button() { }

public:
    IconButton(View* parent, const char* label, Args& args)
    :Button(parent, label, 
            args.set(XmNstyle, (ulong)(WS_TABSTOP|BS_ICON)))
    {
        capturing = FALSE;
        replaceWindowProc();

        int  xsize = (int)args.get(XmNxImageSize);
        int  ysize = (int)args.get(XmNyImageSize);
        char* name = (char*)args.get(XmNimageName);
        HINSTANCE hInst = getInstanceHandle();

        hicon = (HICON)::LoadImage(hInst, name, IMAGE_ICON,
                xsize, ysize, LR_DEFAULTCOLOR);
        
        send(BM_SETIMAGE, TRUE, (LPARAM)hicon);

        deleteFlag = TRUE;
    }

public:        
    ~IconButton() 
    {
        ::ReleaseCapture();
        if(deleteFlag && hicon) {
            ::DeleteObject(hicon);
        }
    }

public:
    void addCallback(const char* name, Object* object,
            Callback callback, void* data)
    {
        View::addCallback(name, (Key)getWindow(), object, 
            callback, data);
    }


public:
    virtual Boolean create(View* parent, const char* label, Args& args)
    {
        Boolean rc = Button::create(parent, label, 
            args.set(XmNstyle, (ulong)(WS_TABSTOP|BS_ICON)));

        capturing = FALSE;
        replaceWindowProc();

        int  xsize = (int)args.get(XmNxImageSize);
        int  ysize = (int)args.get(XmNyImageSize);
        char* name = (char*)args.get(XmNimageName);
        HINSTANCE hInst = getInstanceHandle();

        hicon = (HICON)::LoadImage(hInst, name, IMAGE_ICON,
                xsize, ysize, LR_DEFAULTCOLOR);
        
        send(BM_SETIMAGE, TRUE, (LPARAM)hicon);

        deleteFlag = TRUE;

        return rc;
    }

};

}


Last modified: 19 Dec 2009

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