wrb 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/README +28 -0
- data/Rakefile +66 -0
- data/bin/wrb +41 -0
- data/bin/wrb.bat +6 -0
- data/ext/rwin/aatree.c +192 -0
- data/ext/rwin/aatree.h +55 -0
- data/ext/rwin/extconf.rb +47 -0
- data/ext/rwin/rw_api.c +2058 -0
- data/ext/rwin/rw_devices.c +215 -0
- data/ext/rwin/rw_gdiplus.h +278 -0
- data/ext/rwin/rw_graphics.c +1583 -0
- data/ext/rwin/rw_resources.c +1988 -0
- data/ext/rwin/rw_ubfuncs.c +281 -0
- data/ext/rwin/rw_windows.c +1936 -0
- data/ext/rwin/rwin.c +451 -0
- data/ext/rwin/rwin.h +442 -0
- data/lib/rwin.rb +820 -0
- data/lib/wrb.rb +20 -0
- data/lib/wrb/applications/frmdesigner/angle.cur +0 -0
- data/lib/wrb/applications/frmdesigner/angle2.cur +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Button.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Button.rb +34 -0
- data/lib/wrb/applications/frmdesigner/controls/Checkbox.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Checkbox.rb +10 -0
- data/lib/wrb/applications/frmdesigner/controls/Combobox.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Combobox.rb +88 -0
- data/lib/wrb/applications/frmdesigner/controls/ComboboxEx.rb +97 -0
- data/lib/wrb/applications/frmdesigner/controls/Comboboxex.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/DateTimePicker.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/DateTimePicker.rb +11 -0
- data/lib/wrb/applications/frmdesigner/controls/Edit.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Edit.rb +8 -0
- data/lib/wrb/applications/frmdesigner/controls/Groupbox.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Groupbox.rb +9 -0
- data/lib/wrb/applications/frmdesigner/controls/Hotkeyctrl.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Hotkeyctrl.rb +9 -0
- data/lib/wrb/applications/frmdesigner/controls/Imagelist.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Imagelist.rb +115 -0
- data/lib/wrb/applications/frmdesigner/controls/Listbox.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Listbox.rb +77 -0
- data/lib/wrb/applications/frmdesigner/controls/Listview.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Listview.rb +157 -0
- data/lib/wrb/applications/frmdesigner/controls/Menu.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Menu.rb +198 -0
- data/lib/wrb/applications/frmdesigner/controls/Menubar.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Menubar.rb +9 -0
- data/lib/wrb/applications/frmdesigner/controls/MonthCalender.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Monthcalender.rb +9 -0
- data/lib/wrb/applications/frmdesigner/controls/Panel.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Panel.rb +30 -0
- data/lib/wrb/applications/frmdesigner/controls/Progressbar.rb +10 -0
- data/lib/wrb/applications/frmdesigner/controls/Radiobutton.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Radiobutton.rb +13 -0
- data/lib/wrb/applications/frmdesigner/controls/Rebar.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Rebar.rb +162 -0
- data/lib/wrb/applications/frmdesigner/controls/Splitter.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Splitter.rb +66 -0
- data/lib/wrb/applications/frmdesigner/controls/Static.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Static.rb +9 -0
- data/lib/wrb/applications/frmdesigner/controls/Statusbar.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Statusbar.rb +103 -0
- data/lib/wrb/applications/frmdesigner/controls/Tabctrl.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Tabctrl.rb +136 -0
- data/lib/wrb/applications/frmdesigner/controls/Timer.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Timer.rb +36 -0
- data/lib/wrb/applications/frmdesigner/controls/Toolbar.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Toolbar.rb +165 -0
- data/lib/wrb/applications/frmdesigner/controls/Trackbar.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Trackbar.rb +34 -0
- data/lib/wrb/applications/frmdesigner/controls/Treeview.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Treeview.rb +107 -0
- data/lib/wrb/applications/frmdesigner/controls/Updown.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Updown.rb +31 -0
- data/lib/wrb/applications/frmdesigner/controls/default.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/progressbar.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/unselect.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/fddialogs.rb +87 -0
- data/lib/wrb/applications/frmdesigner/fdesign.rb +1315 -0
- data/lib/wrb/applications/frmdesigner/fdmodules.rb +1394 -0
- data/lib/wrb/applications/frmdesigner/fdparseform.rb +197 -0
- data/lib/wrb/applications/frmdesigner/img13.bmp +0 -0
- data/lib/wrb/base.rb +1294 -0
- data/lib/wrb/combocommon.rb +77 -0
- data/lib/wrb/commctrlconst.rb +139 -0
- data/lib/wrb/commdlg.rb +77 -0
- data/lib/wrb/components/animate.rb +114 -0
- data/lib/wrb/components/bitmap.rb +116 -0
- data/lib/wrb/components/button.rb +134 -0
- data/lib/wrb/components/canvas.rb +266 -0
- data/lib/wrb/components/checkbox.rb +118 -0
- data/lib/wrb/components/choosecolordlg.rb +87 -0
- data/lib/wrb/components/choosefontdlg.rb +142 -0
- data/lib/wrb/components/clipboard.rb +174 -0
- data/lib/wrb/components/combobox.rb +282 -0
- data/lib/wrb/components/comboboxex.rb +574 -0
- data/lib/wrb/components/cursor.rb +91 -0
- data/lib/wrb/components/datetimepicker.rb +197 -0
- data/lib/wrb/components/ddeclient.rb +180 -0
- data/lib/wrb/components/ddeserver.rb +131 -0
- data/lib/wrb/components/dialog.rb +228 -0
- data/lib/wrb/components/edit.rb +412 -0
- data/lib/wrb/components/font.rb +35 -0
- data/lib/wrb/components/form.rb +65 -0
- data/lib/wrb/components/groupbox.rb +122 -0
- data/lib/wrb/components/header.rb +479 -0
- data/lib/wrb/components/hotkeyctrl.rb +72 -0
- data/lib/wrb/components/icon.rb +109 -0
- data/lib/wrb/components/imagelist.rb +396 -0
- data/lib/wrb/components/inifile.rb +97 -0
- data/lib/wrb/components/listbox.rb +149 -0
- data/lib/wrb/components/listview.rb +1467 -0
- data/lib/wrb/components/menu.rb +592 -0
- data/lib/wrb/components/menubar.rb +84 -0
- data/lib/wrb/components/monthcalender.rb +164 -0
- data/lib/wrb/components/openfilenamedlg.rb +147 -0
- data/lib/wrb/components/pager.rb +199 -0
- data/lib/wrb/components/panel.rb +103 -0
- data/lib/wrb/components/picture.rb +55 -0
- data/lib/wrb/components/printdlg.rb +148 -0
- data/lib/wrb/components/printdlgex.rb +117 -0
- data/lib/wrb/components/printer.rb +97 -0
- data/lib/wrb/components/progressbar.rb +140 -0
- data/lib/wrb/components/radiobutton.rb +49 -0
- data/lib/wrb/components/rebar.rb +830 -0
- data/lib/wrb/components/registry.rb +408 -0
- data/lib/wrb/components/richedit.rb +1181 -0
- data/lib/wrb/components/savefilenamedlg.rb +27 -0
- data/lib/wrb/components/scintilla.rb +1298 -0
- data/lib/wrb/components/scrollbar.rb +239 -0
- data/lib/wrb/components/splitter.rb +494 -0
- data/lib/wrb/components/static.rb +198 -0
- data/lib/wrb/components/statusbar.rb +490 -0
- data/lib/wrb/components/tabctrl.rb +686 -0
- data/lib/wrb/components/timer.rb +117 -0
- data/lib/wrb/components/toolbar.rb +1107 -0
- data/lib/wrb/components/tooltip.rb +651 -0
- data/lib/wrb/components/trackbar.rb +298 -0
- data/lib/wrb/components/treeview.rb +845 -0
- data/lib/wrb/components/updown.rb +198 -0
- data/lib/wrb/ddeml.rb +241 -0
- data/lib/wrb/documents/animate.html +46 -0
- data/lib/wrb/documents/bitmap.html +69 -0
- data/lib/wrb/documents/button.html +78 -0
- data/lib/wrb/documents/canvas.html +137 -0
- data/lib/wrb/documents/checkbox.html +77 -0
- data/lib/wrb/documents/choosecolordlg.html +29 -0
- data/lib/wrb/documents/choosefontdlg.html +31 -0
- data/lib/wrb/documents/clipboard.html +31 -0
- data/lib/wrb/documents/combobox.html +117 -0
- data/lib/wrb/documents/comboboxex.html +139 -0
- data/lib/wrb/documents/control.html +53 -0
- data/lib/wrb/documents/cursor.html +45 -0
- data/lib/wrb/documents/datetimepicker.html +70 -0
- data/lib/wrb/documents/ddeclient.html +33 -0
- data/lib/wrb/documents/ddeserver.html +26 -0
- data/lib/wrb/documents/dialog.html +78 -0
- data/lib/wrb/documents/edit.html +169 -0
- data/lib/wrb/documents/empty.html +11 -0
- data/lib/wrb/documents/favicon.png +0 -0
- data/lib/wrb/documents/font.html +38 -0
- data/lib/wrb/documents/form.html +63 -0
- data/lib/wrb/documents/groupbox.html +57 -0
- data/lib/wrb/documents/header.html +85 -0
- data/lib/wrb/documents/hotkeyctrl.html +42 -0
- data/lib/wrb/documents/icon.html +45 -0
- data/lib/wrb/documents/imagelist.html +101 -0
- data/lib/wrb/documents/images/button.png +0 -0
- data/lib/wrb/documents/images/checkbox.png +0 -0
- data/lib/wrb/documents/images/combobox.png +0 -0
- data/lib/wrb/documents/images/comboboxex.png +0 -0
- data/lib/wrb/documents/images/datetimepicker.png +0 -0
- data/lib/wrb/documents/images/edit.png +0 -0
- data/lib/wrb/documents/images/groupbox.png +0 -0
- data/lib/wrb/documents/images/hotkeyctrl.png +0 -0
- data/lib/wrb/documents/images/listbox.png +0 -0
- data/lib/wrb/documents/images/listview.png +0 -0
- data/lib/wrb/documents/images/menu.png +0 -0
- data/lib/wrb/documents/images/menubar.png +0 -0
- data/lib/wrb/documents/images/monthcalender.png +0 -0
- data/lib/wrb/documents/images/progressbar.png +0 -0
- data/lib/wrb/documents/images/radiobutton.png +0 -0
- data/lib/wrb/documents/images/rebar.png +0 -0
- data/lib/wrb/documents/images/richedit.png +0 -0
- data/lib/wrb/documents/images/splitter.png +0 -0
- data/lib/wrb/documents/images/static.png +0 -0
- data/lib/wrb/documents/images/statusbar.png +0 -0
- data/lib/wrb/documents/images/tabctrl.png +0 -0
- data/lib/wrb/documents/images/toolbar.png +0 -0
- data/lib/wrb/documents/images/tooltip.png +0 -0
- data/lib/wrb/documents/images/trackbar.png +0 -0
- data/lib/wrb/documents/images/treeview.png +0 -0
- data/lib/wrb/documents/images/updown.png +0 -0
- data/lib/wrb/documents/index.html +155 -0
- data/lib/wrb/documents/inifile.html +36 -0
- data/lib/wrb/documents/license.txt +22 -0
- data/lib/wrb/documents/listbox.html +96 -0
- data/lib/wrb/documents/listview.html +277 -0
- data/lib/wrb/documents/make_doc.rb +596 -0
- data/lib/wrb/documents/menu.html +144 -0
- data/lib/wrb/documents/menubar.html +54 -0
- data/lib/wrb/documents/monthcalender.html +48 -0
- data/lib/wrb/documents/openfilenamedlg.html +36 -0
- data/lib/wrb/documents/pager.html +63 -0
- data/lib/wrb/documents/panel.html +32 -0
- data/lib/wrb/documents/picture.html +48 -0
- data/lib/wrb/documents/printdlg.html +35 -0
- data/lib/wrb/documents/printdlgex.html +35 -0
- data/lib/wrb/documents/printer.html +40 -0
- data/lib/wrb/documents/progressbar.html +69 -0
- data/lib/wrb/documents/radiobutton.html +51 -0
- data/lib/wrb/documents/rebar.html +143 -0
- data/lib/wrb/documents/registry.html +36 -0
- data/lib/wrb/documents/richedit.html +232 -0
- data/lib/wrb/documents/samples/editimg.bmp +0 -0
- data/lib/wrb/documents/samples/editimg.iml +0 -0
- data/lib/wrb/documents/samples/fileimg.bmp +0 -0
- data/lib/wrb/documents/samples/fileimg.iml +0 -0
- data/lib/wrb/documents/samples/sample_button.rb +21 -0
- data/lib/wrb/documents/samples/sample_checkbox.rb +18 -0
- data/lib/wrb/documents/samples/sample_combobox.rb +18 -0
- data/lib/wrb/documents/samples/sample_comboboxex.rb +23 -0
- data/lib/wrb/documents/samples/sample_datetimepicker.rb +11 -0
- data/lib/wrb/documents/samples/sample_edit.rb +25 -0
- data/lib/wrb/documents/samples/sample_groupbox.rb +19 -0
- data/lib/wrb/documents/samples/sample_hotkeyctrl.rb +12 -0
- data/lib/wrb/documents/samples/sample_listbox.rb +12 -0
- data/lib/wrb/documents/samples/sample_listview.rb +32 -0
- data/lib/wrb/documents/samples/sample_menu.rb +21 -0
- data/lib/wrb/documents/samples/sample_menubar.rb +23 -0
- data/lib/wrb/documents/samples/sample_monthcalender.rb +11 -0
- data/lib/wrb/documents/samples/sample_progressbar.rb +14 -0
- data/lib/wrb/documents/samples/sample_radiobutton.rb +14 -0
- data/lib/wrb/documents/samples/sample_rebar.rb +25 -0
- data/lib/wrb/documents/samples/sample_richedit.rb +60 -0
- data/lib/wrb/documents/samples/sample_splitter.rb +33 -0
- data/lib/wrb/documents/samples/sample_static.rb +15 -0
- data/lib/wrb/documents/samples/sample_statusbar.rb +17 -0
- data/lib/wrb/documents/samples/sample_tabctrl.rb +19 -0
- data/lib/wrb/documents/samples/sample_toolbar.rb +29 -0
- data/lib/wrb/documents/samples/sample_tooltip.rb +50 -0
- data/lib/wrb/documents/samples/sample_trackbar.rb +30 -0
- data/lib/wrb/documents/samples/sample_treeview.rb +19 -0
- data/lib/wrb/documents/samples/sample_updown.rb +18 -0
- data/lib/wrb/documents/samples/sampleimg16.iml +0 -0
- data/lib/wrb/documents/samples/sampleimg32.iml +0 -0
- data/lib/wrb/documents/samples/samplemg16.png +0 -0
- data/lib/wrb/documents/samples/samplemg32.png +0 -0
- data/lib/wrb/documents/samples/wrb.ico +0 -0
- data/lib/wrb/documents/savefilenamedlg.html +19 -0
- data/lib/wrb/documents/scrollbar.html +60 -0
- data/lib/wrb/documents/splitter.html +96 -0
- data/lib/wrb/documents/static.html +84 -0
- data/lib/wrb/documents/statusbar.html +110 -0
- data/lib/wrb/documents/tabctrl.html +151 -0
- data/lib/wrb/documents/timer.html +43 -0
- data/lib/wrb/documents/toolbar.html +181 -0
- data/lib/wrb/documents/tooltip.html +131 -0
- data/lib/wrb/documents/trackbar.html +107 -0
- data/lib/wrb/documents/treeview.html +210 -0
- data/lib/wrb/documents/updown.html +85 -0
- data/lib/wrb/documents/wincontrol.html +258 -0
- data/lib/wrb/documents/window.html +499 -0
- data/lib/wrb/documents/wrb.css +228 -0
- data/lib/wrb/gmem.rb +26 -0
- data/lib/wrb/imecommon.rb +59 -0
- data/lib/wrb/listcommon.rb +185 -0
- data/lib/wrb/lzss.rb +126 -0
- data/lib/wrb/scrollinfo.rb +142 -0
- data/lib/wrb/toplevelcommon.rb +634 -0
- metadata +315 -0
|
@@ -0,0 +1,1988 @@
|
|
|
1
|
+
/*
|
|
2
|
+
# Project WRB was forked from Project VisualuRuby(temp-name).
|
|
3
|
+
# Author of this project: BANJO Koyu <banjokoyu at gmail.com>
|
|
4
|
+
# The URL of this project: https://bitbucket.org/wrb/
|
|
5
|
+
#
|
|
6
|
+
# This is a ext-library part of WRB.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
#include "rwin.h"
|
|
10
|
+
|
|
11
|
+
/* from https://msdn.microsoft.com/en-us/library/ms997538.aspx */
|
|
12
|
+
typedef struct
|
|
13
|
+
{
|
|
14
|
+
WORD idReserved; // Reserved (must be 0)
|
|
15
|
+
WORD idType; // Resource Type (1 for icons)
|
|
16
|
+
WORD idCount; // How many images?
|
|
17
|
+
} ICONDIR;
|
|
18
|
+
|
|
19
|
+
typedef struct
|
|
20
|
+
{
|
|
21
|
+
BYTE bWidth; // Width, in pixels, of the image
|
|
22
|
+
BYTE bHeight; // Height, in pixels, of the image
|
|
23
|
+
BYTE bColorCount; // Number of colors in image (0 if >=8bpp)
|
|
24
|
+
BYTE bReserved; // Reserved ( must be 0)
|
|
25
|
+
WORD wPlanes; // Color Planes
|
|
26
|
+
WORD wBitCount; // Bits per pixel
|
|
27
|
+
DWORD dwBytesInRes; // How many bytes in this resource?
|
|
28
|
+
DWORD dwImageOffset; // Where in the file is this image?
|
|
29
|
+
} ICONDIRENTRY;
|
|
30
|
+
|
|
31
|
+
/* Bitmap */
|
|
32
|
+
|
|
33
|
+
VALUE cRwBitmap;
|
|
34
|
+
|
|
35
|
+
void
|
|
36
|
+
rwbitmap_free(void* ptr){
|
|
37
|
+
RwBitmap* rb = ptr;
|
|
38
|
+
DeleteDC(rb->hdc);
|
|
39
|
+
DeleteObject(rb->hddbitmap);
|
|
40
|
+
if(!rb->shared) DeleteObject(rb->hbitmap);
|
|
41
|
+
free(rb);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
static size_t
|
|
45
|
+
rwbitmap_memsize(const void *ptr){
|
|
46
|
+
return ptr ? sizeof(RwBitmap) : 0;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const rb_data_type_t
|
|
50
|
+
rwbitmap_data_type = {
|
|
51
|
+
"Bitmap", {NULL, rwbitmap_free, rwbitmap_memsize}, NULL, NULL
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
static VALUE
|
|
55
|
+
alloc_rwbitmap(VALUE klass){
|
|
56
|
+
RwBitmap* rb;
|
|
57
|
+
VALUE robj = RwBitmap_Data_Make_Struct(klass, rb);
|
|
58
|
+
rb->type = RcBitmap;
|
|
59
|
+
rb->hbitmap = 0;
|
|
60
|
+
rb->hddbitmap = 0;
|
|
61
|
+
rb->hdc = 0;
|
|
62
|
+
rb->shared = FALSE;
|
|
63
|
+
return robj;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
static void
|
|
67
|
+
rw_setbihdr(BITMAPINFOHEADER *bih, int w, int h, int planes, int bitcount, size_t szimage){
|
|
68
|
+
bih->biSize = sizeof(BITMAPINFOHEADER);
|
|
69
|
+
bih->biWidth = w;
|
|
70
|
+
bih->biHeight = h;
|
|
71
|
+
bih->biPlanes = planes;
|
|
72
|
+
bih->biBitCount = bitcount;
|
|
73
|
+
bih->biCompression = BI_RGB; /* 0L */
|
|
74
|
+
bih->biSizeImage = szimage;
|
|
75
|
+
bih->biXPelsPerMeter = 0; /* not used */
|
|
76
|
+
bih->biYPelsPerMeter = 0; /* not used */
|
|
77
|
+
bih->biClrUsed = 0;
|
|
78
|
+
bih->biClrImportant = 0;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
HBITMAP
|
|
82
|
+
rw_dib2ddb(RwBitmap *rb){
|
|
83
|
+
BITMAP bmp;
|
|
84
|
+
BITMAPINFO *pbi;
|
|
85
|
+
void *dibdata;
|
|
86
|
+
size_t bisize = sizeof(BITMAPINFO);
|
|
87
|
+
|
|
88
|
+
if(rb->hddbitmap) DeleteObject(rb->hddbitmap);
|
|
89
|
+
GetObject(rb->hbitmap, sizeof(BITMAP), &bmp);
|
|
90
|
+
switch(bmp.bmBitsPixel){
|
|
91
|
+
case 1:
|
|
92
|
+
case 4:
|
|
93
|
+
case 8:
|
|
94
|
+
bisize += (2<<(bmp.bmBitsPixel-1))*4;
|
|
95
|
+
}
|
|
96
|
+
RW_MALLOC(pbi, bisize);
|
|
97
|
+
rw_setbihdr((BITMAPINFOHEADER*)pbi, bmp.bmWidth, bmp.bmHeight, 1, bmp.bmBitsPixel, 0);
|
|
98
|
+
GetDIBits(rb->hdc, rb->hbitmap, 0, bmp.bmHeight, NULL, pbi, DIB_RGB_COLORS);
|
|
99
|
+
RW_MALLOC(dibdata, pbi->bmiHeader.biSizeImage);
|
|
100
|
+
GetDIBits(rb->hdc, rb->hbitmap, 0, bmp.bmHeight, dibdata, pbi, DIB_RGB_COLORS);
|
|
101
|
+
rb->hddbitmap = CreateDIBitmap(rb->hdc, &pbi->bmiHeader, CBM_INIT, dibdata,
|
|
102
|
+
pbi, DIB_RGB_COLORS);
|
|
103
|
+
free(pbi);
|
|
104
|
+
free(dibdata);
|
|
105
|
+
return rb->hddbitmap;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
void
|
|
109
|
+
rw_bitmap_set_dc(RwBitmap *rb, int w, int h){
|
|
110
|
+
HDC hdctmp = GetDC(NULL);
|
|
111
|
+
rb->hbitmap = CreateCompatibleBitmap(hdctmp, w, h);
|
|
112
|
+
rb->hdc = CreateCompatibleDC(hdctmp);
|
|
113
|
+
SelectObject(rb->hdc, rb->hbitmap);
|
|
114
|
+
ReleaseDC(NULL, hdctmp);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
static VALUE
|
|
118
|
+
rwbitmap_initialize(int argc, VALUE *argv, VALUE self){
|
|
119
|
+
VALUE v_w, v_h, v_color;
|
|
120
|
+
int w, h;
|
|
121
|
+
RwBitmap *rb = DATA_PTR(self);
|
|
122
|
+
rb_scan_args(argc, argv, "21", &v_w, &v_h, &v_color);
|
|
123
|
+
w = FIX2INT(v_w); h = FIX2INT(v_h);
|
|
124
|
+
rw_bitmap_set_dc(rb, w, h);
|
|
125
|
+
if(!NIL_P(v_color)){
|
|
126
|
+
RECT rect;
|
|
127
|
+
COLORREF prevcolor = SetDCBrushColor(rb->hdc, FIX2INT(v_color));
|
|
128
|
+
rect.left = -1; rect.top = -1; rect.right = w + 1; rect.bottom = h + 1;
|
|
129
|
+
FillRect(rb->hdc, &rect, GetStockObject(DC_BRUSH));
|
|
130
|
+
SetDCBrushColor(rb->hdc, prevcolor);
|
|
131
|
+
}
|
|
132
|
+
Register_rsc(rb->hbitmap, self);
|
|
133
|
+
return self;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
static VALUE
|
|
137
|
+
rwbitmap1_fromfile(VALUE klass, VALUE fname){
|
|
138
|
+
char abspath[RW_MAXPATH];
|
|
139
|
+
RwBitmap* rb;
|
|
140
|
+
VALUE robj = RwBitmap_Data_Make_Struct(klass, rb);
|
|
141
|
+
rwconv2absolute_path(abspath, RSTRING_PTR(fname));
|
|
142
|
+
rb->hbitmap = LoadImageA(NULL, abspath, IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE);
|
|
143
|
+
if(!rb->hbitmap){
|
|
144
|
+
char pwd[256];
|
|
145
|
+
getcwd(pwd, sizeof(pwd));
|
|
146
|
+
rb_raise(rb_eRuntimeError, "Bitmap load failed(%s), err=%d, pwd=%s.",
|
|
147
|
+
abspath, (int)GetLastError(), pwd);
|
|
148
|
+
}
|
|
149
|
+
rb->shared = FALSE;
|
|
150
|
+
rb->type = RcBitmap;
|
|
151
|
+
rb->hdc = CreateCompatibleDC(NULL);
|
|
152
|
+
SelectObject(rb->hdc, rb->hbitmap);
|
|
153
|
+
|
|
154
|
+
Register_rsc(rb->hbitmap, robj);
|
|
155
|
+
return robj;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
static VALUE
|
|
159
|
+
rwbitmap1_fromhandle_core(VALUE klass, HBITMAP hbitmap){
|
|
160
|
+
VALUE robj;
|
|
161
|
+
RwBitmap* rb;
|
|
162
|
+
HDC hdc = CreateCompatibleDC(NULL);
|
|
163
|
+
if (!SelectObject(hdc, hbitmap)) rb_raise(rb_eRuntimeError, "Bitmap create failed.");
|
|
164
|
+
robj = RwBitmap_Data_Make_Struct(klass, rb);
|
|
165
|
+
rb->hbitmap = hbitmap;
|
|
166
|
+
rb->hdc = hdc;
|
|
167
|
+
Register_rsc(rb->hbitmap, robj);
|
|
168
|
+
return robj;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
static VALUE
|
|
172
|
+
rwbitmap1_fromhandle(VALUE klass, VALUE v_hbitmap){
|
|
173
|
+
VALUE robj = Get_rsc(NUM2INT(v_hbitmap));
|
|
174
|
+
if (robj) return robj;
|
|
175
|
+
return rwbitmap1_fromhandle_core(klass, (HANDLE)NUM2ULONG_PTR(v_hbitmap));
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
static VALUE
|
|
179
|
+
rwbitmap1_monochrome(VALUE klass, VALUE v_w, VALUE v_h){
|
|
180
|
+
RwBitmap* rb;
|
|
181
|
+
VALUE robj = RwBitmap_Data_Make_Struct(klass, rb);
|
|
182
|
+
rb->hbitmap = CreateBitmap(FIX2INT(v_w), FIX2INT(v_h), 1, 1, NULL);
|
|
183
|
+
rb->hdc = CreateCompatibleDC(NULL);
|
|
184
|
+
SelectObject(rb->hdc, rb->hbitmap);
|
|
185
|
+
Register_rsc(rb->hbitmap, robj);
|
|
186
|
+
return robj;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
static VALUE
|
|
190
|
+
rwbitmap_hbitmap(VALUE self){
|
|
191
|
+
RwBitmap *rb = DATA_PTR(self);
|
|
192
|
+
return ULONG_PTR2NUM((ULONG_PTR)rb->hbitmap);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
static VALUE
|
|
196
|
+
rwbitmap_hddbitmap(VALUE self){
|
|
197
|
+
RwBitmap *rb = DATA_PTR(self);
|
|
198
|
+
if(!rb->hddbitmap) rw_dib2ddb(rb);
|
|
199
|
+
return ULONG_PTR2NUM((ULONG_PTR)rb->hddbitmap);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
static VALUE
|
|
204
|
+
rwbitmap_hdc(VALUE self){
|
|
205
|
+
RwBitmap *rb = DATA_PTR(self);
|
|
206
|
+
return ULONG_PTR2NUM((ULONG_PTR)rb->hdc);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
static VALUE
|
|
210
|
+
rwbitmap_width(VALUE self){
|
|
211
|
+
BITMAP bmp;
|
|
212
|
+
RwBitmap *rb = DATA_PTR(self);
|
|
213
|
+
GetObject(rb->hbitmap, sizeof(BITMAP), &bmp);
|
|
214
|
+
return INT2FIX(bmp.bmWidth);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
static VALUE
|
|
218
|
+
rwbitmap_height(VALUE self){
|
|
219
|
+
BITMAP bmp;
|
|
220
|
+
RwBitmap *rb = DATA_PTR(self);
|
|
221
|
+
GetObject(rb->hbitmap, sizeof(BITMAP), &bmp);
|
|
222
|
+
return INT2FIX(bmp.bmHeight);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
static VALUE
|
|
226
|
+
rwbitmap_draw(int argc, VALUE *argv, VALUE self){
|
|
227
|
+
VALUE klass, obj;
|
|
228
|
+
RwCanvas *cv;
|
|
229
|
+
RwBitmap *rb = DATA_PTR(self);
|
|
230
|
+
rb_scan_args(argc, argv, "01", &klass);
|
|
231
|
+
if(!rb_block_given_p()) rb_raise(rb_eArgError, "Need block");
|
|
232
|
+
if (NIL_P(klass)) klass = cRwCanvas;
|
|
233
|
+
obj = RwCanvas_Data_Make_Struct(klass, cv);
|
|
234
|
+
cv->hdc = rb->hdc;
|
|
235
|
+
rb_yield(obj);
|
|
236
|
+
return self;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
static VALUE
|
|
240
|
+
rwbitmap_dispose(VALUE self){
|
|
241
|
+
RwBitmap *rb = DATA_PTR(self);
|
|
242
|
+
DeleteDC(rb->hdc);
|
|
243
|
+
if (rb->hbitmap) {
|
|
244
|
+
if(!rb->shared) DeleteObject(rb->hbitmap);
|
|
245
|
+
rb->hbitmap = NULL;
|
|
246
|
+
return Qtrue;
|
|
247
|
+
}
|
|
248
|
+
return Qnil;
|
|
249
|
+
}
|
|
250
|
+
/* moved to wrb/components/Bitmap.rb
|
|
251
|
+
static VALUE
|
|
252
|
+
rwbitmap_create_mask(VALUE self, VALUE v_mskclr){
|
|
253
|
+
COLORREF oldbkclr;
|
|
254
|
+
int w, h;
|
|
255
|
+
VALUE robj;
|
|
256
|
+
BITMAP bmp;
|
|
257
|
+
RwBitmap *rmsk;
|
|
258
|
+
RwBitmap *rb = DATA_PTR(self);
|
|
259
|
+
GetObject(rb->hbitmap, sizeof(BITMAP), &bmp);
|
|
260
|
+
w = bmp.bmWidth; h = bmp.bmHeight;
|
|
261
|
+
robj = RwBitmap_Data_Make_Struct(CLASS_OF(self), rmsk);
|
|
262
|
+
oldbkclr = SetBkColor(rb->hdc, NUM2INT(v_mskclr));
|
|
263
|
+
rmsk->hdc = CreateCompatibleDC(NULL);
|
|
264
|
+
rmsk->hbitmap = CreateBitmap(w, h, 1, 1, NULL);
|
|
265
|
+
SelectObject(rmsk->hdc, rmsk->hbitmap);
|
|
266
|
+
BitBlt(rmsk->hdc, 0, 0, w, h, rb->hdc, 0, 0, NOTSRCCOPY);
|
|
267
|
+
SetBkColor(rb->hdc, oldbkclr);
|
|
268
|
+
Register_rsc(rmsk->hbitmap, robj);
|
|
269
|
+
return robj;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
static VALUE
|
|
273
|
+
rwbitmap_create_maskimage(VALUE self, VALUE v_mskclr){
|
|
274
|
+
COLORREF oldbkclr;
|
|
275
|
+
int w, h;
|
|
276
|
+
VALUE robj;
|
|
277
|
+
BITMAP bmp;
|
|
278
|
+
HBITMAP hbmptmp;
|
|
279
|
+
HDC hdctmp;
|
|
280
|
+
RwBitmap *rmsk;
|
|
281
|
+
RwBitmap *rb = DATA_PTR(self);
|
|
282
|
+
GetObject(rb->hbitmap, sizeof(BITMAP), &bmp);
|
|
283
|
+
w = bmp.bmWidth; h = bmp.bmHeight;
|
|
284
|
+
robj = RwBitmap_Data_Make_Struct(CLASS_OF(self), rmsk);
|
|
285
|
+
oldbkclr = SetBkColor(rb->hdc, NUM2INT(v_mskclr));
|
|
286
|
+
hdctmp = CreateCompatibleDC(NULL);
|
|
287
|
+
hbmptmp = CreateBitmap(w, h, 1, 1, NULL);
|
|
288
|
+
SelectObject(hdctmp, hbmptmp);
|
|
289
|
+
BitBlt(hdctmp, 0, 0, w, h, rb->hdc, 0, 0, SRCCOPY);
|
|
290
|
+
SetBkColor(rb->hdc, oldbkclr);
|
|
291
|
+
|
|
292
|
+
rw_bitmap_set_dc(rmsk, w, h);
|
|
293
|
+
SelectObject(rmsk->hdc, rmsk->hbitmap);
|
|
294
|
+
BitBlt(rmsk->hdc, 0, 0, w, h, hdctmp, 0, 0, SRCCOPY);
|
|
295
|
+
DeleteObject(hbmptmp);
|
|
296
|
+
ReleaseDC(NULL, hdctmp);
|
|
297
|
+
Register_rsc(rmsk->hbitmap, robj);
|
|
298
|
+
return robj;
|
|
299
|
+
}
|
|
300
|
+
*/
|
|
301
|
+
|
|
302
|
+
static VALUE
|
|
303
|
+
rwbitmap_getpixel(VALUE self, VALUE v_x, VALUE v_y){
|
|
304
|
+
RwBitmap *rb = DATA_PTR(self);
|
|
305
|
+
return UINT2NUM(GetPixel(rb->hdc, FIX2INT(v_x), FIX2INT(v_y)));
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
static VALUE
|
|
309
|
+
rwbitmap_setpixel(VALUE self, VALUE v_x, VALUE v_y, VALUE v_clr){
|
|
310
|
+
RwBitmap *rb = DATA_PTR(self);
|
|
311
|
+
return UINT2NUM(SetPixel(rb->hdc, FIX2INT(v_x), FIX2INT(v_y), (COLORREF)FIX2INT(v_clr)));
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
static VALUE
|
|
315
|
+
rwbitmap_getdepth(VALUE self){
|
|
316
|
+
BITMAP bmp;
|
|
317
|
+
RwBitmap *rb = DATA_PTR(self);
|
|
318
|
+
GetObject(rb->hbitmap,sizeof(BITMAP), &bmp);
|
|
319
|
+
return INT2FIX(bmp.bmBitsPixel);
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
static VALUE
|
|
323
|
+
rwbitmap1__load(VALUE klass, VALUE str){
|
|
324
|
+
RwBitmap* rb;
|
|
325
|
+
VALUE robj;
|
|
326
|
+
BITMAPINFO *bi;
|
|
327
|
+
int biw, bih;
|
|
328
|
+
char *ptr = RSTRING_PTR(str);
|
|
329
|
+
char *bits;
|
|
330
|
+
BITMAPFILEHEADER *bf = (BITMAPFILEHEADER*)ptr;
|
|
331
|
+
if(bf->bfType!=0x4d42) rb_raise(rb_eArgError, "Not a bitmap file");
|
|
332
|
+
bi = (BITMAPINFO*)(ptr + sizeof(BITMAPFILEHEADER));
|
|
333
|
+
bits = ptr + bf->bfOffBits;
|
|
334
|
+
biw = bi->bmiHeader.biWidth;
|
|
335
|
+
bih = bi->bmiHeader.biHeight;
|
|
336
|
+
|
|
337
|
+
robj = RwBitmap_Data_Make_Struct(klass, rb);
|
|
338
|
+
rb->type = RcBitmap;
|
|
339
|
+
rw_bitmap_set_dc(rb, biw, bih);
|
|
340
|
+
SetDIBitsToDevice(rb->hdc, 0, 0, biw, bih, 0, 0, 0, bih, bits, bi, DIB_RGB_COLORS);
|
|
341
|
+
Register_rsc(rb->hbitmap, robj);
|
|
342
|
+
return robj;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
static size_t
|
|
346
|
+
rwbitmap__dump_core(VALUE self, LPVOID lpbmpdata, int cdpth, size_t szimage, int cctbl){
|
|
347
|
+
LPVOID lpvBits;
|
|
348
|
+
BITMAP bmp;
|
|
349
|
+
RwBitmap *rb = DATA_PTR(self);
|
|
350
|
+
|
|
351
|
+
GetObject(rb->hbitmap, sizeof(BITMAP), &bmp);
|
|
352
|
+
if(!lpbmpdata){
|
|
353
|
+
BITMAPINFO *bi = alloca(sizeof(BITMAPINFOHEADER)+1024);
|
|
354
|
+
rw_setbihdr((BITMAPINFOHEADER*)bi, bmp.bmWidth, bmp.bmHeight, 1, cdpth, szimage);
|
|
355
|
+
GetDIBits(rb->hdc, rb->hbitmap, 0, bmp.bmHeight, NULL, bi, DIB_RGB_COLORS);
|
|
356
|
+
return bi->bmiHeader.biSizeImage;
|
|
357
|
+
} else {
|
|
358
|
+
BITMAPINFO *bi = (BITMAPINFO*)((char*)lpbmpdata + sizeof(BITMAPFILEHEADER));
|
|
359
|
+
BITMAPFILEHEADER *bmifilehdr = (BITMAPFILEHEADER *)lpbmpdata;
|
|
360
|
+
bmifilehdr->bfType = 0x4d42; /* "BM" */
|
|
361
|
+
bmifilehdr->bfSize = szimage + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
|
|
362
|
+
bmifilehdr->bfReserved1 = 0;
|
|
363
|
+
bmifilehdr->bfReserved2 = 0;
|
|
364
|
+
bmifilehdr->bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + cctbl;
|
|
365
|
+
|
|
366
|
+
rw_setbihdr((BITMAPINFOHEADER*)bi, bmp.bmWidth, bmp.bmHeight, 1, cdpth, szimage);
|
|
367
|
+
lpvBits = (char*)lpbmpdata + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + cctbl;
|
|
368
|
+
return GetDIBits(rb->hdc, rb->hbitmap, 0, bmp.bmHeight, lpvBits, bi, DIB_RGB_COLORS);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
// fprintf(stderr, "cdpth=%d, biSize=%d, biWidth=%d, biPlanes=%d, biBitCount=%d, biCompression=%d, biSizeImage=%d, biXPelsPerMeter=%d, biYPelsPerMeter=%d, biClrUsed=%d, biClrImportant=%d\n", cdpth, bi.bmiHeader.biSize, bi.bmiHeader.biWidth, bi.bmiHeader.biPlanes, bi.bmiHeader.biBitCount, bi.bmiHeader.biCompression, bi.bmiHeader.biSizeImage, bi.bmiHeader.biXPelsPerMeter, bi.bmiHeader.biYPelsPerMeter, bi.bmiHeader.biClrUsed, bi.bmiHeader.biClrImportant);
|
|
373
|
+
|
|
374
|
+
static int
|
|
375
|
+
rw_get_colortable_len(int clrdpth){
|
|
376
|
+
switch(clrdpth){
|
|
377
|
+
case 1: case 4: case 8:
|
|
378
|
+
return 4 * (2 << (clrdpth-1));
|
|
379
|
+
case 16: case 24: case 32:
|
|
380
|
+
return 0;
|
|
381
|
+
default:
|
|
382
|
+
rb_raise(rb_eArgError, "Color depth must be 1, 4, 8, 16, 24 or 32, but got %d.", clrdpth);
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
static VALUE
|
|
387
|
+
rwbitmap__dump(int argc, VALUE* argv, VALUE self){
|
|
388
|
+
LPVOID lpbmpdata = NULL;
|
|
389
|
+
int offsetbits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
|
|
390
|
+
int cdpth = argc>0 ? FIX2INT(argv[0]) : 32;
|
|
391
|
+
int cctbl = rw_get_colortable_len(cdpth);
|
|
392
|
+
size_t szimage = rwbitmap__dump_core(self, NULL, cdpth, 0, cctbl);
|
|
393
|
+
RW_MALLOC(lpbmpdata, szimage + offsetbits + cctbl);
|
|
394
|
+
if(rwbitmap__dump_core(self, lpbmpdata, cdpth, szimage, cctbl)){
|
|
395
|
+
VALUE str = rb_str_new((char*)lpbmpdata, szimage + offsetbits + cctbl);
|
|
396
|
+
if(lpbmpdata) free(lpbmpdata);
|
|
397
|
+
return str;
|
|
398
|
+
} else {
|
|
399
|
+
if(lpbmpdata) free(lpbmpdata);
|
|
400
|
+
return Qnil;
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
//VALUE rwgdip1__load_core(VALUE klass, LPVOID lpdata, size_t len); /* prottyping */
|
|
405
|
+
/*
|
|
406
|
+
static VALUE
|
|
407
|
+
rwbitmap_to_image(VALUE self){
|
|
408
|
+
LPVOID lpbmpdata = NULL;
|
|
409
|
+
int offsetbits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
|
|
410
|
+
size_t szimage = rwbitmap__dump_core(self, lpbmpdata, 32, 0, 0);
|
|
411
|
+
RW_MALLOC(lpbmpdata, szimage + offsetbits);
|
|
412
|
+
if(rwbitmap__dump_core(self, lpbmpdata, 32, szimage, 0)){
|
|
413
|
+
VALUE robj=rwgdip1__load_core(cRwImage, lpbmpdata, szimage + offsetbits);
|
|
414
|
+
if(lpbmpdata) free(lpbmpdata);
|
|
415
|
+
return robj;
|
|
416
|
+
} else {
|
|
417
|
+
if(lpbmpdata) free(lpbmpdata);
|
|
418
|
+
return Qnil;
|
|
419
|
+
}
|
|
420
|
+
}*/
|
|
421
|
+
|
|
422
|
+
static void
|
|
423
|
+
rw_init_Bitmap(){
|
|
424
|
+
cRwBitmap = rb_define_class_under(mRwin, "Bitmap", rb_cData);
|
|
425
|
+
rb_define_alloc_func(cRwBitmap, alloc_rwbitmap);
|
|
426
|
+
|
|
427
|
+
rb_define_singleton_method(cRwBitmap, "fromfile", rwbitmap1_fromfile, 1);
|
|
428
|
+
rb_define_singleton_method(cRwBitmap, "fromhandle", rwbitmap1_fromhandle, 1);
|
|
429
|
+
rb_define_singleton_method(cRwBitmap, "monochrome", rwbitmap1_monochrome, 2);
|
|
430
|
+
|
|
431
|
+
rb_define_method(cRwBitmap, "initialize", rwbitmap_initialize, -1);
|
|
432
|
+
rb_define_method(cRwBitmap, "_hbitmap", rwbitmap_hbitmap, 0);
|
|
433
|
+
rb_define_method(cRwBitmap, "_hddbitmap", rwbitmap_hddbitmap, 0);
|
|
434
|
+
rb_define_method(cRwBitmap, "_hdc", rwbitmap_hdc, 0);
|
|
435
|
+
rb_define_method(cRwBitmap, "width", rwbitmap_width, 0);
|
|
436
|
+
rb_define_method(cRwBitmap, "height", rwbitmap_height, 0);
|
|
437
|
+
rb_define_method(cRwBitmap, "depth", rwbitmap_getdepth, 0);
|
|
438
|
+
rb_define_method(cRwBitmap, "draw", rwbitmap_draw, -1);
|
|
439
|
+
rb_define_method(cRwBitmap, "dispose", rwbitmap_dispose, 0);
|
|
440
|
+
// rb_define_method(cRwBitmap, "to_mask", rwbitmap_create_mask, 1);
|
|
441
|
+
// rb_define_method(cRwBitmap, "to_maskimage", rwbitmap_create_maskimage, 1);
|
|
442
|
+
// rb_define_method(cRwBitmap, "to_maskimage", rwbitmap_create_maskimage, 1);
|
|
443
|
+
|
|
444
|
+
/* GDI functions (except Canvas) */
|
|
445
|
+
rb_define_method(cRwBitmap, "GetPixel", rwbitmap_getpixel, 2);
|
|
446
|
+
rb_define_method(cRwBitmap, "SetPixel", rwbitmap_setpixel, 3);
|
|
447
|
+
|
|
448
|
+
rb_define_singleton_method(cRwBitmap, "_load", rwbitmap1__load, 1);
|
|
449
|
+
rb_define_method(cRwBitmap, "_dump", rwbitmap__dump, -1);
|
|
450
|
+
// rb_define_method(cRwBitmap, "to_image", rwbitmap_to_image, 0);
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
/* Icon */
|
|
454
|
+
|
|
455
|
+
VALUE cRwIcon;
|
|
456
|
+
|
|
457
|
+
void
|
|
458
|
+
rwicon_free(void* ptr){
|
|
459
|
+
RwIcon* ri = ptr;
|
|
460
|
+
if(!ri->shared) DestroyIcon(ri->hicon);
|
|
461
|
+
free(ri);
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
static size_t
|
|
465
|
+
rwicon_memsize(const void *ptr){
|
|
466
|
+
return ptr ? sizeof(RwIcon) : 0;
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
const rb_data_type_t
|
|
470
|
+
rwicon_data_type = {
|
|
471
|
+
"Icon", {NULL, rwicon_free, rwicon_memsize}, NULL, NULL
|
|
472
|
+
};
|
|
473
|
+
|
|
474
|
+
static VALUE
|
|
475
|
+
alloc_rwicon(VALUE klass){
|
|
476
|
+
RwIcon* ri;
|
|
477
|
+
VALUE robj = RwIcon_Data_Make_Struct(klass, ri);
|
|
478
|
+
ri->type = RcIcon;
|
|
479
|
+
return robj;
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
static VALUE
|
|
483
|
+
rwicon1_fromfile(int argc, VALUE* argv, VALUE klass){
|
|
484
|
+
char abspath[RW_MAXPATH];
|
|
485
|
+
RwIcon* ri;
|
|
486
|
+
VALUE robj, fname, disired_x, disired_y;
|
|
487
|
+
int dx, dy;
|
|
488
|
+
rb_scan_args(argc, argv, "12", &fname, &disired_x, &disired_y);
|
|
489
|
+
dx = NIL_P(disired_x) ? 0 : FIX2INT(disired_x);
|
|
490
|
+
dy = NIL_P(disired_y) ? dx : FIX2INT(disired_y);
|
|
491
|
+
robj = RwIcon_Data_Make_Struct(klass, ri);
|
|
492
|
+
ri->type = RcIcon;
|
|
493
|
+
rwconv2absolute_path(abspath, RSTRING_PTR(fname));
|
|
494
|
+
ri->hicon = LoadImageA(NULL, abspath, IMAGE_ICON, dx, dy, LR_LOADFROMFILE);
|
|
495
|
+
ri->shared = FALSE;
|
|
496
|
+
if(!ri->hicon){
|
|
497
|
+
rb_raise(rb_eRuntimeError, "Icon load failed(%s).", StringValuePtr(fname));
|
|
498
|
+
}
|
|
499
|
+
Register_rsc(ri->hicon, robj);
|
|
500
|
+
return robj;
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
static VALUE
|
|
504
|
+
rwicon1_fromrsrc(VALUE klass, VALUE idicon){
|
|
505
|
+
RwIcon* ri;
|
|
506
|
+
VALUE robj = RwIcon_Data_Make_Struct(klass, ri);
|
|
507
|
+
ri->type = RcIcon;
|
|
508
|
+
ri->hicon = LoadImage(hInstance, MAKEINTRESOURCE(FIX2INT(idicon)), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE);
|
|
509
|
+
if(ri->hicon==NULL){
|
|
510
|
+
rb_raise(rb_eRuntimeError, "Icon load failed from resource (%d, %d).", FIX2INT(idicon), (int)GetLastError());
|
|
511
|
+
}
|
|
512
|
+
ri->shared = FALSE;
|
|
513
|
+
Register_rsc(ri->hicon, robj);
|
|
514
|
+
return robj;
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
static VALUE
|
|
518
|
+
rwicon_initialize(VALUE self, VALUE v_bmmask, VALUE v_bmcolor){
|
|
519
|
+
RwBitmap *rbmask, *rbcolor;
|
|
520
|
+
ICONINFO iinfo;
|
|
521
|
+
RwIcon *ri = DATA_PTR(self);
|
|
522
|
+
iinfo.fIcon = TRUE;
|
|
523
|
+
iinfo.xHotspot = 0;
|
|
524
|
+
iinfo.xHotspot = 0;
|
|
525
|
+
RwBitmap_Data_Get_Struct(v_bmmask, rbmask);
|
|
526
|
+
iinfo.hbmMask = rw_dib2ddb(rbmask);
|
|
527
|
+
RwBitmap_Data_Get_Struct(v_bmcolor, rbcolor);
|
|
528
|
+
iinfo.hbmColor = rw_dib2ddb(rbcolor);
|
|
529
|
+
ri->hicon = CreateIconIndirect(&iinfo);
|
|
530
|
+
if (!ri->hicon) rb_raise(rb_eRuntimeError, "failed to create icon");
|
|
531
|
+
ri->shared = FALSE;
|
|
532
|
+
return self;
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
static VALUE
|
|
536
|
+
rwicon_hicon(VALUE self){
|
|
537
|
+
RwIcon *ri = DATA_PTR(self);
|
|
538
|
+
return ULONG_PTR2NUM((ULONG_PTR)ri->hicon);
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
static VALUE
|
|
542
|
+
rwicon_dispose(VALUE self){
|
|
543
|
+
RwIcon *ri = DATA_PTR(self);
|
|
544
|
+
if (ri->hicon) {
|
|
545
|
+
if(!ri->shared) DestroyIcon(ri->hicon);
|
|
546
|
+
ri->hicon = NULL;
|
|
547
|
+
return Qtrue;
|
|
548
|
+
}
|
|
549
|
+
return Qnil;
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
static VALUE
|
|
553
|
+
rwicon_to_bmps(VALUE self){
|
|
554
|
+
ICONINFO iinfo;
|
|
555
|
+
VALUE v_bmmask, v_bmcolor;
|
|
556
|
+
RwIcon *ri = DATA_PTR(self);
|
|
557
|
+
GetIconInfo(ri->hicon, &iinfo);
|
|
558
|
+
v_bmmask = rwbitmap1_fromhandle_core(cRwBitmap, iinfo.hbmMask);
|
|
559
|
+
v_bmcolor = iinfo.hbmColor ? rwbitmap1_fromhandle_core(cRwBitmap, iinfo.hbmColor) : Qnil;
|
|
560
|
+
DeleteObject(iinfo.hbmMask);
|
|
561
|
+
DeleteObject(iinfo.hbmColor);
|
|
562
|
+
if(iinfo.fIcon) return rb_ary_new3(2, v_bmmask, v_bmcolor);
|
|
563
|
+
return rb_ary_new3(4, v_bmmask, v_bmcolor, INT2FIX(iinfo.xHotspot), INT2FIX(iinfo.yHotspot));
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
static VALUE
|
|
567
|
+
rwicon__dump_core(ICONINFO *ii, ICONDIRENTRY *pid, int clrdpth){
|
|
568
|
+
int ccmsk, ccclr, ccalloc, cctable;
|
|
569
|
+
char *ptr, *pimage;
|
|
570
|
+
HANDLE hbmclr;
|
|
571
|
+
BITMAP bmmsk, bmclr;
|
|
572
|
+
BITMAPINFO *pbimsk, *pbiclr, *pbi;
|
|
573
|
+
VALUE res;
|
|
574
|
+
|
|
575
|
+
HDC hdc = CreateCompatibleDC(NULL);
|
|
576
|
+
hbmclr = ii->hbmColor;
|
|
577
|
+
clrdpth = hbmclr ? clrdpth : 1;
|
|
578
|
+
cctable = rw_get_colortable_len(clrdpth);
|
|
579
|
+
ccclr = 0;
|
|
580
|
+
GetObject(ii->hbmMask, sizeof(BITMAP), &bmmsk);
|
|
581
|
+
GetObject(ii->hbmColor, sizeof(BITMAP), &bmclr);
|
|
582
|
+
if(bmmsk.bmBitsPixel!=1) rb_raise(rb_eArgError, "Mask bitmap may be broken.");
|
|
583
|
+
|
|
584
|
+
ccalloc = sizeof(BITMAPINFOHEADER) + cctable;
|
|
585
|
+
RW_CALLOC(pbimsk, sizeof(BITMAPINFOHEADER)+1024);
|
|
586
|
+
rw_setbihdr((BITMAPINFOHEADER*)pbimsk, bmmsk.bmWidth, bmmsk.bmHeight, 1, 1, 0);
|
|
587
|
+
GetDIBits(hdc, ii->hbmMask, 0, bmmsk.bmHeight, NULL, pbimsk, DIB_RGB_COLORS);
|
|
588
|
+
ccmsk = pbimsk->bmiHeader.biSizeImage;
|
|
589
|
+
free(pbimsk);
|
|
590
|
+
ccalloc += ccmsk;
|
|
591
|
+
if(hbmclr){
|
|
592
|
+
RW_CALLOC(pbiclr, sizeof(BITMAPINFOHEADER)+cctable);
|
|
593
|
+
rw_setbihdr((BITMAPINFOHEADER*)pbiclr, bmclr.bmWidth, bmclr.bmHeight, 1, clrdpth, 0);
|
|
594
|
+
GetDIBits(hdc, ii->hbmColor, 0, bmclr.bmHeight, NULL, pbiclr, DIB_RGB_COLORS);
|
|
595
|
+
ccclr = pbiclr->bmiHeader.biSizeImage;
|
|
596
|
+
free(pbiclr);
|
|
597
|
+
ccalloc += ccclr;
|
|
598
|
+
}
|
|
599
|
+
pid->bWidth = bmmsk.bmWidth;
|
|
600
|
+
pid->bHeight = hbmclr ? bmclr.bmHeight : bmmsk.bmHeight/2;
|
|
601
|
+
pid->wPlanes = ii->fIcon ? 1 : ii->xHotspot;
|
|
602
|
+
pid->wBitCount = ii->fIcon ? clrdpth : (WORD)ii->yHotspot;
|
|
603
|
+
pid->dwBytesInRes = sizeof(BITMAPINFOHEADER) + cctable + ccmsk + ccclr;
|
|
604
|
+
pid->dwImageOffset = sizeof(ICONDIR) + sizeof(ICONDIRENTRY);
|
|
605
|
+
// fprintf(stderr, "w=%d, h=%d, cctable=%d, ccmsk=%d, ccclr=%d, clrdpth=%d, ccalloc=%d\n", pid->bWidth, pid->bHeight, cctable, ccmsk, ccclr, clrdpth, ccalloc);
|
|
606
|
+
|
|
607
|
+
RW_CALLOC(ptr, ccalloc);
|
|
608
|
+
pimage = ptr;
|
|
609
|
+
pbi = (BITMAPINFO*)pimage;
|
|
610
|
+
/* Set mask bits at first. */
|
|
611
|
+
rw_setbihdr((BITMAPINFOHEADER*)pbi, bmmsk.bmWidth, bmmsk.bmHeight, 1, 1, 0);
|
|
612
|
+
pimage += sizeof(BITMAPINFOHEADER) + cctable;
|
|
613
|
+
GetDIBits(hdc, ii->hbmMask, 0, bmmsk.bmHeight, pimage+ccclr, pbi, DIB_RGB_COLORS);
|
|
614
|
+
if(hbmclr){ /* Set color bits next. */
|
|
615
|
+
rw_setbihdr((BITMAPINFOHEADER*)pbi, bmclr.bmWidth, bmclr.bmHeight, 1, clrdpth, 0);
|
|
616
|
+
GetDIBits(hdc, ii->hbmColor, 0, bmclr.bmHeight, pimage, pbi, DIB_RGB_COLORS);
|
|
617
|
+
pimage += pbi->bmiHeader.biSizeImage;
|
|
618
|
+
pbi->bmiHeader.biHeight += bmmsk.bmHeight;
|
|
619
|
+
}
|
|
620
|
+
pbi->bmiHeader.biSizeImage = 0;
|
|
621
|
+
res = rb_str_new(ptr, ccalloc);
|
|
622
|
+
ReleaseDC(NULL, hdc);
|
|
623
|
+
free(ptr);
|
|
624
|
+
return res;
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
static VALUE
|
|
628
|
+
rwicon__dump(int argc, VALUE *argv, VALUE self){
|
|
629
|
+
VALUE robj, rstr;
|
|
630
|
+
char *pstr;
|
|
631
|
+
ICONINFO ii;
|
|
632
|
+
ICONDIR *idir;
|
|
633
|
+
ICONDIRENTRY *idirent;
|
|
634
|
+
int clrdpth = argc>0 ? FIX2INT(argv[0]) : 24;
|
|
635
|
+
RwIcon *ri = DATA_PTR(self);
|
|
636
|
+
int ccalloc = sizeof(ICONDIR) + sizeof(ICONDIRENTRY);
|
|
637
|
+
RW_CALLOC(pstr, ccalloc);
|
|
638
|
+
GetIconInfo(ri->hicon, &ii);
|
|
639
|
+
idir = (ICONDIR*)pstr;
|
|
640
|
+
idir->idType = ii.fIcon ? 1 : 2;
|
|
641
|
+
idir->idCount = 1;
|
|
642
|
+
idirent = (ICONDIRENTRY*)(pstr+sizeof(ICONDIR));
|
|
643
|
+
rstr = rwicon__dump_core(&ii, idirent, clrdpth);
|
|
644
|
+
robj = rb_str_new(pstr, ccalloc);
|
|
645
|
+
rb_str_cat(robj, RSTRING_PTR(rstr), RSTRING_LEN(rstr));
|
|
646
|
+
return robj;
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
/* Obsolete
|
|
650
|
+
static VALUE
|
|
651
|
+
rwicon1__dump(int argc, VALUE *argv, VALUE klass){
|
|
652
|
+
VALUE robj, rstr;
|
|
653
|
+
char *pstr;
|
|
654
|
+
int i, ofst, ccalloc, clrdpth, imageoffset;
|
|
655
|
+
ICONDIR *idir;
|
|
656
|
+
ICONDIRENTRY *idirent;
|
|
657
|
+
if (FIXNUM_P(argv[0])){
|
|
658
|
+
clrdpth = FIX2INT(argv[0]);
|
|
659
|
+
argc --;
|
|
660
|
+
ofst = 1;
|
|
661
|
+
} else {
|
|
662
|
+
clrdpth = 24;
|
|
663
|
+
ofst = 0;
|
|
664
|
+
}
|
|
665
|
+
ccalloc = sizeof(ICONDIR) + sizeof(ICONDIRENTRY)*argc;
|
|
666
|
+
RW_CALLOC(pstr, ccalloc);
|
|
667
|
+
idir = (ICONDIR*)pstr;
|
|
668
|
+
idir->idType = 1;
|
|
669
|
+
idir->idCount = argc;
|
|
670
|
+
rstr = rb_str_new(NULL, 0);
|
|
671
|
+
idirent = (ICONDIRENTRY*)(pstr + sizeof(ICONDIR));
|
|
672
|
+
imageoffset = ccalloc;
|
|
673
|
+
for(i=0; i<argc; i++){
|
|
674
|
+
VALUE rstr1;
|
|
675
|
+
ICONINFO ii;
|
|
676
|
+
RwIcon *ri;
|
|
677
|
+
RwIcon_Data_Get_Struct(argv[i+ofst], ri);
|
|
678
|
+
GetIconInfo(ri->hicon, &ii);
|
|
679
|
+
rstr1 = rwicon__dump_core(&ii, &idirent[i], clrdpth);
|
|
680
|
+
idirent[i].dwImageOffset = imageoffset;
|
|
681
|
+
imageoffset += RSTRING_LEN(rstr1);
|
|
682
|
+
rb_str_cat(rstr, RSTRING_PTR(rstr1), RSTRING_LEN(rstr1));
|
|
683
|
+
} //;fprintf(stderr, "argc=%d, ccalloc=%d", argc, ccalloc);
|
|
684
|
+
robj = rb_str_new(pstr, ccalloc);
|
|
685
|
+
rb_str_cat(robj, RSTRING_PTR(rstr), RSTRING_LEN(rstr));
|
|
686
|
+
return robj;
|
|
687
|
+
}
|
|
688
|
+
*/
|
|
689
|
+
|
|
690
|
+
static HANDLE
|
|
691
|
+
rwicon1__load_core(char *pstr, ICONDIRENTRY *idirent, BOOL ficon){
|
|
692
|
+
BITMAPINFOHEADER *bihdr;
|
|
693
|
+
BITMAPINFO *bimsk;
|
|
694
|
+
int w, h, bc, offset;
|
|
695
|
+
HBITMAP hbmmsk, hbmclr;
|
|
696
|
+
ICONINFO ii;
|
|
697
|
+
HDC hdc;
|
|
698
|
+
HANDLE hicon;
|
|
699
|
+
char *ptr;
|
|
700
|
+
ptr = pstr + idirent->dwImageOffset;
|
|
701
|
+
w = idirent->bWidth;
|
|
702
|
+
h = idirent->bHeight;
|
|
703
|
+
bihdr = (BITMAPINFOHEADER*) ptr;
|
|
704
|
+
bc = ficon ? idirent->wBitCount : bihdr->biBitCount;
|
|
705
|
+
offset = bc<=8 ? (2<<(bc-1))*4 : 0; /* size of color table */
|
|
706
|
+
ptr += sizeof(BITMAPINFOHEADER) + offset;
|
|
707
|
+
hdc = GetDC(NULL);
|
|
708
|
+
if(bc>1){
|
|
709
|
+
bihdr->biWidth = w;
|
|
710
|
+
bihdr->biHeight = h;
|
|
711
|
+
bihdr->biSizeImage = w*h*bc/8;
|
|
712
|
+
hbmclr = CreateDIBitmap(hdc, bihdr, CBM_INIT, ptr, (BITMAPINFO*)bihdr, DIB_RGB_COLORS);
|
|
713
|
+
ptr += bihdr->biSizeImage;
|
|
714
|
+
} else {
|
|
715
|
+
h = h*2;
|
|
716
|
+
hbmclr = NULL;
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
RW_CALLOC(bimsk, sizeof(BITMAPINFOHEADER) + 1024);
|
|
720
|
+
rw_setbihdr((BITMAPINFOHEADER*)bimsk, w, h, 1, 1, 0);
|
|
721
|
+
bimsk->bmiColors[1].rgbBlue = 0xff;
|
|
722
|
+
bimsk->bmiColors[1].rgbGreen = 0xff;
|
|
723
|
+
bimsk->bmiColors[1].rgbRed = 0xff;
|
|
724
|
+
bimsk->bmiHeader.biSizeImage = w*h/8;
|
|
725
|
+
hbmmsk = CreateDIBitmap(hdc, (BITMAPINFOHEADER*)bimsk, CBM_INIT, ptr, bimsk, DIB_RGB_COLORS);
|
|
726
|
+
ReleaseDC(NULL, hdc);
|
|
727
|
+
free(bimsk);
|
|
728
|
+
|
|
729
|
+
ii.fIcon = ficon;
|
|
730
|
+
ii.xHotspot = idirent->wPlanes;
|
|
731
|
+
ii.yHotspot = idirent->wBitCount;
|
|
732
|
+
ii.hbmMask = hbmmsk;
|
|
733
|
+
ii.hbmColor = hbmclr;
|
|
734
|
+
|
|
735
|
+
hicon = CreateIconIndirect(&ii);
|
|
736
|
+
DeleteObject(hbmmsk);
|
|
737
|
+
DeleteObject(hbmclr);
|
|
738
|
+
return hicon;
|
|
739
|
+
}
|
|
740
|
+
|
|
741
|
+
static VALUE
|
|
742
|
+
rwicon1__load(VALUE klass, VALUE str){
|
|
743
|
+
int i;
|
|
744
|
+
char *pstr = RSTRING_PTR(str);
|
|
745
|
+
ICONDIR *idir = (ICONDIR*)pstr;
|
|
746
|
+
VALUE ary = rb_ary_new();
|
|
747
|
+
for(i=0; i < idir->idCount; i++){
|
|
748
|
+
ICONDIRENTRY *idirent = (ICONDIRENTRY*)(pstr + sizeof(ICONDIR) + i*sizeof(ICONDIRENTRY));
|
|
749
|
+
HICON hicon = rwicon1__load_core(pstr, idirent, idir->idType==1);
|
|
750
|
+
if(hicon) {
|
|
751
|
+
RwIcon *ri;
|
|
752
|
+
VALUE robj;
|
|
753
|
+
robj = RwIcon_Data_Make_Struct(klass, ri);
|
|
754
|
+
ri->type = RcIcon;
|
|
755
|
+
ri->hicon = hicon;
|
|
756
|
+
Register_rsc(ri->hicon, robj);
|
|
757
|
+
rb_ary_push(ary, robj);
|
|
758
|
+
} else rb_raise(rb_eRuntimeError, "Icon load failed.");
|
|
759
|
+
}
|
|
760
|
+
return ary;
|
|
761
|
+
}
|
|
762
|
+
|
|
763
|
+
static void
|
|
764
|
+
rw_init_Icon(){
|
|
765
|
+
cRwIcon = rb_define_class_under(mRwin, "Icon", rb_cData);
|
|
766
|
+
rb_define_alloc_func(cRwIcon, alloc_rwicon);
|
|
767
|
+
|
|
768
|
+
rb_define_singleton_method(cRwIcon, "fromfile", rwicon1_fromfile, -1);
|
|
769
|
+
rb_define_singleton_method(cRwIcon, "fromresource", rwicon1_fromrsrc, 1);
|
|
770
|
+
// rb_define_singleton_method(cRwIcon, "_dump", rwicon1__dump, -1);
|
|
771
|
+
|
|
772
|
+
rb_define_method(cRwIcon, "initialize", rwicon_initialize, 2);
|
|
773
|
+
rb_define_method(cRwIcon, "_hicon", rwicon_hicon, 0);
|
|
774
|
+
rb_define_method(cRwIcon, "dispose", rwicon_dispose, 0);
|
|
775
|
+
rb_define_method(cRwIcon, "to_bmps", rwicon_to_bmps, 0);
|
|
776
|
+
rb_define_method(cRwIcon, "_dump", rwicon__dump, -1);
|
|
777
|
+
rb_define_singleton_method(cRwIcon, "_load", rwicon1__load, 1);
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
/* Cursor */
|
|
781
|
+
VALUE cRwCursor;
|
|
782
|
+
|
|
783
|
+
void
|
|
784
|
+
rwcursor_free(void* ptr){
|
|
785
|
+
RwCursor *rc = ptr;
|
|
786
|
+
if(!rc->shared) DestroyCursor(rc->hcursor);
|
|
787
|
+
free(rc);
|
|
788
|
+
}
|
|
789
|
+
|
|
790
|
+
static size_t
|
|
791
|
+
rwcursor_memsize(const void *ptr){
|
|
792
|
+
return ptr ? sizeof(RwCursor) : 0;
|
|
793
|
+
}
|
|
794
|
+
|
|
795
|
+
const rb_data_type_t
|
|
796
|
+
rwcursor_data_type = {
|
|
797
|
+
"Cursor", {NULL, rwcursor_free, rwcursor_memsize}, NULL, NULL
|
|
798
|
+
};
|
|
799
|
+
|
|
800
|
+
static VALUE
|
|
801
|
+
alloc_rwcursor(VALUE klass){
|
|
802
|
+
RwCursor *rc;
|
|
803
|
+
VALUE robj = RwCursor_Data_Make_Struct(klass, rc);
|
|
804
|
+
rc->type = RcCursor;
|
|
805
|
+
return robj;
|
|
806
|
+
}
|
|
807
|
+
|
|
808
|
+
static VALUE
|
|
809
|
+
rwcursor_initialize(VALUE self, VALUE v_xhot, VALUE v_yhot, VALUE v_bmmask, VALUE v_bmcolor){
|
|
810
|
+
RwBitmap *rbmask, *rbcolor;
|
|
811
|
+
ICONINFO iinfo;
|
|
812
|
+
RwCursor *rc = DATA_PTR(self);
|
|
813
|
+
iinfo.fIcon = FALSE;
|
|
814
|
+
iinfo.xHotspot = FIX2INT(v_xhot);
|
|
815
|
+
iinfo.yHotspot = FIX2INT(v_yhot);
|
|
816
|
+
RwBitmap_Data_Get_Struct(v_bmmask, rbmask);
|
|
817
|
+
iinfo.hbmMask = rw_dib2ddb(rbmask);
|
|
818
|
+
RwBitmap_Data_Get_Struct(v_bmcolor, rbcolor);
|
|
819
|
+
iinfo.hbmColor = rw_dib2ddb(rbcolor);
|
|
820
|
+
rc->hcursor = CreateIconIndirect(&iinfo);
|
|
821
|
+
if (!rc->hcursor) rb_raise(rb_eRuntimeError, "failed to create cursor");
|
|
822
|
+
rc->shared = FALSE;
|
|
823
|
+
return self;
|
|
824
|
+
}
|
|
825
|
+
|
|
826
|
+
static VALUE
|
|
827
|
+
rwcursor1_loadfromfile(VALUE klass, VALUE fname){
|
|
828
|
+
RwCursor* rc;
|
|
829
|
+
VALUE robj = RwCursor_Data_Make_Struct(klass, rc);
|
|
830
|
+
|
|
831
|
+
if(!FIXNUM_P(fname)){
|
|
832
|
+
char abspath[RW_MAXPATH];
|
|
833
|
+
rwconv2absolute_path(abspath, RSTRING_PTR(fname));
|
|
834
|
+
rc->hcursor = LoadImageA(NULL, abspath, IMAGE_CURSOR, 0, 0, LR_LOADFROMFILE);
|
|
835
|
+
} else {
|
|
836
|
+
rc->hcursor = LoadCursor(NULL, MAKEINTRESOURCE(FIX2INT(fname)));
|
|
837
|
+
}
|
|
838
|
+
if(!rc->hcursor) rb_raise(rb_eRuntimeError, "failed to create cursor");
|
|
839
|
+
rc->type = RcCursor;
|
|
840
|
+
rc->shared = FIXNUM_P(fname) ? TRUE : FALSE;
|
|
841
|
+
return robj;
|
|
842
|
+
}
|
|
843
|
+
|
|
844
|
+
static VALUE
|
|
845
|
+
rwcursor_delete(VALUE self){
|
|
846
|
+
RwCursor *rc = DATA_PTR(self);
|
|
847
|
+
Unregister_rsc(rc->hcursor);
|
|
848
|
+
DestroyCursor(rc->hcursor);
|
|
849
|
+
rc->hcursor = 0;
|
|
850
|
+
return Qtrue;
|
|
851
|
+
}
|
|
852
|
+
|
|
853
|
+
static VALUE
|
|
854
|
+
rwcursor_hcursor(VALUE self){
|
|
855
|
+
RwCursor *rc = DATA_PTR(self);
|
|
856
|
+
return ULONG_PTR2NUM((ULONG_PTR)rc->hcursor);
|
|
857
|
+
}
|
|
858
|
+
|
|
859
|
+
static VALUE
|
|
860
|
+
rwapp_setcursor(VALUE mod, VALUE v_cur){
|
|
861
|
+
HCURSOR hc;
|
|
862
|
+
RwCursor *rc;
|
|
863
|
+
switch(TYPE(v_cur)){
|
|
864
|
+
case T_FIXNUM: case T_BIGNUM:
|
|
865
|
+
hc = (HCURSOR)NUM2ULONG_PTR(v_cur);
|
|
866
|
+
break;
|
|
867
|
+
default:
|
|
868
|
+
RwCursor_Data_Get_Struct(v_cur, rc);
|
|
869
|
+
RwCheckResource(rc);
|
|
870
|
+
hc = rc->hcursor;
|
|
871
|
+
}
|
|
872
|
+
SetCursor(hc);
|
|
873
|
+
return v_cur;
|
|
874
|
+
}
|
|
875
|
+
|
|
876
|
+
static VALUE
|
|
877
|
+
rwapp_getcursor(){
|
|
878
|
+
HANDLE hCursor = GetCursor();
|
|
879
|
+
VALUE v_cursor = Get_rsc(hCursor);
|
|
880
|
+
return NIL_P(v_cursor) ? ULONG_PTR2NUM((ULONG_PTR)hCursor) : v_cursor;
|
|
881
|
+
}
|
|
882
|
+
|
|
883
|
+
static VALUE
|
|
884
|
+
rwapp_showcursor(VALUE mod, VALUE v_show){
|
|
885
|
+
BOOL bShow = (!v_show || NIL_P(v_show)) ? FALSE : TRUE;
|
|
886
|
+
return INT2FIX(ShowCursor(bShow));
|
|
887
|
+
}
|
|
888
|
+
|
|
889
|
+
static VALUE
|
|
890
|
+
rwcursor1__load(VALUE klass, VALUE str){
|
|
891
|
+
char *pstr = RSTRING_PTR(str);
|
|
892
|
+
ICONDIR *idir = (ICONDIR*)pstr;
|
|
893
|
+
ICONDIRENTRY *idirent = (ICONDIRENTRY *)(pstr + sizeof(ICONDIR));
|
|
894
|
+
HCURSOR hcursor = rwicon1__load_core(pstr, idirent, idir->idType==1);
|
|
895
|
+
if(hcursor){
|
|
896
|
+
RwCursor *rc;
|
|
897
|
+
VALUE robj;
|
|
898
|
+
robj = RwCursor_Data_Make_Struct(klass, rc);
|
|
899
|
+
rc->type = RcCursor;
|
|
900
|
+
rc->hcursor = hcursor;
|
|
901
|
+
Register_rsc(rc->hcursor, robj);
|
|
902
|
+
return robj;
|
|
903
|
+
}
|
|
904
|
+
return Qnil;
|
|
905
|
+
}
|
|
906
|
+
|
|
907
|
+
void
|
|
908
|
+
rw_init_Cursor(){
|
|
909
|
+
cRwCursor = rb_define_class_under(mRwin, "Cursor", rb_cData);
|
|
910
|
+
rb_define_alloc_func(cRwCursor, alloc_rwcursor);
|
|
911
|
+
rb_define_singleton_method(cRwCursor, "fromfile", rwcursor1_loadfromfile, 1);
|
|
912
|
+
rb_define_singleton_method(cRwCursor, "_load", rwcursor1__load, 1);
|
|
913
|
+
rb_define_method(cRwCursor, "initialize", rwcursor_initialize, 4);
|
|
914
|
+
rb_define_method(cRwCursor, "_hcursor", rwcursor_hcursor, 0);
|
|
915
|
+
rb_define_method(cRwCursor, "dispose", rwcursor_delete, 0);
|
|
916
|
+
rb_define_method(cRwCursor, "to_bmps", rwicon_to_bmps, 0);
|
|
917
|
+
rb_define_method(cRwCursor, "_dump", rwicon__dump, -1);
|
|
918
|
+
|
|
919
|
+
rb_define_singleton_method(mRwApp, "SetCursor", rwapp_setcursor, 1);
|
|
920
|
+
rb_define_singleton_method(mRwApp, "GetCursor", rwapp_getcursor, 0);
|
|
921
|
+
rb_define_singleton_method(mRwApp, "ShowCursor", rwapp_showcursor, 1);
|
|
922
|
+
}
|
|
923
|
+
|
|
924
|
+
/* Pen */
|
|
925
|
+
|
|
926
|
+
VALUE cRwPen;
|
|
927
|
+
|
|
928
|
+
void
|
|
929
|
+
rwpen_free(void* ptr){
|
|
930
|
+
RwPen *rp = ptr;
|
|
931
|
+
if(rp->hpen) DeleteObject(rp->hpen);
|
|
932
|
+
free(rp);
|
|
933
|
+
}
|
|
934
|
+
|
|
935
|
+
static size_t
|
|
936
|
+
rwpen_memsize(const void *ptr){
|
|
937
|
+
return ptr ? sizeof(RwPen) : 0;
|
|
938
|
+
}
|
|
939
|
+
|
|
940
|
+
const rb_data_type_t
|
|
941
|
+
rwpen_data_type = {
|
|
942
|
+
"Pen", {NULL, rwpen_free, rwpen_memsize}, NULL, NULL
|
|
943
|
+
};
|
|
944
|
+
|
|
945
|
+
static VALUE
|
|
946
|
+
alloc_rwpen(VALUE klass){
|
|
947
|
+
RwPen *rp;
|
|
948
|
+
VALUE robj = RwPen_Data_Make_Struct(klass, rp);
|
|
949
|
+
rp->type = RcPen;
|
|
950
|
+
return robj;
|
|
951
|
+
}
|
|
952
|
+
|
|
953
|
+
static void
|
|
954
|
+
init_rwpen(int argc, VALUE *argv, RwPen *rp){
|
|
955
|
+
VALUE v_color, v_width, v_style;
|
|
956
|
+
if (argc<1) rb_raise(rb_eArgError, "need color");
|
|
957
|
+
rb_scan_args(argc, argv, "12", &v_color, &v_width, &v_style);
|
|
958
|
+
if(FIXNUM_P(v_color)){
|
|
959
|
+
int color = FIX2INT(v_color);
|
|
960
|
+
int width = NIL_P(v_width) ? 0 : FIX2INT(v_width);
|
|
961
|
+
int style = NIL_P(v_style) ? PS_SOLID : FIX2INT(v_style);
|
|
962
|
+
rp->hpen = CreatePen(style, width, (COLORREF)color);
|
|
963
|
+
} else {
|
|
964
|
+
CStructData *cslp;
|
|
965
|
+
CStruct_Data_Get_Struct(v_color, cslp);
|
|
966
|
+
rp->hpen = CreatePenIndirect((LOGPEN*)(cslp->dtstr + cslp->dtoffset));
|
|
967
|
+
}
|
|
968
|
+
}
|
|
969
|
+
|
|
970
|
+
static VALUE
|
|
971
|
+
rwpen_initialize(int argc, VALUE *argv, VALUE self){
|
|
972
|
+
RwPen *rp = DATA_PTR(self);
|
|
973
|
+
init_rwpen(argc, argv, rp);
|
|
974
|
+
return self;
|
|
975
|
+
}
|
|
976
|
+
|
|
977
|
+
static VALUE
|
|
978
|
+
rwpen_hpen(VALUE self){
|
|
979
|
+
RwPen *rp = DATA_PTR(self);
|
|
980
|
+
return ULONG_PTR2NUM((ULONG_PTR)rp->hpen);
|
|
981
|
+
}
|
|
982
|
+
|
|
983
|
+
static VALUE
|
|
984
|
+
rwpen_dispose(VALUE self){
|
|
985
|
+
RwPen *rp = DATA_PTR(self);
|
|
986
|
+
if (rp->hpen) {
|
|
987
|
+
DeleteObject(rp->hpen);
|
|
988
|
+
rp->hpen = NULL;
|
|
989
|
+
return Qtrue;
|
|
990
|
+
}
|
|
991
|
+
return Qnil;
|
|
992
|
+
}
|
|
993
|
+
|
|
994
|
+
void
|
|
995
|
+
rw_init_Pen(){
|
|
996
|
+
cRwPen = rb_define_class_under(mRwin, "Pen", rb_cData);
|
|
997
|
+
rb_define_alloc_func(cRwPen, alloc_rwpen);
|
|
998
|
+
rb_define_method(cRwPen, "initialize", rwpen_initialize, -1);
|
|
999
|
+
rb_define_method(cRwPen, "_hpen", rwpen_hpen, 0);
|
|
1000
|
+
rb_define_method(cRwPen, "dispose", rwpen_dispose, 0);
|
|
1001
|
+
}
|
|
1002
|
+
|
|
1003
|
+
|
|
1004
|
+
// Brush
|
|
1005
|
+
|
|
1006
|
+
VALUE cRwBrush;
|
|
1007
|
+
|
|
1008
|
+
void
|
|
1009
|
+
rwbrush_free(void* ptr){
|
|
1010
|
+
RwBrush *rb = ptr;
|
|
1011
|
+
if(rb->hbrush) DeleteObject(rb->hbrush);
|
|
1012
|
+
free(rb);
|
|
1013
|
+
}
|
|
1014
|
+
|
|
1015
|
+
static size_t
|
|
1016
|
+
rwbrush_memsize(const void *ptr){
|
|
1017
|
+
return ptr ? sizeof(RwBrush) : 0;
|
|
1018
|
+
}
|
|
1019
|
+
|
|
1020
|
+
const rb_data_type_t
|
|
1021
|
+
rwbrush_data_type = {
|
|
1022
|
+
"Brush", {NULL, rwbrush_free, rwbrush_memsize}, NULL, NULL
|
|
1023
|
+
};
|
|
1024
|
+
|
|
1025
|
+
static VALUE
|
|
1026
|
+
alloc_rwbrush(VALUE klass){
|
|
1027
|
+
RwBrush *rb;
|
|
1028
|
+
VALUE robj = RwBrush_Data_Make_Struct(klass, rb);
|
|
1029
|
+
rb->type = RcBrush;
|
|
1030
|
+
return robj;
|
|
1031
|
+
}
|
|
1032
|
+
|
|
1033
|
+
static void
|
|
1034
|
+
init_rwbrush(int argc, VALUE *argv, RwBrush *rb){
|
|
1035
|
+
VALUE v_color, v_style, v_hatch;
|
|
1036
|
+
if (!argc) rb_raise(rb_eArgError,"need color or LOGBRUSH");
|
|
1037
|
+
rb_scan_args(argc, argv, "12", &v_color, &v_style, &v_hatch);
|
|
1038
|
+
if(FIXNUM_P(v_color)){
|
|
1039
|
+
LOGBRUSH lb;
|
|
1040
|
+
lb.lbColor = FIX2INT(v_color);
|
|
1041
|
+
lb.lbStyle = NIL_P(v_style) ? BS_SOLID : NUM2INT(v_style);
|
|
1042
|
+
lb.lbHatch = NIL_P(v_hatch) ? HS_DIAGCROSS : NUM2INT(v_hatch);
|
|
1043
|
+
rb->hbrush = CreateBrushIndirect(&lb);
|
|
1044
|
+
} else {
|
|
1045
|
+
CStructData *cslb;
|
|
1046
|
+
CStruct_Data_Get_Struct(v_color, cslb);
|
|
1047
|
+
rb->hbrush = CreateBrushIndirect((LOGBRUSH*)(cslb->dtstr + cslb->dtoffset));
|
|
1048
|
+
}
|
|
1049
|
+
}
|
|
1050
|
+
|
|
1051
|
+
static VALUE
|
|
1052
|
+
rwbrush_initialize(int argc, VALUE *argv, VALUE obj){
|
|
1053
|
+
RwBrush *rb;
|
|
1054
|
+
RwBrush_Data_Get_Struct(obj, rb);
|
|
1055
|
+
init_rwbrush(argc, argv, rb);
|
|
1056
|
+
return obj;
|
|
1057
|
+
}
|
|
1058
|
+
|
|
1059
|
+
static VALUE
|
|
1060
|
+
rwbrush_hbrush(VALUE obj){
|
|
1061
|
+
RwBrush *rb;
|
|
1062
|
+
RwBrush_Data_Get_Struct(obj, rb);
|
|
1063
|
+
return ULONG_PTR2NUM((ULONG_PTR)rb->hbrush);
|
|
1064
|
+
}
|
|
1065
|
+
|
|
1066
|
+
static VALUE
|
|
1067
|
+
rwbrush_dispose(VALUE obj){
|
|
1068
|
+
RwBrush *rb;
|
|
1069
|
+
RwBrush_Data_Get_Struct(obj, rb);
|
|
1070
|
+
if (rb->hbrush) {
|
|
1071
|
+
DeleteObject(rb->hbrush);
|
|
1072
|
+
rb->hbrush = NULL;
|
|
1073
|
+
return Qtrue;
|
|
1074
|
+
}
|
|
1075
|
+
return Qnil;
|
|
1076
|
+
}
|
|
1077
|
+
|
|
1078
|
+
void
|
|
1079
|
+
rw_init_Brush(){
|
|
1080
|
+
cRwBrush = rb_define_class_under(mRwin, "Brush", rb_cData);
|
|
1081
|
+
rb_define_alloc_func(cRwBrush, alloc_rwbrush);
|
|
1082
|
+
rb_define_method(cRwBrush, "initialize", rwbrush_initialize, -1);
|
|
1083
|
+
rb_define_method(cRwBrush, "_hbrush", rwbrush_hbrush, 0);
|
|
1084
|
+
rb_define_method(cRwBrush, "dispose", rwbrush_dispose, 0);
|
|
1085
|
+
}
|
|
1086
|
+
|
|
1087
|
+
/* ImageList */
|
|
1088
|
+
|
|
1089
|
+
VALUE cRwImagelist;
|
|
1090
|
+
|
|
1091
|
+
void
|
|
1092
|
+
rwimagelist_free(void* ptr){
|
|
1093
|
+
RwImagelist *ri = ptr;
|
|
1094
|
+
if(ri->himagelist) ImageList_Destroy(ri->himagelist);
|
|
1095
|
+
free(ri);
|
|
1096
|
+
}
|
|
1097
|
+
|
|
1098
|
+
static size_t
|
|
1099
|
+
rwimagelist_memsize(const void *ptr){
|
|
1100
|
+
return ptr ? sizeof(RwImagelist) : 0;
|
|
1101
|
+
}
|
|
1102
|
+
|
|
1103
|
+
const rb_data_type_t
|
|
1104
|
+
rwimagelist_data_type = {
|
|
1105
|
+
"Imagelist", {NULL, rwimagelist_free, rwimagelist_memsize}, NULL, NULL
|
|
1106
|
+
};
|
|
1107
|
+
|
|
1108
|
+
static VALUE
|
|
1109
|
+
alloc_rwimagelist(VALUE klass){
|
|
1110
|
+
RwImagelist *ri;
|
|
1111
|
+
VALUE robj = RwImagelist_Data_Make_Struct(klass, ri);
|
|
1112
|
+
ri->type = RcImagelist;
|
|
1113
|
+
return robj;
|
|
1114
|
+
}
|
|
1115
|
+
|
|
1116
|
+
static void
|
|
1117
|
+
init_imglist(int argc, VALUE *argv, RwImagelist *ri){
|
|
1118
|
+
VALUE v_cx, v_cy, v_flag, v_initial, v_glow;
|
|
1119
|
+
int cx, cy, flag, initial, grow;
|
|
1120
|
+
|
|
1121
|
+
rb_scan_args(argc, argv, "05", &v_cx, &v_cy, &v_flag, &v_initial, &v_glow);
|
|
1122
|
+
cx = NIL_P(v_cx) ? 32 : FIX2INT(v_cx);
|
|
1123
|
+
cy = NIL_P(v_cy) ? 32 : FIX2INT(v_cy);
|
|
1124
|
+
flag = NIL_P(v_flag) ? ILC_COLOR : NUM2UINT(v_flag);
|
|
1125
|
+
initial = (argc>3 && argv[3]!=Qnil)? NUM2UINT(argv[3]) : 0;
|
|
1126
|
+
grow = (argc>4 && argv[4]!=Qnil)? NUM2UINT(argv[4]) : 1;
|
|
1127
|
+
ri->himagelist = ImageList_Create(cx, cy, flag, initial, grow);
|
|
1128
|
+
// ri->flags = flag;
|
|
1129
|
+
if (!ri->himagelist) rb_raise(rb_eRuntimeError,"ImageList_Create failed");
|
|
1130
|
+
}
|
|
1131
|
+
|
|
1132
|
+
static VALUE
|
|
1133
|
+
rwimagelist_initialize(int argc,VALUE* argv, VALUE self){
|
|
1134
|
+
RwImagelist *ri = DATA_PTR(self);
|
|
1135
|
+
init_imglist(argc, argv, ri);
|
|
1136
|
+
Register_rsc(ri->himagelist, self);
|
|
1137
|
+
return self;
|
|
1138
|
+
}
|
|
1139
|
+
|
|
1140
|
+
static VALUE
|
|
1141
|
+
rwimagelist_delete(VALUE self){
|
|
1142
|
+
RwImagelist *ri = DATA_PTR(self);
|
|
1143
|
+
RwCheckResource(ri);
|
|
1144
|
+
Unregister_rsc(ri->himagelist);
|
|
1145
|
+
ImageList_Destroy(ri->himagelist);
|
|
1146
|
+
ri->himagelist = NULL;
|
|
1147
|
+
return self;
|
|
1148
|
+
}
|
|
1149
|
+
|
|
1150
|
+
static VALUE
|
|
1151
|
+
rwimagelist_add(int argc, VALUE* argv, VALUE self){
|
|
1152
|
+
VALUE v_image, v_mask;
|
|
1153
|
+
HBITMAP hbmimg, hbmmask;
|
|
1154
|
+
int r;
|
|
1155
|
+
RwImagelist *ri = DATA_PTR(self);
|
|
1156
|
+
RwCheckResource(ri);
|
|
1157
|
+
rb_scan_args(argc, argv, "11", &v_image, &v_mask);
|
|
1158
|
+
|
|
1159
|
+
if(rb_typeddata_is_kind_of(v_image, &rwbitmap_data_type)){
|
|
1160
|
+
RwBitmap* rb;
|
|
1161
|
+
RwBitmap_Data_Get_Struct(v_image, rb);
|
|
1162
|
+
RwCheckResource(rb);
|
|
1163
|
+
hbmimg = rw_dib2ddb(rb);
|
|
1164
|
+
} else {
|
|
1165
|
+
rb_raise(rb_eArgError, "Not a Bitmap");
|
|
1166
|
+
}
|
|
1167
|
+
|
|
1168
|
+
if(NIL_P(v_mask)) {
|
|
1169
|
+
hbmmask = NULL;
|
|
1170
|
+
}else if(rb_typeddata_is_kind_of(v_mask, &rwbitmap_data_type)){
|
|
1171
|
+
RwBitmap* rm;
|
|
1172
|
+
RwBitmap_Data_Get_Struct(v_mask, rm);
|
|
1173
|
+
RwCheckResource(rm);
|
|
1174
|
+
hbmmask = rw_dib2ddb(rm);
|
|
1175
|
+
} else {
|
|
1176
|
+
DeleteObject(hbmimg);
|
|
1177
|
+
rb_raise(rb_eArgError, "Not a Bitmap");
|
|
1178
|
+
}
|
|
1179
|
+
r = ImageList_Add(ri->himagelist, hbmimg, hbmmask);
|
|
1180
|
+
|
|
1181
|
+
DeleteObject(hbmimg);
|
|
1182
|
+
if(hbmmask) DeleteObject(hbmmask);
|
|
1183
|
+
if(r==-1) rb_raise(rb_eRuntimeError, "ImageList_Add failed");
|
|
1184
|
+
return self;
|
|
1185
|
+
}
|
|
1186
|
+
|
|
1187
|
+
static VALUE
|
|
1188
|
+
rwimagelist_addmasked(VALUE self, VALUE v_bmi, VALUE maskcolor){
|
|
1189
|
+
HBITMAP hbmimg;
|
|
1190
|
+
int r;
|
|
1191
|
+
RwImagelist *ri = DATA_PTR(self);
|
|
1192
|
+
RwCheckResource(ri);
|
|
1193
|
+
if(rb_typeddata_is_kind_of(v_bmi, &rwbitmap_data_type)){
|
|
1194
|
+
RwBitmap* rb;
|
|
1195
|
+
RwBitmap_Data_Get_Struct(v_bmi, rb);
|
|
1196
|
+
RwCheckResource(rb);
|
|
1197
|
+
hbmimg = rw_dib2ddb(rb);
|
|
1198
|
+
} else {
|
|
1199
|
+
rb_raise(rb_eArgError, "Not a Bitmap");
|
|
1200
|
+
}
|
|
1201
|
+
r = ImageList_AddMasked(ri->himagelist, hbmimg, NUM2UINT(maskcolor));
|
|
1202
|
+
DeleteObject(hbmimg);
|
|
1203
|
+
|
|
1204
|
+
if(r<0) rb_raise(rb_eRuntimeError, "ImageList_AddMasked failed");
|
|
1205
|
+
return self;
|
|
1206
|
+
}
|
|
1207
|
+
|
|
1208
|
+
static VALUE
|
|
1209
|
+
rwimagelist_removeimage(VALUE self, VALUE idx){
|
|
1210
|
+
int r;
|
|
1211
|
+
RwImagelist *ri = DATA_PTR(self);
|
|
1212
|
+
RwCheckResource(ri);
|
|
1213
|
+
r = ImageList_Remove(ri->himagelist, FIX2INT(idx));
|
|
1214
|
+
return r ? self : Qnil;
|
|
1215
|
+
}
|
|
1216
|
+
|
|
1217
|
+
static VALUE
|
|
1218
|
+
rwimagelist_removeallimage(VALUE self){
|
|
1219
|
+
int r;
|
|
1220
|
+
RwImagelist *ri = DATA_PTR(self);
|
|
1221
|
+
RwCheckResource(ri);
|
|
1222
|
+
r = ImageList_RemoveAll(ri->himagelist);
|
|
1223
|
+
return r ? self : Qnil;
|
|
1224
|
+
}
|
|
1225
|
+
|
|
1226
|
+
static VALUE
|
|
1227
|
+
rwimagelist_countimage(VALUE self){
|
|
1228
|
+
int r;
|
|
1229
|
+
RwImagelist *ri = DATA_PTR(self);
|
|
1230
|
+
RwCheckResource(ri);
|
|
1231
|
+
r = ImageList_GetImageCount(ri->himagelist);
|
|
1232
|
+
return INT2FIX(r);
|
|
1233
|
+
}
|
|
1234
|
+
|
|
1235
|
+
static VALUE
|
|
1236
|
+
rwimagelist_himglist(VALUE self){
|
|
1237
|
+
RwImagelist *ri = DATA_PTR(self);
|
|
1238
|
+
RwCheckResource(ri);
|
|
1239
|
+
return ULONG_PTR2NUM((ULONG_PTR)ri->himagelist);
|
|
1240
|
+
}
|
|
1241
|
+
|
|
1242
|
+
static VALUE
|
|
1243
|
+
rwimagelist_geticon(int argc, VALUE* argv, VALUE self){
|
|
1244
|
+
RwIcon *icon;
|
|
1245
|
+
int idx;
|
|
1246
|
+
UINT flags;
|
|
1247
|
+
HICON hicon;
|
|
1248
|
+
VALUE robj, v_idx, v_flags;
|
|
1249
|
+
RwImagelist *ri = DATA_PTR(self);
|
|
1250
|
+
RwCheckResource(ri);
|
|
1251
|
+
rb_scan_args(argc, argv, "11", &v_idx, &v_flags);
|
|
1252
|
+
idx = NUM2UINT(v_idx);
|
|
1253
|
+
flags = NIL_P(v_flags) ? ILD_NORMAL : NUM2UINT(v_flags);
|
|
1254
|
+
|
|
1255
|
+
hicon = ImageList_GetIcon(ri->himagelist, idx, flags);
|
|
1256
|
+
if(!hicon) rb_raise(rb_eRuntimeError, "ImageList_GetIcon failed");
|
|
1257
|
+
robj = RwIcon_Data_Make_Struct(cRwIcon, icon);
|
|
1258
|
+
Register_rsc(hicon, robj);
|
|
1259
|
+
icon->hicon = hicon;
|
|
1260
|
+
icon->shared = FALSE;
|
|
1261
|
+
return robj;
|
|
1262
|
+
}
|
|
1263
|
+
|
|
1264
|
+
static VALUE
|
|
1265
|
+
rwimagelist_getimageinfo(VALUE self, VALUE v_idx){
|
|
1266
|
+
CStructData *cs;
|
|
1267
|
+
IMAGEINFO iminfo;
|
|
1268
|
+
int idx;
|
|
1269
|
+
VALUE v_iminfo;
|
|
1270
|
+
|
|
1271
|
+
RwImagelist *ri = DATA_PTR(self);
|
|
1272
|
+
idx = NUM2INT(v_idx);
|
|
1273
|
+
RwCheckResource(ri);
|
|
1274
|
+
if(ImageList_GetImageInfo(ri->himagelist, idx, &iminfo)==0){
|
|
1275
|
+
rb_raise(rb_eRuntimeError, "ImageList_GetImageInfo failed for idx:%d", idx);
|
|
1276
|
+
}
|
|
1277
|
+
|
|
1278
|
+
v_iminfo = CStruct_Data_Make_Struct(ccsIMAGEINFO, cs);
|
|
1279
|
+
// cst_set_memory_to_struct(cs, (char*)&iminfo, (unsigned)sizeof(IMAGEINFO));
|
|
1280
|
+
cs->dtstr = malloc(sizeof(IMAGEINFO));
|
|
1281
|
+
if(!cs->dtstr) rb_raise(rb_eRuntimeError,"Failed to allocate memory");
|
|
1282
|
+
memcpy(cs->dtstr, (char*)&iminfo, sizeof(IMAGEINFO));
|
|
1283
|
+
|
|
1284
|
+
return v_iminfo;
|
|
1285
|
+
}
|
|
1286
|
+
|
|
1287
|
+
static VALUE
|
|
1288
|
+
rwimagelist_getbkcolor(VALUE self){
|
|
1289
|
+
COLORREF c;
|
|
1290
|
+
RwImagelist *ri = DATA_PTR(self);
|
|
1291
|
+
RwCheckResource(ri);
|
|
1292
|
+
c = ImageList_GetBkColor(ri->himagelist);
|
|
1293
|
+
return (c==CLR_NONE) ? Qnil : INT2FIX(c);
|
|
1294
|
+
}
|
|
1295
|
+
|
|
1296
|
+
static VALUE
|
|
1297
|
+
rwimagelist_setbkcolor(VALUE self, VALUE v_bk){
|
|
1298
|
+
COLORREF c;
|
|
1299
|
+
RwImagelist *ri = DATA_PTR(self);
|
|
1300
|
+
RwCheckResource(ri);
|
|
1301
|
+
c = (NIL_P(v_bk)) ? CLR_NONE : (COLORREF)FIX2INT(v_bk);
|
|
1302
|
+
ImageList_SetBkColor(ri->himagelist, c);
|
|
1303
|
+
return self;
|
|
1304
|
+
}
|
|
1305
|
+
|
|
1306
|
+
static VALUE
|
|
1307
|
+
rwimagelist_addicon(VALUE self, VALUE v_ico){
|
|
1308
|
+
int r;
|
|
1309
|
+
RwIcon *ico;
|
|
1310
|
+
RwImagelist *ri = DATA_PTR(self);
|
|
1311
|
+
RwCheckResource(ri);
|
|
1312
|
+
RwIcon_Data_Get_Struct(v_ico, ico);
|
|
1313
|
+
r = ImageList_AddIcon(ri->himagelist, ico->hicon);
|
|
1314
|
+
if(r<0)rb_raise(rb_eRuntimeError,"Imagelist_AddIcon failed(hicon=%#x)",
|
|
1315
|
+
(int)(ULONG_PTR)ico->hicon);
|
|
1316
|
+
return self;
|
|
1317
|
+
}
|
|
1318
|
+
|
|
1319
|
+
static VALUE
|
|
1320
|
+
rwimagelist_resize(VALUE self, VALUE newsize){
|
|
1321
|
+
RwImagelist *ri = DATA_PTR(self);
|
|
1322
|
+
int r = ImageList_SetImageCount(ri->himagelist, FIX2INT(newsize));
|
|
1323
|
+
if(!r) rb_raise(rb_eRuntimeError, "failed to resize");
|
|
1324
|
+
return self;
|
|
1325
|
+
}
|
|
1326
|
+
|
|
1327
|
+
static VALUE
|
|
1328
|
+
rwimagelist_merge(VALUE self, int i1, VALUE other, int i2, int dx, int dy){
|
|
1329
|
+
VALUE newimg;
|
|
1330
|
+
RwImagelist *rio, *rinew;
|
|
1331
|
+
RwImagelist *ri = DATA_PTR(self);
|
|
1332
|
+
RwCheckResource(ri);
|
|
1333
|
+
RwImagelist_Data_Get_Struct(other, rio);
|
|
1334
|
+
RwCheckResource(rio);
|
|
1335
|
+
newimg = RwImagelist_Data_Make_Struct(CLASS_OF(self), rinew);
|
|
1336
|
+
rinew->himagelist = ImageList_Merge(ri->himagelist, FIX2INT(i1),
|
|
1337
|
+
rio->himagelist, FIX2INT(i2), FIX2INT(dx), FIX2INT(dy));
|
|
1338
|
+
if(!rinew->himagelist) rb_raise(rb_eRuntimeError, "failed to merge");
|
|
1339
|
+
Register_rsc(rinew->himagelist, newimg);
|
|
1340
|
+
return newimg;
|
|
1341
|
+
}
|
|
1342
|
+
|
|
1343
|
+
static VALUE
|
|
1344
|
+
rwimagelist_replace(VALUE self,VALUE v_idx, VALUE v_bmp, VALUE v_mask){
|
|
1345
|
+
int r;
|
|
1346
|
+
RwBitmap *rb , *rm;
|
|
1347
|
+
HBITMAP hbmp;
|
|
1348
|
+
HBITMAP hmask = NULL;
|
|
1349
|
+
RwImagelist *ri = DATA_PTR(self);
|
|
1350
|
+
RwCheckResource(ri);
|
|
1351
|
+
RwBitmap_Data_Get_Struct(v_bmp, rb);
|
|
1352
|
+
hbmp = rw_dib2ddb(rb);
|
|
1353
|
+
if(!NIL_P(v_mask)){
|
|
1354
|
+
RwBitmap_Data_Get_Struct(v_mask, rm);
|
|
1355
|
+
hmask = rw_dib2ddb(rm);
|
|
1356
|
+
}
|
|
1357
|
+
r = ImageList_Replace(ri->himagelist, FIX2INT(v_idx), hbmp, hmask);
|
|
1358
|
+
// fprintf(stderr, "@1456: r=%d\n", r);
|
|
1359
|
+
return r ? self : Qnil;
|
|
1360
|
+
}
|
|
1361
|
+
|
|
1362
|
+
static VALUE
|
|
1363
|
+
rwimagelist_replace_icon(VALUE self,VALUE v_idx, VALUE v_icon){
|
|
1364
|
+
int r;
|
|
1365
|
+
RwIcon *rico;
|
|
1366
|
+
RwImagelist *ri = DATA_PTR(self);
|
|
1367
|
+
RwCheckResource(ri);
|
|
1368
|
+
RwIcon_Data_Get_Struct(v_icon, rico);
|
|
1369
|
+
r = ImageList_ReplaceIcon(ri->himagelist, FIX2INT(v_idx), rico->hicon);
|
|
1370
|
+
return r ? self : Qnil;
|
|
1371
|
+
}
|
|
1372
|
+
|
|
1373
|
+
static VALUE
|
|
1374
|
+
rwimagelist_geticonsize(VALUE self){
|
|
1375
|
+
int cx, cy;
|
|
1376
|
+
RwImagelist *ri = DATA_PTR(self);
|
|
1377
|
+
RwCheckResource(ri);
|
|
1378
|
+
ImageList_GetIconSize(ri->himagelist, &cx, &cy);
|
|
1379
|
+
return rb_ary_new3(2, INT2FIX(cx), INT2FIX(cy));
|
|
1380
|
+
}
|
|
1381
|
+
|
|
1382
|
+
static VALUE
|
|
1383
|
+
rwimagelist_duplicate(VALUE self){
|
|
1384
|
+
VALUE robj;
|
|
1385
|
+
RwImagelist *rinew;
|
|
1386
|
+
HIMAGELIST himagelistnew;
|
|
1387
|
+
RwImagelist *ri = DATA_PTR(self);
|
|
1388
|
+
RwCheckResource(ri);
|
|
1389
|
+
himagelistnew = ImageList_Duplicate(ri->himagelist);
|
|
1390
|
+
robj = RwImagelist_Data_Make_Struct(rb_class_of(self), rinew);
|
|
1391
|
+
rinew->himagelist = himagelistnew;
|
|
1392
|
+
rinew->type = RcImagelist;
|
|
1393
|
+
Register_rsc(himagelistnew, robj);
|
|
1394
|
+
return robj;
|
|
1395
|
+
}
|
|
1396
|
+
|
|
1397
|
+
/*
|
|
1398
|
+
# Usage:
|
|
1399
|
+
Imagelist#_dump(downlevel=nil)
|
|
1400
|
+
*/
|
|
1401
|
+
static VALUE
|
|
1402
|
+
rwimagelist_dump(int argc, VALUE* argv, VALUE self){
|
|
1403
|
+
LPSTREAM pstream;
|
|
1404
|
+
VALUE robj = Qnil;
|
|
1405
|
+
if(CreateStreamOnHGlobal(NULL, TRUE, &pstream)==S_OK){
|
|
1406
|
+
BOOL res;
|
|
1407
|
+
DWORD flag;
|
|
1408
|
+
RwImagelist *ri = DATA_PTR(self);
|
|
1409
|
+
flag = (argc>0 && argv[0]==Qtrue) ? ILP_DOWNLEVEL : ILP_NORMAL;
|
|
1410
|
+
if(FIX2INT(COMCTL_MAJOR_VERSION)==6){
|
|
1411
|
+
HANDLE hdll = LoadLibrary(TEXT("comctl32.dll"));
|
|
1412
|
+
FARPROC pImageList_WriteEx = GetProcAddress(hdll, "ImageList_WriteEx");
|
|
1413
|
+
res = (pImageList_WriteEx(ri->himagelist, flag, pstream)==S_OK);
|
|
1414
|
+
} else {
|
|
1415
|
+
res = ImageList_Write(ri->himagelist, pstream);
|
|
1416
|
+
}
|
|
1417
|
+
if(res){
|
|
1418
|
+
robj = stream2string(pstream);
|
|
1419
|
+
} else {
|
|
1420
|
+
pstream->lpVtbl->Release(pstream);
|
|
1421
|
+
rb_raise(rb_eRuntimeError, "failed to dump Imagelist");
|
|
1422
|
+
}
|
|
1423
|
+
} else {
|
|
1424
|
+
rb_raise(rb_eRuntimeError, "failed to createstream");
|
|
1425
|
+
}
|
|
1426
|
+
return robj;
|
|
1427
|
+
}
|
|
1428
|
+
|
|
1429
|
+
static VALUE
|
|
1430
|
+
rwimagelist1__load(VALUE klass, VALUE str){
|
|
1431
|
+
VALUE fstring;
|
|
1432
|
+
HGLOBAL hglobal;
|
|
1433
|
+
HRESULT hres;
|
|
1434
|
+
HIMAGELIST himagelist;
|
|
1435
|
+
LPSTREAM pstream;
|
|
1436
|
+
long len;
|
|
1437
|
+
VALUE robj;
|
|
1438
|
+
|
|
1439
|
+
fstring = StringValue(str);
|
|
1440
|
+
len = RSTRING_LEN(fstring);
|
|
1441
|
+
hglobal = GlobalAlloc(GPTR, len);
|
|
1442
|
+
if (!hglobal) rb_raise(rb_eRuntimeError, "can't allocate Global memory");
|
|
1443
|
+
hres = CreateStreamOnHGlobal(hglobal, TRUE, &pstream);
|
|
1444
|
+
if(hres==S_OK){
|
|
1445
|
+
RwImagelist *ri;
|
|
1446
|
+
char *buffer = GlobalLock(hglobal);
|
|
1447
|
+
memcpy(buffer, RSTRING_PTR(fstring), len);
|
|
1448
|
+
GlobalUnlock(hglobal);
|
|
1449
|
+
if(himagelist = ImageList_Read(pstream)){
|
|
1450
|
+
robj = RwImagelist_Data_Make_Struct(klass, ri);
|
|
1451
|
+
ri->himagelist = himagelist;
|
|
1452
|
+
ri->type = RcImagelist;
|
|
1453
|
+
Register_rsc(himagelist, robj);
|
|
1454
|
+
pstream->lpVtbl->Release(pstream);
|
|
1455
|
+
} else {
|
|
1456
|
+
pstream->lpVtbl->Release(pstream);
|
|
1457
|
+
rb_raise(rb_eRuntimeError, "failed to load Imagelist");
|
|
1458
|
+
}
|
|
1459
|
+
} else {
|
|
1460
|
+
rb_raise(rb_eRuntimeError, "failed to create stream");
|
|
1461
|
+
}
|
|
1462
|
+
return robj;
|
|
1463
|
+
}
|
|
1464
|
+
|
|
1465
|
+
static void
|
|
1466
|
+
rw_init_Imagelist(){
|
|
1467
|
+
cRwImagelist = rb_define_class_under(mRwin, "Imagelist", rb_cData);
|
|
1468
|
+
rb_define_alloc_func(cRwImagelist, alloc_rwimagelist);
|
|
1469
|
+
rb_define_method(cRwImagelist, "initialize", rwimagelist_initialize, -1);
|
|
1470
|
+
rb_define_method(cRwImagelist, "delete", rwimagelist_delete, 0);
|
|
1471
|
+
rb_define_method(cRwImagelist, "dispose", rwimagelist_delete, 0);
|
|
1472
|
+
rb_define_method(cRwImagelist, "add", rwimagelist_add, -1);
|
|
1473
|
+
rb_define_method(cRwImagelist, "addmasked", rwimagelist_addmasked, 2);
|
|
1474
|
+
rb_define_method(cRwImagelist, "remove", rwimagelist_removeimage, 1);
|
|
1475
|
+
rb_define_method(cRwImagelist, "clear", rwimagelist_removeallimage, 0);
|
|
1476
|
+
rb_define_method(cRwImagelist, "size", rwimagelist_countimage, 0);
|
|
1477
|
+
rb_define_method(cRwImagelist, "_himagelist", rwimagelist_himglist, 0);
|
|
1478
|
+
rb_define_method(cRwImagelist, "icon", rwimagelist_geticon, -1);
|
|
1479
|
+
rb_define_method(cRwImagelist, "imageinfo", rwimagelist_getimageinfo, 1);
|
|
1480
|
+
rb_define_method(cRwImagelist, "bkcolor", rwimagelist_getbkcolor, 0);
|
|
1481
|
+
rb_define_method(cRwImagelist, "bkcolor=", rwimagelist_setbkcolor, 1);
|
|
1482
|
+
rb_define_method(cRwImagelist, "addicon", rwimagelist_addicon, 1);
|
|
1483
|
+
rb_define_method(cRwImagelist, "resize", rwimagelist_resize, 1);
|
|
1484
|
+
rb_define_method(cRwImagelist, "merge", rwimagelist_merge, 5);
|
|
1485
|
+
rb_define_method(cRwImagelist, "replace", rwimagelist_replace, 3);
|
|
1486
|
+
rb_define_method(cRwImagelist, "replaceicon", rwimagelist_replace_icon, 2);
|
|
1487
|
+
rb_define_method(cRwImagelist, "iconsize", rwimagelist_geticonsize, 0);
|
|
1488
|
+
rb_define_method(cRwImagelist, "dup", rwimagelist_duplicate, 0);
|
|
1489
|
+
|
|
1490
|
+
rb_define_method(cRwImagelist, "_dump", rwimagelist_dump, -1);
|
|
1491
|
+
rb_define_singleton_method(cRwImagelist, "_load", rwimagelist1__load, 1);
|
|
1492
|
+
}
|
|
1493
|
+
|
|
1494
|
+
/* Font */
|
|
1495
|
+
|
|
1496
|
+
VALUE cRwFont;
|
|
1497
|
+
static void
|
|
1498
|
+
rwfont_free(void* ptr){
|
|
1499
|
+
RwFont* rf = ptr;
|
|
1500
|
+
if (rf->hfont && !rf->external) DeleteObject(rf->hfont);
|
|
1501
|
+
free(rf);
|
|
1502
|
+
}
|
|
1503
|
+
|
|
1504
|
+
static size_t
|
|
1505
|
+
rwfont_memsize(const void *ptr){
|
|
1506
|
+
return ptr ? sizeof(RwFont) : 0;
|
|
1507
|
+
}
|
|
1508
|
+
|
|
1509
|
+
const rb_data_type_t
|
|
1510
|
+
rwfont_data_type = {
|
|
1511
|
+
"Font", {NULL, rwfont_free, rwfont_memsize}, NULL, NULL
|
|
1512
|
+
};
|
|
1513
|
+
|
|
1514
|
+
static VALUE
|
|
1515
|
+
alloc_rwfont(VALUE klass){
|
|
1516
|
+
RwFont *rf;
|
|
1517
|
+
VALUE robj = RwFont_Data_Make_Struct(klass, rf);
|
|
1518
|
+
rf->type = RcFont;
|
|
1519
|
+
return robj;
|
|
1520
|
+
}
|
|
1521
|
+
|
|
1522
|
+
static VALUE
|
|
1523
|
+
rwfont_initialize(int argc, VALUE *argv, VALUE self){
|
|
1524
|
+
RwFont *rf = DATA_PTR(self);
|
|
1525
|
+
if (argc==1){
|
|
1526
|
+
CStructData *cs;
|
|
1527
|
+
LOGFONT *lf;
|
|
1528
|
+
if(!rb_typeddata_is_kind_of(argv[0], &cstruct_data_type)){
|
|
1529
|
+
rb_raise(rb_eArgError, "Not CStruct");
|
|
1530
|
+
}
|
|
1531
|
+
CStruct_Data_Get_Struct(argv[0], cs);
|
|
1532
|
+
lf = (LOGFONT*)(cs->dtstr + cs->dtoffset);
|
|
1533
|
+
rf->hfont = CreateFontIndirect(lf);
|
|
1534
|
+
} else {
|
|
1535
|
+
LOGFONT lf;
|
|
1536
|
+
TCHAR *fontname;
|
|
1537
|
+
size_t n;
|
|
1538
|
+
VALUE v_name, v_height, v_weight, v_italic, v_underline, v_strikeout;
|
|
1539
|
+
rb_scan_args(argc, argv, "24",
|
|
1540
|
+
&v_name, &v_height, &v_weight, &v_italic, &v_underline, &v_strikeout);
|
|
1541
|
+
fontname = rw_str2tchar2(v_name, &n);
|
|
1542
|
+
if(n/sizeof(TCHAR) > LF_FACESIZE){
|
|
1543
|
+
rb_raise(rb_eArgError, "face name size over (>%d)", LF_FACESIZE);
|
|
1544
|
+
}
|
|
1545
|
+
ZeroMemory(&lf, sizeof(LOGFONT));
|
|
1546
|
+
memcpy(lf.lfFaceName, fontname, n);
|
|
1547
|
+
lf.lfHeight = FIX2INT(v_height);
|
|
1548
|
+
lf.lfWeight = NIL_P(v_weight) ? FW_DONTCARE : FIX2INT(v_weight);
|
|
1549
|
+
lf.lfItalic = (NIL_P(v_italic) || !v_italic) ? FALSE : TRUE;
|
|
1550
|
+
lf.lfUnderline = (NIL_P(v_underline) || !v_underline) ? FALSE : TRUE;
|
|
1551
|
+
lf.lfStrikeOut = (NIL_P(v_strikeout) || !v_strikeout) ? FALSE : TRUE;
|
|
1552
|
+
lf.lfCharSet = DEFAULT_CHARSET;
|
|
1553
|
+
rf->hfont = CreateFontIndirect(&lf);
|
|
1554
|
+
}
|
|
1555
|
+
if(!rf->hfont) rb_raise(rb_eRuntimeError, "CreateFont failed");
|
|
1556
|
+
Register_rsc(rf->hfont, self);
|
|
1557
|
+
return self;
|
|
1558
|
+
}
|
|
1559
|
+
|
|
1560
|
+
static VALUE
|
|
1561
|
+
rwfont1_wrap_hfont(VALUE klass, VALUE v_hfont){
|
|
1562
|
+
RwFont* rf;
|
|
1563
|
+
VALUE robj = RwFont_Data_Make_Struct(klass, rf);
|
|
1564
|
+
rf->hfont = (HANDLE)NUM2ULONG_PTR(v_hfont);
|
|
1565
|
+
rf->type = RcFont;
|
|
1566
|
+
rf->external = 1;
|
|
1567
|
+
return robj;
|
|
1568
|
+
}
|
|
1569
|
+
|
|
1570
|
+
static VALUE
|
|
1571
|
+
rwfont_fname(VALUE self){
|
|
1572
|
+
LOGFONT lf;
|
|
1573
|
+
RwFont *rf = DATA_PTR(self);
|
|
1574
|
+
if(!rf->hfont) return Qnil;
|
|
1575
|
+
GetObject(rf->hfont, sizeof(LOGFONT), &lf);
|
|
1576
|
+
return rw_encode_external(lf.lfFaceName);
|
|
1577
|
+
}
|
|
1578
|
+
|
|
1579
|
+
static VALUE
|
|
1580
|
+
rwfont_height(VALUE self){
|
|
1581
|
+
LOGFONT lf;
|
|
1582
|
+
RwFont *rf = DATA_PTR(self);
|
|
1583
|
+
if(!rf->hfont) return Qnil;
|
|
1584
|
+
GetObject(rf->hfont, sizeof(LOGFONT), &lf);
|
|
1585
|
+
return INT2NUM(lf.lfHeight);
|
|
1586
|
+
}
|
|
1587
|
+
|
|
1588
|
+
static VALUE
|
|
1589
|
+
rwfont_hfont(VALUE self){
|
|
1590
|
+
RwFont *rf = DATA_PTR(self);
|
|
1591
|
+
return ULONG_PTR2NUM((ULONG_PTR)rf->hfont);
|
|
1592
|
+
}
|
|
1593
|
+
|
|
1594
|
+
static VALUE
|
|
1595
|
+
rwfont_delete(VALUE self){
|
|
1596
|
+
RwFont *rf = DATA_PTR(self);
|
|
1597
|
+
if (rf->external) rb_raise(rb_eRuntimeError, "external font can't be deleted");
|
|
1598
|
+
Unregister_rsc(rf->hfont);
|
|
1599
|
+
DeleteObject(rf->hfont);
|
|
1600
|
+
rf->hfont=0;
|
|
1601
|
+
return Qtrue;
|
|
1602
|
+
}
|
|
1603
|
+
|
|
1604
|
+
static VALUE
|
|
1605
|
+
rwfont_logfont(VALUE self){
|
|
1606
|
+
RwFont *rf = DATA_PTR(self);
|
|
1607
|
+
if(!rf->hfont) {
|
|
1608
|
+
return Qnil;
|
|
1609
|
+
} else {
|
|
1610
|
+
CStructData *cd;
|
|
1611
|
+
VALUE v_lf = CStruct_Data_Make_Struct(ccsLOGFONT, cd);
|
|
1612
|
+
cd->dtstr = malloc(sizeof(LOGFONT));
|
|
1613
|
+
GetObject(rf->hfont, sizeof(LOGFONT), cd->dtstr);
|
|
1614
|
+
cd->dtoffset = 0;
|
|
1615
|
+
cd->dtlen = sizeof(LOGFONT);
|
|
1616
|
+
cd->dtparent = 0;
|
|
1617
|
+
cd->dtreferences = 0;
|
|
1618
|
+
cd->dtwrapped = 0;
|
|
1619
|
+
return v_lf;
|
|
1620
|
+
}
|
|
1621
|
+
}
|
|
1622
|
+
|
|
1623
|
+
static VALUE
|
|
1624
|
+
rwfont_external_p(VALUE self){
|
|
1625
|
+
RwFont *rf = DATA_PTR(self);
|
|
1626
|
+
return rf->external ? Qtrue : Qfalse;
|
|
1627
|
+
}
|
|
1628
|
+
|
|
1629
|
+
static void
|
|
1630
|
+
rw_init_Font(){
|
|
1631
|
+
cRwFont = rb_define_class_under(mRwin, "Font", rb_cData);
|
|
1632
|
+
rb_define_alloc_func(cRwFont, alloc_rwfont);
|
|
1633
|
+
rb_define_singleton_method(cRwFont,"wraphandle", rwfont1_wrap_hfont, 1);
|
|
1634
|
+
|
|
1635
|
+
rb_define_method(cRwFont, "initialize", rwfont_initialize, -1);
|
|
1636
|
+
rb_define_method(cRwFont, "facename", rwfont_fname, 0);
|
|
1637
|
+
rb_define_method(cRwFont, "height", rwfont_height, 0);
|
|
1638
|
+
rb_define_method(cRwFont, "_hfont", rwfont_hfont, 0);
|
|
1639
|
+
rb_define_method(cRwFont, "dispose", rwfont_delete, 0);
|
|
1640
|
+
rb_define_method(cRwFont, "logfont", rwfont_logfont, 0);
|
|
1641
|
+
rb_define_method(cRwFont, "external?", rwfont_external_p, 0);
|
|
1642
|
+
}
|
|
1643
|
+
|
|
1644
|
+
/* Menu */
|
|
1645
|
+
|
|
1646
|
+
VALUE cRwMenu;
|
|
1647
|
+
|
|
1648
|
+
void
|
|
1649
|
+
rwmenu_free(void* ptr){
|
|
1650
|
+
RwMenu* rm = ptr;
|
|
1651
|
+
if(rm->hmenu) {
|
|
1652
|
+
Unregister_rsc(rm->hmenu);
|
|
1653
|
+
DestroyMenu(rm->hmenu);
|
|
1654
|
+
}
|
|
1655
|
+
free(rm);
|
|
1656
|
+
}
|
|
1657
|
+
|
|
1658
|
+
static size_t
|
|
1659
|
+
rwmenu_memsize(const void *ptr){
|
|
1660
|
+
return ptr ? sizeof(RwMenu) : 0;
|
|
1661
|
+
}
|
|
1662
|
+
|
|
1663
|
+
const rb_data_type_t
|
|
1664
|
+
rwmenu_data_type = {
|
|
1665
|
+
"Menu", {NULL, rwmenu_free, rwmenu_memsize}, NULL, NULL
|
|
1666
|
+
};
|
|
1667
|
+
|
|
1668
|
+
static VALUE
|
|
1669
|
+
alloc_rwmenu(VALUE klass){
|
|
1670
|
+
RwMenu *rm;
|
|
1671
|
+
VALUE robj = RwMenu_Data_Make_Struct(klass, rm);
|
|
1672
|
+
rm->type = RcMenu;
|
|
1673
|
+
rm->hmenu = 0;
|
|
1674
|
+
rm->hwnd = 0;
|
|
1675
|
+
return robj;
|
|
1676
|
+
}
|
|
1677
|
+
|
|
1678
|
+
static VALUE
|
|
1679
|
+
rwmenu_hmenu(VALUE self){
|
|
1680
|
+
RwMenu *rm = DATA_PTR(self);
|
|
1681
|
+
return ULONG_PTR2NUM((ULONG_PTR)rm->hmenu);
|
|
1682
|
+
}
|
|
1683
|
+
|
|
1684
|
+
static VALUE
|
|
1685
|
+
rwmenu_alive_p(VALUE self){
|
|
1686
|
+
RwMenu *rm = DATA_PTR(self);
|
|
1687
|
+
return rm->hmenu ? Qtrue : Qfalse;
|
|
1688
|
+
}
|
|
1689
|
+
|
|
1690
|
+
static VALUE
|
|
1691
|
+
rwmenu_createmenu(VALUE self){
|
|
1692
|
+
RwMenu *rm = DATA_PTR(self);
|
|
1693
|
+
rm->hmenu = CreateMenu();
|
|
1694
|
+
Register_rsc(rm->hmenu, self);
|
|
1695
|
+
return self;
|
|
1696
|
+
}
|
|
1697
|
+
|
|
1698
|
+
static VALUE
|
|
1699
|
+
rwmenu_createpopup(VALUE self){
|
|
1700
|
+
RwMenu *rm = DATA_PTR(self);
|
|
1701
|
+
rm->hmenu = CreatePopupMenu();
|
|
1702
|
+
Register_rsc(rm->hmenu, self);
|
|
1703
|
+
return self;
|
|
1704
|
+
}
|
|
1705
|
+
|
|
1706
|
+
static VALUE
|
|
1707
|
+
rwmenu_insert(int argc, VALUE *argv, VALUE self){
|
|
1708
|
+
int r;
|
|
1709
|
+
VALUE v_next, v_byposition, v_item, v_type, v_idcmd;
|
|
1710
|
+
BOOL fByPosition;
|
|
1711
|
+
MENUITEMINFO *mii;
|
|
1712
|
+
RwMenu *rm = DATA_PTR(self);
|
|
1713
|
+
if(argc==3 && rb_class_of(argv[2])==ccsMENUITEMINFO){ /* if MENUITEMINFO */
|
|
1714
|
+
CStructData *cs;
|
|
1715
|
+
v_next = argv[0];
|
|
1716
|
+
v_byposition = argv[1];
|
|
1717
|
+
fByPosition = (NIL_P(v_byposition) || !v_byposition) ? FALSE : TRUE;
|
|
1718
|
+
CStruct_Data_Get_Struct(argv[2], cs);
|
|
1719
|
+
mii = (MENUITEMINFO*)(cs->dtstr + cs->dtoffset);
|
|
1720
|
+
r = InsertMenuItem(rm->hmenu, FIX2INT(v_next), fByPosition, mii);
|
|
1721
|
+
} else { /* if Array */
|
|
1722
|
+
size_t len;
|
|
1723
|
+
mii = calloc(sizeof(MENUITEMINFO), 1);
|
|
1724
|
+
rb_scan_args(argc, argv, "41", &v_next, &v_byposition, &v_item, &v_idcmd, &v_type);
|
|
1725
|
+
mii->cbSize = sizeof(MENUITEMINFO);
|
|
1726
|
+
if(rb_typeddata_is_kind_of(v_idcmd, &rwmenu_data_type)){
|
|
1727
|
+
RwMenu* mi;
|
|
1728
|
+
RwMenu_Data_Get_Struct(v_idcmd, mi);
|
|
1729
|
+
RwCheckResource(mi);
|
|
1730
|
+
mii->fMask = MIIM_TYPE | MIIM_SUBMENU;
|
|
1731
|
+
mii->hSubMenu = mi->hmenu;
|
|
1732
|
+
} else {
|
|
1733
|
+
mii->fMask = MIIM_TYPE | MIIM_ID;
|
|
1734
|
+
mii->wID = FIX2INT(v_idcmd);
|
|
1735
|
+
}
|
|
1736
|
+
mii->fType = NIL_P(v_type) ? MFT_STRING : NUM2INT(v_type);
|
|
1737
|
+
mii->dwTypeData = rw_str2tchar2(v_item, &len);
|
|
1738
|
+
mii->cch = len/sizeof(TCHAR);
|
|
1739
|
+
fByPosition = (NIL_P(v_byposition) || !v_byposition) ? FALSE : TRUE;
|
|
1740
|
+
r = InsertMenuItem(rm->hmenu, FIX2INT(v_next), fByPosition, mii);
|
|
1741
|
+
free(mii);
|
|
1742
|
+
}
|
|
1743
|
+
if(!r) rb_raise(rb_eRuntimeError, "failed to insert menu");
|
|
1744
|
+
if(rm->hwnd) DrawMenuBar(rm->hwnd);
|
|
1745
|
+
return self;
|
|
1746
|
+
}
|
|
1747
|
+
|
|
1748
|
+
/*static void
|
|
1749
|
+
rwmenu_do_destroy(RwMenu* rm){
|
|
1750
|
+
int i;
|
|
1751
|
+
for(i=0; i<GetMenuItemCount(rm->hmenu); i++){
|
|
1752
|
+
HMENU hsubmenu = GetSubMenu(rm->hmenu, i);
|
|
1753
|
+
if(hsubmenu){
|
|
1754
|
+
RwMenu* sm;
|
|
1755
|
+
VALUE v_sm = Get_rsc(hsubmenu);
|
|
1756
|
+
RwMenu_Data_Get_Struct(v_sm, sm);
|
|
1757
|
+
rwmenu_do_destroy(sm);
|
|
1758
|
+
}
|
|
1759
|
+
}
|
|
1760
|
+
Unregister_rsc(rm->hmenu);
|
|
1761
|
+
rm->hmenu = 0;
|
|
1762
|
+
}
|
|
1763
|
+
|
|
1764
|
+
static VALUE
|
|
1765
|
+
rwmenu_destroy(VALUE self){
|
|
1766
|
+
HMENU hmdispose;
|
|
1767
|
+
RwMenu *rm = DATA_PTR(self);
|
|
1768
|
+
RwCheckResource(rm);
|
|
1769
|
+
hmdispose = rm->hmenu;
|
|
1770
|
+
rwmenu_do_destroy(rm);
|
|
1771
|
+
return DestroyMenu(hmdispose) ? Qtrue : Qfalse;
|
|
1772
|
+
}*/
|
|
1773
|
+
|
|
1774
|
+
static void
|
|
1775
|
+
rwmenu_do_destroy(HMENU hm){
|
|
1776
|
+
int i;
|
|
1777
|
+
for(i=0; i<GetMenuItemCount(hm); i++){
|
|
1778
|
+
HMENU hsubmenu = GetSubMenu(hm, i);
|
|
1779
|
+
if(hsubmenu){
|
|
1780
|
+
RwMenu* sm;
|
|
1781
|
+
VALUE v_sm = Get_rsc(hsubmenu);
|
|
1782
|
+
RwMenu_Data_Get_Struct(v_sm, sm);
|
|
1783
|
+
rwmenu_do_destroy(sm->hmenu);
|
|
1784
|
+
sm->hmenu = NULL;
|
|
1785
|
+
}
|
|
1786
|
+
}
|
|
1787
|
+
Unregister_rsc(hm);
|
|
1788
|
+
}
|
|
1789
|
+
|
|
1790
|
+
static VALUE
|
|
1791
|
+
rwmenu_destroy(VALUE self){
|
|
1792
|
+
int r;
|
|
1793
|
+
RwMenu *rm = DATA_PTR(self);
|
|
1794
|
+
RwCheckResource(rm);
|
|
1795
|
+
rwmenu_do_destroy(rm->hmenu);
|
|
1796
|
+
r = DestroyMenu(rm->hmenu);
|
|
1797
|
+
rm->hmenu = NULL;
|
|
1798
|
+
return r ? Qtrue : Qfalse;
|
|
1799
|
+
}
|
|
1800
|
+
|
|
1801
|
+
static VALUE
|
|
1802
|
+
rwmenu_delete(VALUE self, VALUE v_item, VALUE v_flag){
|
|
1803
|
+
int r;
|
|
1804
|
+
UINT fByPosition;
|
|
1805
|
+
RwMenu *rm = DATA_PTR(self);
|
|
1806
|
+
RwCheckResource(rm);
|
|
1807
|
+
fByPosition = (NIL_P(v_flag) || !v_flag) ? MF_BYCOMMAND : MF_BYPOSITION;
|
|
1808
|
+
if(fByPosition){
|
|
1809
|
+
HMENU hsubmenu = GetSubMenu(rm->hmenu, NUM2UINT(v_item));
|
|
1810
|
+
if(hsubmenu){
|
|
1811
|
+
RwMenu* sm;
|
|
1812
|
+
VALUE v_sm = Get_rsc(hsubmenu);
|
|
1813
|
+
RwMenu_Data_Get_Struct(v_sm, sm);
|
|
1814
|
+
rwmenu_do_destroy(hsubmenu);
|
|
1815
|
+
sm->hmenu = NULL;
|
|
1816
|
+
}
|
|
1817
|
+
}
|
|
1818
|
+
r = DeleteMenu(rm->hmenu, NUM2UINT(v_item), fByPosition);
|
|
1819
|
+
if(rm->hwnd) DrawMenuBar(rm->hwnd);
|
|
1820
|
+
return r? Qtrue : Qfalse;
|
|
1821
|
+
}
|
|
1822
|
+
|
|
1823
|
+
static VALUE
|
|
1824
|
+
rwmenu_getmenuitemcount(VALUE self){
|
|
1825
|
+
RwMenu *rm = DATA_PTR(self);
|
|
1826
|
+
RwCheckResource(rm);
|
|
1827
|
+
return INT2NUM(GetMenuItemCount(rm->hmenu));
|
|
1828
|
+
}
|
|
1829
|
+
|
|
1830
|
+
static VALUE
|
|
1831
|
+
rwmenu_getmenuiteminfo(VALUE self, VALUE v_item, VALUE v_flag, VALUE v_info){
|
|
1832
|
+
int r;
|
|
1833
|
+
CStructData *cs; MENUITEMINFO *pmii;
|
|
1834
|
+
BOOL fByPosition;
|
|
1835
|
+
RwMenu *rm = DATA_PTR(self);
|
|
1836
|
+
RwCheckResource(rm);
|
|
1837
|
+
if(rb_class_of(v_info)!=ccsMENUITEMINFO){
|
|
1838
|
+
rb_raise(rb_eArgError, "Argument must be a MENUITEMINFO");
|
|
1839
|
+
}
|
|
1840
|
+
CStruct_Data_Get_Struct(v_info, cs); pmii = (MENUITEMINFO*)(cs->dtstr + cs->dtoffset);
|
|
1841
|
+
pmii->cbSize = sizeof(MENUITEMINFO);
|
|
1842
|
+
fByPosition = (NIL_P(v_flag) || !v_flag) ? MF_BYCOMMAND : MF_BYPOSITION;
|
|
1843
|
+
r = GetMenuItemInfo(rm->hmenu, NUM2UINT(v_item), fByPosition, pmii);
|
|
1844
|
+
return r ? v_info : Qnil;
|
|
1845
|
+
}
|
|
1846
|
+
|
|
1847
|
+
static VALUE
|
|
1848
|
+
rwmenu_setmenuiteminfo(VALUE self, VALUE v_item, VALUE v_flag, VALUE v_info){
|
|
1849
|
+
CStructData *cs; MENUITEMINFO *pmii;
|
|
1850
|
+
BOOL fByPosition;
|
|
1851
|
+
RwMenu *rm = DATA_PTR(self);
|
|
1852
|
+
RwCheckResource(rm);
|
|
1853
|
+
if(rb_class_of(v_info)!=ccsMENUITEMINFO){
|
|
1854
|
+
rb_raise(rb_eArgError, "Argument must be a MENUITEMINFO");
|
|
1855
|
+
}
|
|
1856
|
+
CStruct_Data_Get_Struct(v_info, cs); pmii = (MENUITEMINFO*)(cs->dtstr + cs->dtoffset);
|
|
1857
|
+
pmii->cbSize = sizeof(MENUITEMINFO);
|
|
1858
|
+
fByPosition = (NIL_P(v_flag) || !v_flag) ? MF_BYCOMMAND : MF_BYPOSITION;
|
|
1859
|
+
SetMenuItemInfo(rm->hmenu, NUM2UINT(v_item), fByPosition, pmii);
|
|
1860
|
+
if(rm->hwnd) DrawMenuBar(rm->hwnd);
|
|
1861
|
+
return self;
|
|
1862
|
+
}
|
|
1863
|
+
|
|
1864
|
+
/* // Tnis is obsolate on MSC of WIN64
|
|
1865
|
+
static VALUE
|
|
1866
|
+
rwmenu_getmenustring(VALUE self, VALUE v_item, VALUE v_flag){
|
|
1867
|
+
int r;
|
|
1868
|
+
BOOL fByPosition;
|
|
1869
|
+
TCHAR* buff;
|
|
1870
|
+
RwMenu *rm = DATA_PTR(self);
|
|
1871
|
+
RwCheckResource(rm);
|
|
1872
|
+
fByPosition = (NIL_P(v_flag) || !v_flag) ? MF_BYCOMMAND : MF_BYPOSITION;
|
|
1873
|
+
r = GetMenuString(rm->hmenu, NUM2INT(v_item), NULL, 0, fByPosition);
|
|
1874
|
+
if (r==0) return rb_enc_str_new_literal("", rw_external_enc);
|
|
1875
|
+
buff = alloca(r*sizeof(WCHAR));
|
|
1876
|
+
GetMenuString(rm->hmenu, NUM2INT(v_item), buff, r*sizeof(TCHAR), fByPosition);
|
|
1877
|
+
return rw_encode_external(buff);
|
|
1878
|
+
}*/
|
|
1879
|
+
|
|
1880
|
+
static VALUE
|
|
1881
|
+
rwmenu_getmenuitemid(VALUE self, VALUE v_idx){
|
|
1882
|
+
RwMenu *rm = DATA_PTR(self);
|
|
1883
|
+
return INT2FIX(GetMenuItemID(rm->hmenu, FIX2INT(v_idx)));
|
|
1884
|
+
}
|
|
1885
|
+
|
|
1886
|
+
static VALUE
|
|
1887
|
+
rwmenu_getsubmenu(VALUE self, VALUE v_idx){
|
|
1888
|
+
HMENU hmenu;
|
|
1889
|
+
RwMenu *rm = DATA_PTR(self);
|
|
1890
|
+
hmenu = GetSubMenu(rm->hmenu, FIX2INT(v_idx));
|
|
1891
|
+
return hmenu ? Get_rsc(hmenu) : Qnil;
|
|
1892
|
+
}
|
|
1893
|
+
|
|
1894
|
+
static VALUE
|
|
1895
|
+
rwwin_setmenu(VALUE self, VALUE v_menu){
|
|
1896
|
+
RwMenu *rm;
|
|
1897
|
+
RwWindow *rw = DATA_PTR(self);
|
|
1898
|
+
RwCheckWindow(rw);
|
|
1899
|
+
if (NIL_P(v_menu)){
|
|
1900
|
+
SetMenu(rw->hwnd, NULL);
|
|
1901
|
+
} else {
|
|
1902
|
+
RwMenu_Data_Get_Struct(v_menu, rm);
|
|
1903
|
+
RwCheckResource(rm);
|
|
1904
|
+
SetMenu(rw->hwnd, rm->hmenu);
|
|
1905
|
+
rm->hwnd = rw->hwnd;
|
|
1906
|
+
}
|
|
1907
|
+
DrawMenuBar(rw->hwnd);
|
|
1908
|
+
return self;
|
|
1909
|
+
}
|
|
1910
|
+
|
|
1911
|
+
static VALUE
|
|
1912
|
+
rwwin_drawmenubar(VALUE self){
|
|
1913
|
+
RwWindow *rw = DATA_PTR(self);
|
|
1914
|
+
RwCheckWindow(rw);
|
|
1915
|
+
DrawMenuBar(rw->hwnd);
|
|
1916
|
+
return self;
|
|
1917
|
+
}
|
|
1918
|
+
|
|
1919
|
+
static VALUE
|
|
1920
|
+
rwwin_trackpopupmenu(int argc, VALUE *argv, VALUE self){
|
|
1921
|
+
VALUE v_menu, v_x, v_y, v_align, v_exclude;
|
|
1922
|
+
int falign, r;
|
|
1923
|
+
RwMenu *rm;
|
|
1924
|
+
POINT pos;
|
|
1925
|
+
TPMPARAMS *lptpm;
|
|
1926
|
+
RwWindow *rw = DATA_PTR(self);
|
|
1927
|
+
RwCheckWindow(rw);
|
|
1928
|
+
rb_scan_args(argc, argv, "32", &v_menu, &v_x, &v_y, &v_align, &v_exclude);
|
|
1929
|
+
RwMenu_Data_Get_Struct(v_menu, rm);
|
|
1930
|
+
RwCheckResource(rm);
|
|
1931
|
+
falign = NIL_P(v_align) ? TPM_LEFTALIGN : FIX2INT(v_align);
|
|
1932
|
+
if(NIL_P(v_exclude)){
|
|
1933
|
+
lptpm = NULL;
|
|
1934
|
+
} else {
|
|
1935
|
+
CStructData *cs;
|
|
1936
|
+
CStruct_Data_Get_Struct(v_exclude, cs);
|
|
1937
|
+
if(cs->dtlen!=sizeof(TPMPARAMS)) {
|
|
1938
|
+
rb_raise(rb_eArgError, "last argument size is not same as TPMPARAMS's");
|
|
1939
|
+
}
|
|
1940
|
+
lptpm = (TPMPARAMS*)(cs->dtstr + cs->dtoffset);
|
|
1941
|
+
}
|
|
1942
|
+
pos.x = FIX2INT(v_x);
|
|
1943
|
+
pos.y = FIX2INT(v_y);
|
|
1944
|
+
ClientToScreen(rw->hwnd, &pos);
|
|
1945
|
+
r = TrackPopupMenuEx(rm->hmenu, falign, pos.x, pos.y, rw->hwnd, lptpm);
|
|
1946
|
+
return r ? Qtrue : Qfalse;
|
|
1947
|
+
}
|
|
1948
|
+
|
|
1949
|
+
static void
|
|
1950
|
+
rw_init_Menu(){
|
|
1951
|
+
cRwMenu = rb_define_class_under(mRwin, "Menu", rb_cData);
|
|
1952
|
+
rb_define_alloc_func(cRwMenu, alloc_rwmenu);
|
|
1953
|
+
|
|
1954
|
+
rb_define_method(cRwMenu, "_hmenu", rwmenu_hmenu, 0);
|
|
1955
|
+
rb_define_method(cRwMenu, "alive?", rwmenu_alive_p, 0);
|
|
1956
|
+
rb_define_method(cRwMenu, "createmenu", rwmenu_createmenu, 0);
|
|
1957
|
+
rb_define_method(cRwMenu, "createpopup", rwmenu_createpopup, 0);
|
|
1958
|
+
rb_define_method(cRwMenu, "insert", rwmenu_insert, -1);
|
|
1959
|
+
rb_define_method(cRwMenu, "delete", rwmenu_delete, 2);
|
|
1960
|
+
rb_define_method(cRwMenu, "destroy", rwmenu_destroy, 0);
|
|
1961
|
+
|
|
1962
|
+
|
|
1963
|
+
/* API Functions */
|
|
1964
|
+
rb_define_method(cRwMenu, "GetMenuItemCount", rwmenu_getmenuitemcount, 0);
|
|
1965
|
+
rb_define_method(cRwMenu, "GetMenuItemInfo", rwmenu_getmenuiteminfo, 3);
|
|
1966
|
+
rb_define_method(cRwMenu, "SetMenuItemInfo", rwmenu_setmenuiteminfo, 3);
|
|
1967
|
+
// rb_define_method(cRwMenu, "GetMenuString", rwmenu_getmenustring, 2);
|
|
1968
|
+
rb_define_method(cRwMenu, "GetMenuItemID", rwmenu_getmenuitemid, 1);
|
|
1969
|
+
rb_define_method(cRwMenu, "GetSubMenu", rwmenu_getsubmenu, 1);
|
|
1970
|
+
|
|
1971
|
+
/* Window functions */
|
|
1972
|
+
rb_define_method(cRwWindow, "SetMenu", rwwin_setmenu, 1);
|
|
1973
|
+
rb_define_method(cRwWindow, "DrawMenuBar", rwwin_drawmenubar, 0);
|
|
1974
|
+
rb_define_method(cRwWindow, "TrackPopupMenu", rwwin_trackpopupmenu, -1);
|
|
1975
|
+
}
|
|
1976
|
+
|
|
1977
|
+
/* Initialize */
|
|
1978
|
+
void
|
|
1979
|
+
Init_rw_resources(){
|
|
1980
|
+
rw_init_Bitmap();
|
|
1981
|
+
rw_init_Icon();
|
|
1982
|
+
rw_init_Cursor();
|
|
1983
|
+
rw_init_Pen();
|
|
1984
|
+
rw_init_Brush();
|
|
1985
|
+
rw_init_Imagelist();
|
|
1986
|
+
rw_init_Font();
|
|
1987
|
+
rw_init_Menu();
|
|
1988
|
+
}
|