From ed654b5df632f9823193d8c2272d09dc5d57629e Mon Sep 17 00:00:00 2001 From: haru-s Date: Wed, 1 Feb 2023 22:14:23 +0900 Subject: [PATCH] Add ImageList example with ListView and ComboBox --- README.md | 1 + examples/imagelist/.gitignore | 16 +++ examples/imagelist/.vscode/launch.json | 13 ++ examples/imagelist/.vscode/tasks.json | 20 +++ examples/imagelist/README.md | 2 + examples/imagelist/dub.json | 16 +++ examples/imagelist/image/rgb.bmp | Bin 0 -> 5238 bytes examples/imagelist/image/screenshot.png | Bin 0 -> 6728 bytes examples/imagelist/imagelist.code-workspace | 12 ++ examples/imagelist/shell.bat | 3 + examples/imagelist/source/imagelist_sample.d | 137 +++++++++++++++++++ 11 files changed, 220 insertions(+) create mode 100644 examples/imagelist/.gitignore create mode 100644 examples/imagelist/.vscode/launch.json create mode 100644 examples/imagelist/.vscode/tasks.json create mode 100644 examples/imagelist/README.md create mode 100644 examples/imagelist/dub.json create mode 100644 examples/imagelist/image/rgb.bmp create mode 100644 examples/imagelist/image/screenshot.png create mode 100644 examples/imagelist/imagelist.code-workspace create mode 100644 examples/imagelist/shell.bat create mode 100644 examples/imagelist/source/imagelist_sample.d diff --git a/README.md b/README.md index 88cf697..4aa8181 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ DFL is a Win32 windowing library for the D language. ![screen shot](./examples/listview/image/screenshot.png "screen shot") ![screen shot](./examples/statusbar/image/screenshot.png "screen shot") ![screen shot](./examples/splitter/image/screenshot.png "screen shot") +![screen shot](./examples/imagelist/image/screenshot.png "screen shot") ## Recent major features - DUB is available for DFL. diff --git a/examples/imagelist/.gitignore b/examples/imagelist/.gitignore new file mode 100644 index 0000000..60a5f2a --- /dev/null +++ b/examples/imagelist/.gitignore @@ -0,0 +1,16 @@ +.dub +docs.json +__dummy.html +docs/ +/hello_dfl +hello_dfl.so +hello_dfl.dylib +hello_dfl.dll +hello_dfl.a +hello_dfl.lib +hello_dfl-test-* +*.exe +*.pdb +*.o +*.obj +*.lst diff --git a/examples/imagelist/.vscode/launch.json b/examples/imagelist/.vscode/launch.json new file mode 100644 index 0000000..de26bb6 --- /dev/null +++ b/examples/imagelist/.vscode/launch.json @@ -0,0 +1,13 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "C++ Launch (Windows) imagelist", + "type": "cppvsdbg", + "request": "launch", + "cwd": "${workspaceRoot}", + "program": "./bin/imagelist_sample.exe", + "console": "internalConsole" + } + ] +} \ No newline at end of file diff --git a/examples/imagelist/.vscode/tasks.json b/examples/imagelist/.vscode/tasks.json new file mode 100644 index 0000000..096f796 --- /dev/null +++ b/examples/imagelist/.vscode/tasks.json @@ -0,0 +1,20 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "type": "dub", + "run": false, + "cwd": ".", + "compiler": "$current", + "archType": "$current", + "buildType": "$current", + "configuration": "$current", + "problemMatcher": [ + "$dmd" + ], + "group": "build", + "label": "dub: Build imagelist_sample", + "detail": "dub build --compiler=dmd.EXE -a=x86_64 -b=debug -c=application" + } + ] +} \ No newline at end of file diff --git a/examples/imagelist/README.md b/examples/imagelist/README.md new file mode 100644 index 0000000..b1a86ca --- /dev/null +++ b/examples/imagelist/README.md @@ -0,0 +1,2 @@ +# Screen Shot +![screen shot](./image/screenshot.png "screen shot") diff --git a/examples/imagelist/dub.json b/examples/imagelist/dub.json new file mode 100644 index 0000000..5d7ba5d --- /dev/null +++ b/examples/imagelist/dub.json @@ -0,0 +1,16 @@ +{ + "authors": ["haru-s"], + "copyright": "Copyright (C) 2023 haru-s", + "description": "DFL sample code.", + "name": "imagelist_sample", + "targetType": "executable", + "targetPath": "bin", + "dependencies": { + "dfl": { + "path": "../../../dfl" + } + }, + "lflags-windows-x86_omf-dmd": ["/exet:nt/su:windows:6.0"], + "lflags-windows-x86_mscoff-dmd": ["/SUBSYSTEM:WINDOWS", "/ENTRY:mainCRTStartup"], + "lflags-windows-x86_64-dmd": ["/SUBSYSTEM:WINDOWS", "/ENTRY:mainCRTStartup"] +} \ No newline at end of file diff --git a/examples/imagelist/image/rgb.bmp b/examples/imagelist/image/rgb.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f9c83f87d97cee1272ca242dd5976220b51ee7ec GIT binary patch literal 5238 zcmeH{yG;Z^5JZ;*urM&N5C#!oBP?4G)GGC7uJ^+sp*!u4YWg?* zwg;YG->#ZRh8*=DF}w;D3_aNdc>b_8Pp;!hojqw7P&fiGS*o%FXM`J(s?NY zH51kDO0DCHSGUhKfI@GPYtTI6D{sZ+@O8_9ss*~qHHJbR<*IsiM_ZWMPsw!@s^Zdy zQ%y8=orbGJ#IDkLX~U`B&c#cJ)zz==p%Fp2lyn=pTo@73RU`ZJGNK5Df*me0>giFB zxl$Z6YPE_>DV)}H(|s<|VYOTpV=j#x>!n;(wTjEd8x)1}V*A@%@kE_k>P1UxuR3Q; z3WZV?7y8sg4TnNq)D@Ql(QPaOOU0!is?#DcIxdDe3b##5^|{h? zGxoVGB^4fve&gq@=DhSNd7Z_`m0+{~1>6^iOGp5ubXO F=LaZN25$fW literal 0 HcmV?d00001 diff --git a/examples/imagelist/image/screenshot.png b/examples/imagelist/image/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..ab6e2dca4f05f7873304d89e5df906417235a291 GIT binary patch literal 6728 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 literal 0 HcmV?d00001 diff --git a/examples/imagelist/imagelist.code-workspace b/examples/imagelist/imagelist.code-workspace new file mode 100644 index 0000000..7e696bc --- /dev/null +++ b/examples/imagelist/imagelist.code-workspace @@ -0,0 +1,12 @@ +{ + "folders": [ + { + "path": "." + } + ], + "settings": { + "d.projectImportPaths": [ + "..\\..\\..\\dfl\\source" + ] + } +} \ No newline at end of file diff --git a/examples/imagelist/shell.bat b/examples/imagelist/shell.bat new file mode 100644 index 0000000..49ab56b --- /dev/null +++ b/examples/imagelist/shell.bat @@ -0,0 +1,3 @@ +set dmd_path=c:\d\dmd2\windows +set dmc_path=c:\dmc\dm +cmd diff --git a/examples/imagelist/source/imagelist_sample.d b/examples/imagelist/source/imagelist_sample.d new file mode 100644 index 0000000..bd15ebb --- /dev/null +++ b/examples/imagelist/source/imagelist_sample.d @@ -0,0 +1,137 @@ +import dfl; +import std.traits : EnumMembers; + +version(Have_dfl) // For DUB. +{ +} +else +{ + pragma(lib, "dfl.lib"); +} + +class MainForm : Form +{ + private ListView _listView; + private ComboBox _combobox; + private ImageList _imagelist; + private Bitmap _icons; + + // Helper + private static string stringFromView(View v) + { + static string[] arr = ["LARGE_ICON", "SMALL_ICON", "LIST", "DETAILS"]; + return arr[cast(int)v]; + } + + public this() + { + this.text = "ImageList example"; + this.size = Size(300, 300); + this.formBorderStyle = FormBorderStyle.FIXED_SINGLE; + + // Create Bitmap + _icons = new Bitmap(r".\image\rgb.bmp"); // Change by your environment. + + // Create ImageList + _imagelist = new ImageList(); + _imagelist.imageSize = Size(24, 24); // Each bitmap size in image list (W24[dots] x H24[dots] x 3[icons]). + _imagelist.images.addStrip(_icons); + + // Create ComboBox + _combobox = new ComboBox(); + _combobox.parent = this; + _combobox.location = Point(0, 160); + _combobox.size = Size(250, 100); + + // _combobox.dropDownStyle = ComboBoxStyle.DROP_DOWN_LIST; + _combobox.dropDownStyle = ComboBoxStyle.DROP_DOWN; + // _combobox.dropDownStyle = ComboBoxStyle.SIMPLE; + + foreach (v; EnumMembers!View) + { + _combobox.items.add(stringFromView(v)); + } + + immutable View initialViewMove = View.LIST; + _combobox.text = stringFromView(initialViewMove); + _combobox.selectedIndex = cast(int)initialViewMove; + + _combobox.textChanged ~= (Control sender, EventArgs e) + { + // msgBox("textChanged"); + }; + + _combobox.selectedValueChanged ~= (Control sender, EventArgs e) + { + // msgBox("selectedValueChanged"); + + int sel = _combobox.selectedIndex(); + if (sel >= 0) + { + _listView.view = cast(View)sel; + } + else + { + msgBox("Unknown ListView style."); + } + }; + + // Create ListView + _listView = new ListView(); + _listView.parent = this; + _listView.location = Point(0, 0); + _listView.size = Size(250, 150); + + _listView.largeImageList = _imagelist; // Attach image list to ListView. + _listView.smallImageList = _imagelist; // ditto + + // Style + _listView.view = initialViewMove; + _listView.gridLines = true; + _listView.multiSelect = false; + _listView.hideSelection = false; + _listView.fullRowSelect = true; + _listView.checkBoxes = false; + + // Header + ColumnHeader col1 = new ColumnHeader(); + col1.text = "Color"; + col1.width = 70; + + ColumnHeader col2 = new ColumnHeader(); + col2.text = "R-G-B"; + col2.width = 70; + + _listView.columns.addRange([col1, col2]); + + // Contents + _listView.beginUpdate(); // Stop redraw. + + ListViewItem item1 = new ListViewItem("Red"); + item1.subItems.add("255-0-0"); + item1.imageIndex = 0; // 0 is Red icon. + _listView.items.add(item1); + + ListViewItem item2 = new ListViewItem("Green"); + item2.subItems.add("0-255-0"); + item2.imageIndex = 1; // 1 is Green icon. + _listView.items.add(item2); + + ListViewItem item3 = new ListViewItem("Blue"); + item3.subItems.add("0-0-255"); + item3.imageIndex = 2; // 2 is Blue icon. + _listView.items.add(item3); + + _listView.endUpdate(); // Restart redraw. + } +} + +static this() +{ + Application.enableVisualStyles(); +} + +void main() +{ + Application.run(new MainForm()); +}