Class: RWin::Menu

Inherits:
Data
  • Object
show all
Defined in:
ext/rwin/rw_resources.c

Direct Known Subclasses

WR::Menu

Instance Method Summary collapse

Instance Method Details

#_hmenuObject



1678
1679
1680
1681
1682
# File 'ext/rwin/rw_resources.c', line 1678

static VALUE
rwmenu_hmenu(VALUE self){
    RwMenu *rm = DATA_PTR(self);
    return ULONG_PTR2NUM((ULONG_PTR)rm->hmenu);
}

#alive?Boolean

Returns:

  • (Boolean)


1684
1685
1686
1687
1688
# File 'ext/rwin/rw_resources.c', line 1684

static VALUE
rwmenu_alive_p(VALUE self){
    RwMenu *rm = DATA_PTR(self);
    return rm->hmenu ? Qtrue : Qfalse;
}

#createmenuObject



1690
1691
1692
1693
1694
1695
1696
# File 'ext/rwin/rw_resources.c', line 1690

static VALUE
rwmenu_createmenu(VALUE self){
    RwMenu *rm = DATA_PTR(self);
    rm->hmenu = CreateMenu();
    Register_rsc(rm->hmenu, self);
    return self;
}

#createpopupObject



1698
1699
1700
1701
1702
1703
1704
# File 'ext/rwin/rw_resources.c', line 1698

static VALUE
rwmenu_createpopup(VALUE self){
    RwMenu *rm = DATA_PTR(self);
    rm->hmenu = CreatePopupMenu();
    Register_rsc(rm->hmenu, self);
    return self;
}

#delete(v_item, v_flag) ⇒ Object



1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
# File 'ext/rwin/rw_resources.c', line 1801

static VALUE
rwmenu_delete(VALUE self, VALUE v_item, VALUE v_flag){
    int r;
    UINT fByPosition;
    RwMenu *rm = DATA_PTR(self);
    RwCheckResource(rm);
    fByPosition = (NIL_P(v_flag) || !v_flag) ? MF_BYCOMMAND : MF_BYPOSITION;
    if(fByPosition){
	HMENU hsubmenu = GetSubMenu(rm->hmenu, NUM2UINT(v_item));
	if(hsubmenu){
	    RwMenu* sm;
	    VALUE v_sm = Get_rsc(hsubmenu);
	    RwMenu_Data_Get_Struct(v_sm, sm);
	    rwmenu_do_destroy(hsubmenu);
	    sm->hmenu = NULL;
	} 
    }
    r = DeleteMenu(rm->hmenu, NUM2UINT(v_item), fByPosition);
    if(rm->hwnd) DrawMenuBar(rm->hwnd);
    return r? Qtrue : Qfalse;
}

#destroyObject



1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
# File 'ext/rwin/rw_resources.c', line 1790

static VALUE
rwmenu_destroy(VALUE self){
    int r;
    RwMenu *rm = DATA_PTR(self);
    RwCheckResource(rm);
    rwmenu_do_destroy(rm->hmenu);
    r = DestroyMenu(rm->hmenu);
    rm->hmenu = NULL;
    return r ? Qtrue : Qfalse;
}

#GetMenuItemCountObject

API Functions



1823
1824
1825
1826
1827
1828
# File 'ext/rwin/rw_resources.c', line 1823

static VALUE
rwmenu_getmenuitemcount(VALUE self){
    RwMenu *rm = DATA_PTR(self);
    RwCheckResource(rm);
    return INT2NUM(GetMenuItemCount(rm->hmenu));
}

#GetMenuItemID(v_idx) ⇒ Object

// Tnis is obsolate on MSC of WIN64 static VALUE rwmenu_getmenustring(VALUE self, VALUE v_item, VALUE v_flag)

int r;
BOOL fByPosition;
TCHAR* buff;
RwMenu *rm = DATA_PTR(self);
RwCheckResource(rm);
fByPosition = (NIL_P(v_flag) || !v_flag) ? MF_BYCOMMAND : MF_BYPOSITION;
r = GetMenuString(rm->hmenu, NUM2INT(v_item), NULL, 0, fByPosition);
if (r==0) return rb_enc_str_new_literal("", rw_external_enc);
buff = alloca(r*sizeof(WCHAR));
GetMenuString(rm->hmenu, NUM2INT(v_item), buff, r*sizeof(TCHAR), fByPosition);
return rw_encode_external(buff);



1880
1881
1882
1883
1884
# File 'ext/rwin/rw_resources.c', line 1880

static VALUE
rwmenu_getmenuitemid(VALUE self, VALUE v_idx){
    RwMenu *rm = DATA_PTR(self);
    return INT2FIX(GetMenuItemID(rm->hmenu, FIX2INT(v_idx)));
}

#GetMenuItemInfo(v_item, v_flag, v_info) ⇒ Object



1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
# File 'ext/rwin/rw_resources.c', line 1830

static VALUE
rwmenu_getmenuiteminfo(VALUE self, VALUE v_item, VALUE v_flag, VALUE v_info){
    int r;
    CStructData *cs; MENUITEMINFO *pmii;
    BOOL fByPosition;
    RwMenu *rm = DATA_PTR(self);
    RwCheckResource(rm);
    if(rb_class_of(v_info)!=ccsMENUITEMINFO){
	rb_raise(rb_eArgError, "Argument must be a MENUITEMINFO");
    }
    CStruct_Data_Get_Struct(v_info, cs); pmii = (MENUITEMINFO*)(cs->dtstr + cs->dtoffset);
    pmii->cbSize = sizeof(MENUITEMINFO);
    fByPosition = (NIL_P(v_flag) || !v_flag) ? MF_BYCOMMAND : MF_BYPOSITION;
    r = GetMenuItemInfo(rm->hmenu, NUM2UINT(v_item), fByPosition, pmii);
    return r ? v_info : Qnil;
}

#GetSubMenu(v_idx) ⇒ Object



1886
1887
1888
1889
1890
1891
1892
# File 'ext/rwin/rw_resources.c', line 1886

static VALUE
rwmenu_getsubmenu(VALUE self, VALUE v_idx){
    HMENU hmenu;
    RwMenu *rm = DATA_PTR(self);
    hmenu = GetSubMenu(rm->hmenu, FIX2INT(v_idx));
    return hmenu ? Get_rsc(hmenu) : Qnil;
}

#insert(*args) ⇒ Object



1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
# File 'ext/rwin/rw_resources.c', line 1706

static VALUE
rwmenu_insert(int argc, VALUE *argv, VALUE self){
    int r;
    VALUE v_next, v_byposition, v_item, v_type, v_idcmd;
    BOOL fByPosition;
    MENUITEMINFO *mii;
    RwMenu *rm = DATA_PTR(self);
    if(argc==3 && rb_class_of(argv[2])==ccsMENUITEMINFO){ /* if MENUITEMINFO */
	CStructData *cs;
	v_next = argv[0];
	v_byposition = argv[1];
	fByPosition = (NIL_P(v_byposition) || !v_byposition) ? FALSE : TRUE;
	CStruct_Data_Get_Struct(argv[2], cs);
	mii = (MENUITEMINFO*)(cs->dtstr + cs->dtoffset);
	r = InsertMenuItem(rm->hmenu, FIX2INT(v_next), fByPosition, mii);
    } else { /* if Array */
	size_t len;
	mii = calloc(sizeof(MENUITEMINFO), 1);
	rb_scan_args(argc, argv, "41", &v_next, &v_byposition, &v_item, &v_idcmd, &v_type);
	mii->cbSize = sizeof(MENUITEMINFO);
	if(rb_typeddata_is_kind_of(v_idcmd, &rwmenu_data_type)){
	    RwMenu* mi;
	    RwMenu_Data_Get_Struct(v_idcmd, mi);
	    RwCheckResource(mi);
	    mii->fMask = MIIM_TYPE | MIIM_SUBMENU;
	    mii->hSubMenu = mi->hmenu;
	} else {
	    mii->fMask = MIIM_TYPE | MIIM_ID;
	    mii->wID = FIX2INT(v_idcmd);
	}
	mii->fType = NIL_P(v_type) ? MFT_STRING : NUM2INT(v_type);
	mii->dwTypeData = rw_str2tchar2(v_item, &len);
	mii->cch = len/sizeof(TCHAR);
	fByPosition = (NIL_P(v_byposition) || !v_byposition) ? FALSE : TRUE;
	r = InsertMenuItem(rm->hmenu, FIX2INT(v_next), fByPosition, mii);
	free(mii);
    }
    if(!r) rb_raise(rb_eRuntimeError, "failed to insert menu");
    if(rm->hwnd) DrawMenuBar(rm->hwnd);
    return self;
}

#SetMenuItemInfo(v_item, v_flag, v_info) ⇒ Object



1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
# File 'ext/rwin/rw_resources.c', line 1847

static VALUE
rwmenu_setmenuiteminfo(VALUE self, VALUE v_item, VALUE v_flag, VALUE v_info){
    CStructData *cs; MENUITEMINFO *pmii;
    BOOL fByPosition;
    RwMenu *rm = DATA_PTR(self);
    RwCheckResource(rm);
    if(rb_class_of(v_info)!=ccsMENUITEMINFO){
	rb_raise(rb_eArgError, "Argument must be a MENUITEMINFO");
    }
    CStruct_Data_Get_Struct(v_info, cs); pmii = (MENUITEMINFO*)(cs->dtstr + cs->dtoffset);
    pmii->cbSize = sizeof(MENUITEMINFO);
    fByPosition = (NIL_P(v_flag) || !v_flag) ? MF_BYCOMMAND : MF_BYPOSITION;
    SetMenuItemInfo(rm->hmenu, NUM2UINT(v_item), fByPosition, pmii);
    if(rm->hwnd) DrawMenuBar(rm->hwnd);
    return self;
}