Ejemplo RMChart desde DLL

2015-10-23_202626

Descarga Ejemplo Aquí

/*
 * RMChart DLL Demo by (c)2015 MigSoft 
 */

#include "oohg.ch"

#define ID_CHART   1001
#define ID_CHART_2 1002

#define RMC_DEFAULT   O
#define RMC_PORTRAIT  1
#define RMC_LANDSCAPE 2

#define RMC_EMF       1
#define RMC_EMFPLUS   2
#define RMC_BMP       3


Function Main()

  DEFINE WINDOW Win_1 ;
    AT 0,0 ;
    WIDTH 800 ;
    HEIGHT 600 ;
    TITLE 'Test RMChart By (c)2015 MigSoft' ;  
    ON INIT Chart( MyFillData(1) ) ;
    MAIN 
  
    DEFINE MAIN MENU
      DEFINE POPUP 'Test'
        MENUITEM 'Chart 1 View'  ACTION Chart( MyFillData(1) )
        MENUITEM 'Chart 1 Print' ACTION PrintChart( MyFillData(1) ) 
        SEPARATOR
        MENUITEM 'Chart 2 View'  ACTION Chart( MyFillData(2) )
        MENUITEM 'Chart 2 Print' ACTION PrintChart( MyFillData(2) )
        SEPARATOR
        MENUITEM 'Chart 3 View'  ACTION Chart( MyFillData(3) )
        MENUITEM 'Chart 3 Print' ACTION PrintChart( MyFillData(3) )
      END POPUP
    END MENU

  END WINDOW
  
  CENTER WINDOW Win_1
  ACTIVATE WINDOW Win_1

Return

*-----------------------------------------------------------------------------*
Procedure Chart( cData )
*-----------------------------------------------------------------------------*

        CallDll32 ( "RMC_CREATECHARTFROMFILE" , "RMCHART.DLL" , GetFormHandle("Win_1"), ;
                    ID_CHART, 10, 10, 0, cData  )        
        CallDll32 ( "RMC_DRAW" , "RMCHART.DLL" , ID_CHART  )        

Return

*-----------------------------------------------------------------------------*
Procedure PrintChart( cData )
*-----------------------------------------------------------------------------*

    CallDll32 ( "RMC_CREATECHARTFROMFILE" , "RMCHART.DLL" , GetFormHandle("Win_1"), ;
                 ID_CHART_2, 10, 10, 1, cData  )        

    IF CallDll32 ( "RMC_DRAW2PRINTER" , "RMCHART.DLL" , ID_CHART_2, RMC_LANDSCAPE, ;
                   10, 10, 250, 150, RMC_EMFPLUS  )  < 0
       MsgStop("Print error!", "Error")   
       
    ENDIF

    CallDll32 ( "RMC_DELETECHART" , "RMCHART.DLL" , ID_CHART_2  )        

Return


Function MyFillData( nOp )
    Local sData := "" 

  If nOp == 3
    sData += "00003650|00004450|000051|000061|000071|00008-6697831|00009401|00011Tahoma|100011"
    sData += "|1000310|1000410|10005-5|10006-5|1000910|100101|100111|100121|100131|100181|1002"
    sData += "00|100217|1002215|100238|100272|100331|100341|100358|100378|100411|100482|100492"
    sData += "|10051-6751336|10052-15132304|10053-983041|100541|100558|10056-16777077|10057-16"
    sData += "777077|100586|10060-16777077|10061-1468806|100622|10180data source: www.federalr"
    sData += "eserve.gov + www.ecb.int|10181Prime Rates in USA and Euroland|10183 %|101871999*"
    sData += "2000*2001*2002*2003*2004*2005*2006|110011|1100221|110035|1100434|110052|110063|1"
    sData += "10073|1100970|1101312|110171|11019-16744448|1102115|110221|1102396|110262|110521"
    sData += "2|110534.75*4.75*4.75*4.75*4.75*5*5*5.25*5.25*5.25*5.5*5.5*5.5*5.75*6*6*6.5*6.5*"
    sData += "6.5*6.5*6.5*6.5*6.5*6.5*5.5*5.5*5*4.5*4*3.75*3.75*3.5*3*2.5*2*1.75*1.75*1.75*1.7"
    sData += "5*1.75*1.75*1.75*1.75*1.75*1.75*1.75*1.25*1.25*1.25*1.25*1.25*1.25*1.25*1*1*1*1*"
    sData += "1*1*1*1*1*1*1*1*1*1*1.25*1.5*1.75*2*2.25*2.25*2.5*2.75*2.75*3*3.25*3.25*3.5*3.75"
    sData += "*3.75*4*4.25*4.5*4.5*4.75*4.75*5*5.25*5.25*5.25*5.25*5.25*5.25*5.25|120011|12002"
    sData += "21|120035|1200434|120052|120063|120073|1200950|1201312|120171|12019-2448096|1202"
    sData += "115|120221|1202396|120262|1205212|120533*3*3*2.5*2.5*2.5*2.5*2.5*2.5*2.5*3*3*3*3"
    sData += ".25*3.5*3.75*3.75*4.25*4.25*4.5*4.5*4.75*4.75*4.75*4.75*4.75*4.75*4.75*4.5*4.5*4"
    sData += ".5*4.25*3.75*3.75*3.25*3.25*3.25*3.25*3.25*3.25*3.25*3.25*3.25*3.25*3.25*3.25*3."
    sData += "25*2.75*2.75*2.75*2.5*2.5*2.5*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*"
    sData += "2*2*2*2*2*2.25*2.25*2.25*2.5*2.5*2.5*2.75*2.75*3*3*3.25*3.25*3.5|010011|010054|0"
    sData += "100721|01014-16744448|010222|01024216*287|01025109*109|010272|010283|010012|0100"
    sData += "51|01010295|01011102|010191|01026USA (Federal Funds Rate)|010013|010054|0100721|"
    sData += "01014-10496|010222|01024260*287|01025192*192|010272|010283|010014|010051|0101029"
    sData += "5|01011185|010191|01026Euroland (Prime Rate)" 
  Endif
  
  If nOp == 2   
    sData := "00003670|00004450|000051|000061|000071|00008-10185235|00009310|00011Tahoma|10001" + ;
             "1|100035|1000410|10005-5|10006-5|1000912|100101|100111|100131|100181|10020100000" + ;
             "|10021250000|1002211|100239|100281|100292|100300|100310|100322|100331|100341|100" + ;
             "3510|100378|100482|100492|10051-32944|10052-1296|10053-983041|100541|100558|1005" + ;
             "6-1828|10057-16777216|100592|10060-1828|10061-16777216|10180data source: F.A.Z|1" + ;
             "0181The world's 10 biggest industrial companies 2003|10183$ |10184Total turnover" + ;
             " in Mill. Dollar|10185 %|10186Net operating margin|10187Exxon Mobil*Royal Dutch " + ;
             "/ Shell*BP*General Motors*Daimler Chrysler*Ford Motor*Toyota Motor*General Elect" + ;
             "ric*TOTAL*Chevron Texaco|110011|110021|110031|110043|110053|11006-1|1100950|1101" + ;
             "31|11014-1|110171|11019-10496|1102111|110221|1102310|11053242365*235598*232571*1" + ;
             "85524*170457*164196*149321*132797*130067*119703|120011|1200221|120035|1200422|12" + ;
             "0052|120061|120071|1200970|120111|120121|120131|1201421|120171|12019-16744448|12" + ;
             "02115|120221|1202310|120261|120538.9*4.1*4.4*2.1*.3*.3*5.9*11.3*6.7*6"
  Endif
  
  If nOp == 1   
    sData := "00003700|00004500|000054|000061|000071|00008-984833|00009310|00011Tahoma|100011|" + ;
             "100032|100042|10005348|10006248|1000910|100101|100111|100181|100200|10021100|100" + ;
             "2211|100238|100331|100341|100355|100378|100481|100491|10051-984833|10052-1677721" + ;
             "6|10053-657956|100541|100558|10056-16777216|10057-16777216|10060-16777216|10061-" + ;
             "16777216|10187Label 1*Label 2*Label 3*Label 4*Label 5|110011|110021|110031|11004" + ;
             "6|110056|11006-1|110091|110131|11014-1|110171|1102111|110221|110235|1105330*40*7" + ;
             "0*60*20|200011|20003352|200042|20005-2|20006248|2000910|200101|200111|200181|200" + ;
             "200|20021100|2002211|200238|200331|200341|200355|200378|200484|200491|20051-9848" + ;
             "33|20052-16777216|20053-657956|200544|200555|20056-16777216|20057-16777216|20060" + ;
             "-16777216|20061-16777216|20187Label 1*Label 2*Label 3*Label 4*Label 5|210011|210" + ;
             "023|210033|210045|210055|21006-1|210091|210101|210131|21014-1|210171|2102111|210" + ;
             "221|210235|2105320*10*15*25*30|220011|220023|220033|220045|220055|22006-1|220091" + ;
             "|220101|220131|22014-1|220171|2202111|220221|220235|2205325*30*10*20*15|230011|2" + ;
             "30023|230033|230045|230055|23006-1|230091|230101|230131|23014-1|230171|2302111|2" + ;
             "30221|230235|2305310*20*40*20*30|240011|240023|240033|240045|240055|24006-1|2400" + ;
             "91|240101|240131|24014-1|240171|2402111|240221|240235|2405340*30*20*30*20|300011" + ;
             "|300032|30004252|30005348|30006-2|3000910|300101|300181|300481|300491|30051-9848" + ;
             "33|30052-16777216|30053-657956|310011|3100251|310031|3100454|310054|310071|31009" + ;
             "1|310121|310151|310161|310171|310182|310211|310221|310235|3105330*50*20*40*60|40" + ;
             "0011|40003352|40004252|40005-2|40006-2|4000910|400101|400111|400131|400181|40020" + ;
             "100|40021250|4002211|400238|400281|400292|400300|400310|400322|400331|400341|400" + ;
             "3510|400378|400482|400492|40051-984833|40052-16777216|40053-984833|400541|400558" + ;
             "|40056-16776961|40057-16777216|400592|40060-16777216|40061-16777216|40183$ |4018" + ;
             "5 %|410011|410021|410031|410043|410053|41006-1|4100950|410131|41014-1|410171|410" + ;
             "19-10496|4102111|410221|4102310|41053240*230*220*180*170*160*145*130*125*115|420" + ;
             "011|4200221|420035|4200422|420052|420061|420071|4200963|420111|420121|420131|420" + ;
             "171|42019-16744448|4202115|420221|4202310|420261|420538.1*6.2*4.3*2.2*1.2*3.1*5." + ;
             "2*11.4*7.3*4.2"
  Endif
    
Return(sData)

Prototipo de GUI por Roberto Lopez

I’m trying to learn WIN32API fundamentals and Harbour-C interface,
so i started the development of a little experimental project:
A simple GUI system for Harbour with the goal of hide the complexities
asociated with WIN32API programming (handles, id’s,etc.).

I taked some ideas and inspiration from HGF (Harbour GUI framework)
by Antonio Linares and Alexander Kressin, HWGUI by Alexander Kressin
and BCX by Kevin Diggins.

*------------------------------------------------------------------------------
* Low Level C Routines
*------------------------------------------------------------------------------
#pragma BEGINDUMP

#include <windows.h>

#include <commctrl.h>
#include "hbapi.h"
#include "hbvm.h"
#include "hbstack.h"
#include "hbapiitm.h"

static char g_szClassName[] = "MyWindowClass";
static HINSTANCE g_hInst = NULL;

LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
  static PHB_DYNS Dyns;
  Dyns = 0;

  if ( ! Dyns )
  {
    Dyns = hb_dynsymFind( "EVENTS" );
  }

  hb_vmPushSymbol( Dyns->pSymbol );
  hb_vmPushNil();
  hb_vmPushLong( ( LONG ) hWnd );
  hb_vmPushLong( message );
  hb_vmPushLong( wParam );
  hb_vmPushLong( lParam );
  hb_vmDo( 4 );

  if ( hb_arrayGetType( &hb_stack.Return, 1 ) == HB_IT_NIL )
  {
    return DefWindowProc( ( HWND ) hWnd, message, wParam, lParam );
  }
  else
  {
    return 0;
  }
}

HB_FUNC ( EXITPROCESS )
   {
  ExitProcess(0);
   }
HB_FUNC ( LISTVIEW_GETFIRSTITEM )
   {
  hb_retni ( ListView_GetNextItem( (HWND) hb_parnl( 1 )  , -1 ,LVNI_ALL | LVNI_SELECTED) + 1);
   }

HB_FUNC ( INITGUI )
{

  WNDCLASSEX WndClass;
  HANDLE hInstance = GetModuleHandle( NULL );

  g_hInst = hInstance;

  WndClass.cbSize        = sizeof(WNDCLASSEX);
  WndClass.style         =  CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
  WndClass.lpfnWndProc   = WndProc;
  WndClass.cbClsExtra    = 0;
  WndClass.cbWndExtra    = 0;
  WndClass.hInstance     = g_hInst;
  WndClass.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
  WndClass.hCursor       = LoadCursor(NULL, IDC_ARROW);
  WndClass.hbrBackground = (HBRUSH)( COLOR_BTNFACE + 1 );
  WndClass.lpszMenuName  = NULL;
  WndClass.lpszClassName = g_szClassName;
  WndClass.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

  if(!RegisterClassEx(&WndClass))
  {
  MessageBox(0, "Window Registration Failed!", "Error!",
  MB_ICONEXCLAMATION | MB_OK | MB_SYSTEMMODAL);
  return;
  }

}

HB_FUNC ( INITTOPMOSTFORM )
{

  HWND hwnd;
  int Style;

  Style = WS_MINIMIZEBOX |
    WS_SIZEBOX     |
    WS_CAPTION     |
    WS_MAXIMIZEBOX |
    WS_POPUP       |
    WS_SYSMENU;

  hwnd = CreateWindowEx(WS_EX_TOPMOST , g_szClassName,hb_parc(1),
  Style,
  hb_parni(2),
  hb_parni(3),
  hb_parni(4),
  hb_parni(5),
  NULL,(HMENU)NULL, g_hInst ,NULL);

  if(hwnd == NULL)
  {
  MessageBox(0, "Window Creation Failed!", "Error!",
  MB_ICONEXCLAMATION | MB_OK | MB_SYSTEMMODAL);
  return;
  }

  hb_retnl ((LONG)hwnd);

}

HB_FUNC ( INITFORM )
{

  HWND hwnd;
  int Style;

  Style = WS_MINIMIZEBOX |
    WS_SIZEBOX     |
    WS_CAPTION     |
    WS_MAXIMIZEBOX |
    WS_POPUP       |
    WS_SYSMENU;

  hwnd = CreateWindow(  g_szClassName,hb_parc(1),
  Style,
  hb_parni(2),
  hb_parni(3),
  hb_parni(4),
  hb_parni(5),
  NULL,(HMENU)NULL, g_hInst ,NULL);

  if(hwnd == NULL)
  {
  MessageBox(0, "Window Creation Failed!", "Error!",
  MB_ICONEXCLAMATION | MB_OK | MB_SYSTEMMODAL);
  return;
  }

  hb_retnl ((LONG)hwnd);

}

HB_FUNC ( INITMODALDIALOG )
{

  HWND parent;
  HWND hwnd;
  int Style;

  parent = (HWND) hb_parnl (6);

  Style = WS_CAPTION	|
    WS_SYSMENU ;

  hwnd = CreateWindow( g_szClassName,hb_parc(1),
  Style,
  hb_parni(2),
  hb_parni(3),
  hb_parni(4),
  hb_parni(5),
  parent,(HMENU)NULL, g_hInst ,NULL);

  if(hwnd == NULL)
  {
  MessageBox(0, "Window Creation Failed!", "Error!",
  MB_ICONEXCLAMATION | MB_OK | MB_SYSTEMMODAL);
  return;
  }

  hb_retnl ((LONG)hwnd);

}

HB_FUNC ( ACTIVATEFORM )
{

  HWND hwnd;
  MSG Msg;

  hwnd = (HWND) hb_parnl (1);

  ShowWindow(hwnd, 1);

  while(GetMessage(&Msg,NULL,0,0) )
  {

  if(!IsWindow(GetActiveWindow()) ||
  !IsDialogMessage(GetActiveWindow(),&Msg))
    {
    TranslateMessage(&Msg);
    DispatchMessage(&Msg);
    }
  }
       
  return;

}

HB_FUNC ( CSHOWCONTROL )
{

  HWND hwnd;
  MSG Msg;

  hwnd = (HWND) hb_parnl (1);

  ShowWindow(hwnd, SW_SHOW);

  return ;
}

HB_FUNC (MAXIMIZE)
{
  ShowWindow((HWND) hb_parnl( 1 ), SW_MAXIMIZE);
}

HB_FUNC (MINIMIZE)
{
  ShowWindow((HWND) hb_parnl( 1 ), SW_MINIMIZE);
}

HB_FUNC (RESTORE)
{
  ShowWindow( (HWND) hb_parnl( 1 ),SW_RESTORE);
}

HB_FUNC ( CHIDECONTROL )
{

  HWND hwnd;
  MSG Msg;

  hwnd = (HWND) hb_parnl (1);

  ShowWindow(hwnd, SW_HIDE);

  return ;
}

HB_FUNC( INITBUTTON )
{
  
  HWND hwnd;
  HWND hbutton;

  hwnd = (HWND) hb_parnl (1);
  
  hbutton = CreateWindow( "button" , hb_parc(2) ,
  WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | WS_TABSTOP ,
  hb_parni(4), hb_parni(5) ,hb_parni(6) ,hb_parni(7) ,
  hwnd,(HMENU)hb_parni(3) , GetModuleHandle(NULL) , NULL ) ;

  hb_retnl ( (LONG) hbutton );

}

HB_FUNC( INITLABEL )
{
  
  HWND hwnd;
  HWND hbutton;

  hwnd = (HWND) hb_parnl (1);
  
  hbutton = CreateWindow( "static" , hb_parc(2) ,
  WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON ,
  hb_parni(4), hb_parni(5) , hb_parni(6), 28,
  hwnd,(HMENU)hb_parni(3) , GetModuleHandle(NULL) , NULL ) ;

  hb_retnl ( (LONG) hbutton );

}

HB_FUNC( INITCHECKBOX )
{
  
  HWND hwnd;
  HWND hbutton;

  hwnd = (HWND) hb_parnl (1);
  
  hbutton = CreateWindow( "button" , hb_parc(2) ,
  WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX | WS_TABSTOP ,
  hb_parni(4), hb_parni(5) , 100, 28,
  hwnd,(HMENU)hb_parni(3) , GetModuleHandle(NULL) , NULL ) ;

  hb_retnl ( (LONG) hbutton );

}

HB_FUNC( INITGROUPBOX )
{
  
  HWND hwnd;
  HWND hbutton;

  hwnd = (HWND) hb_parnl (1);
  
  hbutton = CreateWindow( "button" , hb_parc(2) ,
  WS_CHILD | WS_VISIBLE | BS_GROUPBOX ,
  hb_parni(4), hb_parni(5) , hb_parni(6), hb_parni(7),
  hwnd,(HMENU)hb_parni(3) , GetModuleHandle(NULL) , NULL ) ;

  hb_retnl ( (LONG) hbutton );

}

HB_FUNC( INITRADIOGROUP )
{
  
  HWND hwnd;
  HWND hbutton;

  hwnd = (HWND) hb_parnl (1);
  
  hbutton = CreateWindow( "button" , hb_parc(2) ,
  WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON | WS_TABSTOP | WS_GROUP ,
  hb_parni(4), hb_parni(5) , 100, 28,
  hwnd,(HMENU)hb_parni(3) , GetModuleHandle(NULL) , NULL ) ;

  hb_retnl ( (LONG) hbutton );

}

HB_FUNC( INITRADIOBUTTON )
{
  
  HWND hwnd;
  HWND hbutton;

  hwnd = (HWND) hb_parnl (1);
  
  hbutton = CreateWindow( "button" , hb_parc(2) ,
  WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON | WS_TABSTOP ,
  hb_parni(4), hb_parni(5) , 100, 28,
  hwnd,(HMENU)hb_parni(3) , GetModuleHandle(NULL) , NULL ) ;

  hb_retnl ( (LONG) hbutton );

}

HB_FUNC( INITCOMBOBOX )
{
  
  HWND hwnd;
  HWND hbutton;

  hwnd = (HWND) hb_parnl (1);
  
  hbutton = CreateWindow( "COMBOBOX" , "" ,
  WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WS_TABSTOP ,
  hb_parni(3), hb_parni(4) , hb_parni(5), 150 , 
  hwnd,(HMENU)hb_parni(2) , GetModuleHandle(NULL) , NULL ) ;

  hb_retnl ( (LONG) hbutton );

}

HB_FUNC( INITLISTBOX )
{
  
  HWND hwnd;
  HWND hbutton;

  hwnd = (HWND) hb_parnl (1);
  
  hbutton = CreateWindowEx( WS_EX_CLIENTEDGE, "LISTBOX" , "" ,
  WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL | LBS_DISABLENOSCROLL,
  hb_parni(3), hb_parni(4) , hb_parni(5), hb_parni(6) ,  
  hwnd,(HMENU)hb_parni(2) , GetModuleHandle(NULL) , NULL ) ;

  hb_retnl ( (LONG) hbutton );

}

HB_FUNC( INITTEXTBOX )
{
  
  HWND hwnd;
  HWND hbutton;

  hwnd = (HWND) hb_parnl (1);
  
  hbutton = CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT" , "" ,
  WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL,
  hb_parni(3), hb_parni(4) , hb_parni(5) , 25 ,  
  hwnd,(HMENU)hb_parni(2) , GetModuleHandle(NULL) , NULL ) ;

  hb_retnl ( (LONG) hbutton );

}

HB_FUNC( INITEDITBOX )
{
  
  HWND hwnd;
  HWND hbutton;

  hwnd = (HWND) hb_parnl (1);
  
  hbutton = CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT" , "" ,
  ES_WANTRETURN | WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_MULTILINE | WS_VSCROLL | WS_HSCROLL | ES_AUTOHSCROLL,
  hb_parni(3), hb_parni(4) , hb_parni(5), hb_parni(6) ,  
  hwnd,(HMENU)hb_parni(2) , GetModuleHandle(NULL) , NULL ) ;

  hb_retnl ( (LONG) hbutton );

}

HB_FUNC( SETACTIVEWINDOW )
{
  
  HWND hwnd;

  hwnd = (HWND) hb_parnl (1);

  SetActiveWindow (hwnd);

}

HB_FUNC (INITLISTVIEW)
{

  HWND hwnd;
  HWND hbutton;

  hwnd = (HWND) hb_parnl (1);

  hbutton = CreateWindowEx(WS_EX_CLIENTEDGE,"SysListView32","",
  LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_CHILD | WS_TABSTOP | WS_VISIBLE | WS_BORDER | LVS_REPORT,
  hb_parni(3), hb_parni(4) , hb_parni(5), hb_parni(6) ,  
  hwnd,(HMENU)hb_parni(2) , GetModuleHandle(NULL) , NULL ) ;

  ImageList_LoadBitmap(GetModuleHandle(NULL),  0, 16, 1, RGB(255,255,255));
  SendMessage(hbutton,LVM_SETEXTENDEDLISTVIEWSTYLE, 0,LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP );

  hb_retnl ( (LONG) hbutton );

}

//-----------------------------------------------------------------------------
// MsgBox ( cText , cTitle )
//-----------------------------------------------------------------------------
HB_FUNC( MSGBOX )
{
   MessageBox( 0, hb_parc( 1 ), hb_parc( 2 ), MB_SYSTEMMODAL );
}

HB_FUNC( POSTQUITMESSAGE )
{
   PostQuitMessage( hb_parnl( 1 ) );
}

HB_FUNC ( INITLISTVIEWCOLUMNS )
  {

  PHB_ITEM wArray;
  PHB_ITEM hArray;
  char *caption;
  HWND hc;
  LV_COLUMN COL;
  int l9;
  int s;
  int vi;

  hc = (HWND) hb_parnl( 1 ) ;

  l9 = hb_parinfa( 2, 0 ) - 1 ;
  hArray = hb_param( 2, HB_IT_ARRAY );
  wArray = hb_param( 3, HB_IT_ARRAY );

  COL.mask=LVCF_FMT | LVCF_WIDTH | LVCF_TEXT |LVCF_SUBITEM;
  COL.fmt=LVCFMT_LEFT;

  for (s = 0 ; s<=l9 ; s=s+1 )
    {

    caption	= hb_itemGetCPtr ( hArray->item.asArray.value->pItems + s );
    vi = hb_itemGetNI   ( wArray->item.asArray.value->pItems + s );		

    COL.cx=vi;
    COL.pszText=caption;
    COL.iSubItem=s;
    ListView_InsertColumn(hc,s,&COL);

    }

  }

HB_FUNC ( ADDLISTVIEWITEMS )
  {

  PHB_ITEM hArray;
  char *caption;
  LV_ITEM LI;
  HWND h;
  int l;
  int s;
  int c;

  h = (HWND) hb_parnl( 1 ) ;
  l = hb_parinfa( 2, 0 ) - 1 ;
  hArray = hb_param( 2, HB_IT_ARRAY );
  c = ListView_GetItemCount (h);
  caption	= hb_itemGetCPtr ( hArray->item.asArray.value->pItems );

  LI.mask=LVIF_TEXT ;
  LI.state=0;
  LI.stateMask=0;
        LI.iImage=0;
        LI.iSubItem=0;
  LI.iItem=c; 
  LI.pszText=caption;
  ListView_InsertItem(h,&LI);

  for (s = 1 ; s<=l ; s=s+1 )
    {

    caption	= hb_itemGetCPtr ( hArray->item.asArray.value->pItems + s );
    ListView_SetItemText(h,c,s,caption);

    }

} 

HB_FUNC( INITTABCONTROL )
{

  PHB_ITEM hArray;	
  HWND hwnd;
  HWND hbutton;
  TC_ITEM tie; 
  int l;
  int i;

  l = hb_parinfa( 7, 0 ) - 1 ;
  hArray = hb_param( 7, HB_IT_ARRAY );

  hwnd = (HWND) hb_parnl (1);
  
  hbutton = CreateWindow( WC_TABCONTROL , NULL ,
  WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | WS_TABSTOP ,
  hb_parni(3), hb_parni(4) , hb_parni(5), hb_parni(6) ,
  hwnd,(HMENU)hb_parni(2) , GetModuleHandle(NULL) , NULL ) ;

  tie.mask = TCIF_TEXT | TCIF_IMAGE; 
  tie.iImage = -1; 

  for (i = l ; i>=0 ; i=i-1 )
    {
    tie.pszText = hb_itemGetCPtr ( hArray->item.asArray.value->pItems + i );
    TabCtrl_InsertItem(hbutton, 0, &tie); 
    }

  TabCtrl_SetCurSel( hbutton , hb_parni(8) - 1 );

  hb_retnl ( (LONG) hbutton );

}

HB_FUNC (TABCTRL_SETCURSEL)
{

  HWND hwnd;
  int s;

  hwnd = (HWND) hb_parnl (1);

  s = hb_parni (2);

  TabCtrl_SetCurSel( hwnd , s-1 );

}

HB_FUNC (TABCTRL_GETCURSEL)
{

  HWND hwnd;
  hwnd = (HWND) hb_parnl (1);
  hb_retni ( TabCtrl_GetCurSel( hwnd ) + 1 ) ;

}

HB_FUNC (INITIMAGE)
{
  HWND  h;
  HBITMAP hBitmap;
  HWND hwnd;

  hwnd = (HWND) hb_parnl (1);

  h = CreateWindowEx(0,"static",NULL,
  WS_CHILD | WS_VISIBLE | SS_BITMAP ,
  hb_parni(3), hb_parni(4), 0, 0,
  hwnd,(HMENU)hb_parni(2) , GetModuleHandle(NULL) , NULL ) ;

  hBitmap=LoadImage(0,hb_parc(5),IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);

  SendMessage(h,(UINT)STM_SETIMAGE,(WPARAM)IMAGE_BITMAP,(LPARAM)hBitmap);

  hb_retnl ( (LONG) h );

}

HB_FUNC( HIWORD )
{
   hb_retnl( HIWORD( hb_parnl( 1 ) ) );
}
HB_FUNC( LOWORD )
{
   hb_retnl( LOWORD( hb_parnl( 1 ) ) );
}

HB_FUNC ( DESTROYWINDOW )
{
   DestroyWindow( (HWND) hb_parnl( 1 ) );
}
//-----------------------------------------------------------------------------
// MsgInfo ( cText , cTitle )
//-----------------------------------------------------------------------------
HB_FUNC( MSGINFO )
{
   MessageBox( 0, hb_parc(1) , hb_parc(2) , MB_OK | MB_ICONINFORMATION | MB_SYSTEMMODAL);
}
//-----------------------------------------------------------------------------
// MsgStop ( cText , cTitle )
//-----------------------------------------------------------------------------
HB_FUNC( MSGSTOP )
{
   MessageBox( 0 , hb_parc(1) , hb_parc(2) , MB_OK | MB_ICONSTOP | MB_SYSTEMMODAL);
}
//-----------------------------------------------------------------------------
// MsgExclamation ( cText , cTitle )
//-----------------------------------------------------------------------------
HB_FUNC( MSGEXCLAMATION )
{
      MessageBox(0, hb_parc(1), hb_parc(2),
         MB_ICONEXCLAMATION | MB_OK | MB_SYSTEMMODAL);
      return;
}

HB_FUNC( INITMENU )
{

  PHB_ITEM pMenu;
  HMENU hMenu, hSubMenu;
  int i;
  char *caption;
  char *vc;
  int vi ;
  int l2;
  HWND hwnd;

  hwnd = (HWND) hb_parnl (1);

  l2 = hb_parinfa( 2, 0 ) - 1 ;
  pMenu = hb_param( 2, HB_IT_ARRAY );

  hMenu = CreateMenu();

  hSubMenu = CreatePopupMenu();

  for (i = 0 ; i<=l2 ; i=i+1 )
    {

    caption	= hb_itemGetCPtr ( pMenu->item.asArray.value->pItems + i );

    if ( strcmp ( caption , "!" ) == 0 )
      {
                        
      vc = hb_itemGetCPtr ( pMenu->item.asArray.value->pItems + i + 1);
      vi = hb_itemGetNI   ( pMenu->item.asArray.value->pItems + i + 2 );		

        if ( strcmp ( vc , "-" ) == 0 )
        {
        AppendMenu ( hSubMenu ,MF_SEPARATOR , 0 , NULL ) ;
        }
        else
        {
        AppendMenu ( hSubMenu , MF_STRING, vi , vc ) ;
              }

      }

    if ( strcmp ( caption , "#" ) == 0 )
      {
      vc = hb_itemGetCPtr ( pMenu->item.asArray.value->pItems + i + 1);
      AppendMenu(hMenu, MF_STRING | MF_POPUP, (UINT)hSubMenu, vc );

                	hSubMenu = CreatePopupMenu();
      }
    }

  SetMenu(hwnd, hMenu);

}

HB_FUNC (ENABLEWINDOW)
{
  HWND hwnd;
  hwnd = (HWND) hb_parnl (1);
  EnableWindow( hwnd , TRUE );	 
}
HB_FUNC (DISABLEWINDOW)
{
  HWND hwnd;
  hwnd = (HWND) hb_parnl (1);
  EnableWindow( hwnd , FALSE );	
}
HB_FUNC (SETFOREGROUNDWINDOW)
{
  HWND hwnd;
  hwnd = (HWND) hb_parnl (1);
  SetForegroundWindow( hwnd );	
}

HB_FUNC (GETFOREGROUNDWINDOW)
{
  HWND x;

  x = GetForegroundWindow() ;
  hb_retnl ((LONG) x );
}

HB_FUNC (GETNEXTWINDOW)
{

  HWND hwnd;
  HWND x;

  hwnd = (HWND) hb_parnl (1);

  x = GetWindow( hwnd, GW_HWNDNEXT	 );

  hb_retnl ((LONG) x );

}

HB_FUNC ( CHECKDLGBUTTON )
{
  CheckDlgButton(
  (HWND) hb_parnl (2),	// handle of dialog box
  hb_parni(1),	// identifier of control
  BST_CHECKED );	// value to set
}

HB_FUNC ( UNCHECKDLGBUTTON )
{
  CheckDlgButton(
  (HWND) hb_parnl (2),	// handle of dialog box
  hb_parni(1),	// identifier of control
  BST_UNCHECKED );	// value to set
}
//-----------------------------------------------------------------------------*
//ComboAddString ( nControlHwnd , cString )
//-----------------------------------------------------------------------------*
HB_FUNC ( COMBOADDSTRING )
{
   char *cString = hb_parc( 2 );
   SendMessage( (HWND) hb_parnl( 1 ), CB_ADDSTRING, 0, (LPARAM) cString );
}
//-----------------------------------------------------------------------------
// ComboSetCurSel ( hwnd,row )
//-----------------------------------------------------------------------------
HB_FUNC ( COMBOSETCURSEL )
{
   SendMessage( (HWND) hb_parnl( 1 ), CB_SETCURSEL, (WPARAM) hb_parni(2)-1, 0);
}
//-----------------------------------------------------------------------------
// ListBoxAddString ( nControlHwnd , cString )
//-----------------------------------------------------------------------------
HB_FUNC ( LISTBOXADDSTRING )
{
   char *cString = hb_parc( 2 );
   SendMessage( (HWND) hb_parnl( 1 ), LB_ADDSTRING, 0, (LPARAM) cString );
}
//-----------------------------------------------------------------------------
// ListBoxSetCurSel ( nControlID )
//-----------------------------------------------------------------------------
HB_FUNC ( LISTBOXSETCURSEL )
{
   SendMessage( (HWND) hb_parnl( 1 ), LB_SETCURSEL, (WPARAM) hb_parni(2)-1, 0);
}
HB_FUNC ( SETDLGITEMTEXT )
{
    SetDlgItemText(
       (HWND) hb_parnl (3) ,	// handle of dialog box
       hb_parni( 1 ),	        // identifier of control
       (LPCTSTR) hb_parc( 2 ) 	// text to set
    );
}


HB_FUNC (CENTER) 
{
 RECT rect;
 int width, height, xres, yres;
 GetWindowRect((HWND) hb_parnl (1), &rect);
 width  = rect.right  - rect.left;
 height = rect.bottom - rect.top;
 xres = GetSystemMetrics(SM_CXSCREEN);
 yres = GetSystemMetrics(SM_CYSCREEN);
 SetWindowPos((HWND) hb_parnl (1), HWND_TOP, (xres - width) / 2,
 (yres - height) / 2, 0, 0, SWP_NOSIZE);
}

HB_FUNC (LISTVIEW_SETCURSEL) 
{
  ListView_SetItemState((HWND) hb_parnl (1), (WPARAM) hb_parni(2)-1 ,LVIS_FOCUSED | LVIS_SELECTED , LVIS_FOCUSED | LVIS_SELECTED );
}

HB_FUNC ( C_SETFOCUS )
{
   hb_retnl( (LONG) SetFocus( (HWND) hb_parnl( 1 ) ) );
}

HB_FUNC ( GETDLGITEMTEXT )
{
   USHORT iLen = 32768;
   char *cText = (char*) hb_xgrab( iLen+1 );

  GetDlgItemText(
  (HWND) hb_parnl (2),	// handle of dialog box
  hb_parni(1),		// identifier of control
  (LPTSTR) cText,       	// address of buffer for text
  iLen                   	// maximum size of string
  );	

   hb_retc( cText );
   hb_xfree( cText );
}
//-----------------------------------------------------------------------------
// IsDlgButtonChecked ( nTextBoxID )
//-----------------------------------------------------------------------------
HB_FUNC ( ISDLGBUTTONCHECKED )
{
  UINT nRes = IsDlgButtonChecked(
                  (HWND) hb_parnl (2), // handle of dialog box
                   hb_parni( 1 )      // button identifier
              );
  if( nRes == BST_CHECKED )
     hb_retl( TRUE );
  else
     hb_retl( FALSE );
}

//-----------------------------------------------------------------------------
// ComboGetCurSel ( nControlHandle )
//-----------------------------------------------------------------------------
HB_FUNC ( COMBOGETCURSEL )
{
hb_retni ( SendMessage( (HWND) hb_parnl( 1 ) , CB_GETCURSEL , 0 , 0 )  + 1 );
}	

//-----------------------------------------------------------------------------
// ListBoxGetCurSel ( nControlHandle )
//-----------------------------------------------------------------------------
HB_FUNC ( LISTBOXGETCURSEL )
{
hb_retni ( SendMessage( (HWND) hb_parnl( 1 ) , LB_GETCURSEL , 0 , 0 )  + 1 );
}	
//-----------------------------------------------------------------------------
// ComboBoxDeleteString ( hwnd , Index )
//-----------------------------------------------------------------------------
HB_FUNC (COMBOBOXDELETESTRING )
{
   SendMessage( (HWND) hb_parnl( 1 ), CB_DELETESTRING, (WPARAM) hb_parni(2)-1, 0);
}
//-----------------------------------------------------------------------------
// ListBoxDeleteString ( hwnd , Index )
//-----------------------------------------------------------------------------
HB_FUNC ( LISTBOXDELETESTRING )
{
   SendMessage( (HWND) hb_parnl( 1 ), LB_DELETESTRING, (WPARAM) hb_parni(2)-1, 0);
}
//-----------------------------------------------------------------------------
// ListViewDeleteString ( hwnd , Index )
//-----------------------------------------------------------------------------
HB_FUNC ( LISTVIEWDELETESTRING )
{
   SendMessage( (HWND) hb_parnl( 1 ),LVM_DELETEITEM , (WPARAM) hb_parni(2)-1, 0);
}

//-----------------------------------------------------------------------------
// ListBoxReset ( nControlHwnd )
//-----------------------------------------------------------------------------
HB_FUNC ( LISTBOXRESET )
{
   SendMessage( (HWND) hb_parnl( 1 ), LB_RESETCONTENT, 0, 0 );
}

//-----------------------------------------------------------------------------
// ListViewReset ( nControlHwnd )
//-----------------------------------------------------------------------------
HB_FUNC ( LISTVIEWRESET )
{
   SendMessage( (HWND) hb_parnl( 1 ), LVM_DELETEALLITEMS , 0, 0 );
}

//-----------------------------------------------------------------------------
// ComboBoxReset ( nControlHwnd )
//-----------------------------------------------------------------------------
HB_FUNC ( COMBOBOXRESET )
{
   SendMessage( (HWND) hb_parnl( 1 ), CB_RESETCONTENT, 0, 0 );
}

HB_FUNC ( SENDMESSAGE )
{
  hb_retnl( (LONG) SendMessage( (HWND) hb_parnl( 1 ), (UINT) hb_parni( 2 ), (WPARAM) hb_parnl( 3 ), (LPARAM) hb_parnl( 4 ) ) );
}

#pragma ENDDUMP

Prótesis 3D para personas amputadas sin recursos

La impresionante evolución de las impresoras 3D en los últimos años ha permitido que surjan proyectos solidarios, aplicados a la medicina y a la fabricación de prótesis, en los que se puede participar desde el ámbito educativo. Así lo ha expresado en el marco de la Euskal Encounter 23 Carlos Lizarbe de Luis, jefe del departamento de electrónica del IEFPS Don Bosco y responsable de impresión 3D en Ikaslab.

A partir del proyecto “Robohand”, surgido en 2011 en Sudáfrica con el objetivo de crear manos robóticas impresas en tres dimensiones, han ido proliferando programas de cooperación mundial destinados a la misma causa: la fabricación de manos para personas que han sufrido amputaciones por minas antipersona o conflictos armados (“Project Daniel” en Sudán), por accidentes laborales o malformaciones congénitas. Se trata de extremidades que no precisan de equipamiento eléctrico ni electrónico para que los destinatarios sean capaces de repararlas por sí mismos. Hay que tener en cuenta que la mayoría de ellas van a parar a países africanos o latinoamericanos con pocos recursos, por lo que cuanto más simples son, más prácticas resultan.

Lo que hace que este tipo de cooperación sea especialmente exitosa es la capacidad de enviar el diseño de las piezas por correo electrónico, de manera que las prótesis puedan imprimirse de forma inmediata y muy barata, dado el bajo coste del plástico con el que se fabrican. Actualmente, el proyecto e-Nable, en el que se inscribe el propio Lizarbe junto con algunos de sus alumnos, se dedica precisamente a poner en contacto a gente que necesita manos artificiales, con diseñadores de prótesis y personas que disponen de impresoras 3D. En la mayoría de ocasiones, la comunidad de voluntarios que participan en e-Nable y las personas que solicitan su ayuda se encuentran separados por miles de kilómetros de distancia.

El Proyecto Gutenberg 3D, puesto en marcha por el instituto Don Bosco junto con otros tres centros estatales, se enmarca dentro de e-Nable y, además de colaborar en su labor solidaria, pretende “mejorar el aprendizaje de los alumnos” a la vez que se genera una “ilusión por ayudar”. El laboratorio Ikaslab de impresión 3D dirigido por Lizarbe ya ha conseguido fabricar varias prótesis que han cambiado por completo la vida de sus destinatarios al permitirles realizar labores básicas de las que antes eran incapaces tales como agarrar objetos o alimentarse. De un prototipo muy sencillo que funcionaba a base de un sistema de tensores y de un montaje de hilos que permitía cerrar los dedos al girar la muñeca, se ha pasado a implementar modelos más complejos como el de la “flexi-hand”, más elástica y realista, y con un recubrimiento más elaborado. En el último evento organizado por el laboratorio de investigación, se logró crear diez manos protésicas de este tipo en cuatro horas.

Fuente: DiarioTI

Consejos para visualizar datos

Las empresas medianas confían en Big Data y están implementando con mayor frecuencia proyectos vinculados con la visualización de datos. En una reciente encuesta de Competitive Edge, el 80% de los entrevistados estuvo de acuerdo en que hacer un mejor uso de los datos podría ayudarles a mejorar la calidad del producto, descubrir nuevas oportunidades de negocio y acelerar la toma de decisiones. El 90% tenía proyectos de Big Data, ya sea en operación o por iniciar.

BigData

La razón para este interés creciente es simple: visualizar datos es crucial para darle sentido a la enorme cantidad de información que está circulando en las compañías, independiente de su tamaño. Sin embargo, la piedra de tope en este tipo de empresas es el presupuesto, muchas veces limitado y con recursos TI igualmente restringidos, sin analistas de datos entrenados, lo que provoca que ese tipo de negocios se confundan al momento de aprovechar las bondades que ofrece la analítica.

SAS proporciona siete consejos prácticos para que las empresas medianas sepan sobre cómo iniciar y qué hacer para ser exitosos con la implementación de un proyecto de visualización de datos.

Construir el caso de negocio

Vagas promesas relacionadas con la mejora en la calidad de un producto o un mejor servicio al cliente no son suficientes para justificar una inversión en una solución de visualización de datos. Si lo que quiere es tomar decisiones basadas en datos, es necesario conocer exactamente cuáles serán los beneficios de negocio de un mejor análisis de datos, cuál es el valor de ellos para la empresa y cuánto será su costo.

Colaborar y cooperar

La visualización de datos es un área donde no se puede ir solo. La encuesta citada identificó una colaboración exitosa entre la unidad de negocios y la de TI como uno de los factores más importantes del éxito en los proyectos de analítica de datos, y la falta de cooperación entre las dos como la causa más importante de fracaso.

Democratizar sus datos

Las soluciones de visualización de datos se desarrollaron inicialmente como una herramienta de negocio para las compañías de gran escala que pudieran contratar estadísticos y otros científicos de datos capaces de realizar análisis sofisticados. Este modelo es muy costoso, lento y torpe para las empresas medianas, y debe ser evitado a toda costa. Ésta es un área donde tener la tecnología correcta juega un papel muy importante. Las soluciones de visualización de datos que existen ahora no sólo sirven a las necesidades de los expertos, sino que también pueden ser del uso de los no especialistas. En esencia, estas herramientas guían a los gerentes a través de un proceso analítico de autoservicio.

Pedir ayuda

No permita que una falta de talento técnico lo detenga. Si tiene un objetivo de negocio claro, puede involucrar a los consultores sobre una base limitada para obtener la experiencia técnica necesaria para tener una herramienta de visualización de datos funcional, así como un entrenamiento personalizado para la base de usuarios.

No ignorar la necesidad de velocidad

La velocidad de una solución de visualización de datos no es algo que sólo preocupe al departamento de TI. Una velocidad de sistema tiene una serie de  consecuencias de negocio muy prácticas: los gerentes que están tratando de descifrar un problema necesitan un sistema que funcione en tiempo real. Si cada respuesta requiere una hora de cálculo, es muy difícil para los usuarios mantener la continuidad de pensamiento. Los gerentes tienden a ser hombres y mujeres de acción. Un sistema lento simplemente no puede procesar las grandes cantidades de datos disponibles para las compañías medianas. El valor de la visualización de datos es proporcional al número de personas en una organización que puede trabajar directamente con datos, sin ayuda de expertos. La conclusión aquí es que se necesita un sistema robusto, ya que los sistemas lentos hacen imposible la visualización de datos en empresas medianas.

Mirar más allá de los gráficos deslumbrantes

Las buenas observaciones sólo pueden llevarte lejos. Una variedad de generadores de reportes están disponibles y pueden construir gráficos impresionantes e incluso paneles de instrumentos. Mientras que estos productos hacen un buen trabajo de comunicar de forma más efectiva lo que ya se sabe, no pueden decir lo que no se sabe, a menos que estén respaldados por robustas capacidades analíticas. Como mínimo, buscar la capacidad de examinar los datos fácilmente, para crear gráficos de forma automática, y otorgar capacidades de geolocalización.

Hacer uso de la nube

No tiene que invertir necesariamente en un sistema en sitio para obtener los beneficios de la visualización de datos. Las soluciones on-demand ofrecen tiempo rápido para valorar, sin carga en el departamento de TI para instalar y mantener otro sistema. También tienen un impacto financiero positivo ya que disminuye el costo total de implementación a la empresa.

Fuente: DiarioTI