Git Product home page Git Product logo

winlamb's Introduction

WinLamb

A lightweight modern C++11 library for Win32 API, using lambdas to handle Windows messages.

  1. Overview
  2. Setup
  3. Example
  4. Classes summary
  5. License

1. Overview

As far as I can remember, around 2002 I started wrapping all my Win32 routines in classes, to make them reusable to myself, to save my time. Through all these years it took the form of a real library, a thin abstraction layer over raw Win32. People who saw it often commented that it was good, so in 2017 I decided to publish it on GitHub.

Then I wrote CodeProject - WinLamb: using C++11 lambdas to handle Win32 messages, a comprehensive article explaining WinLamb's message handling model, with dialogs and also ordinary windows. Actually, features from C++14 and C++17 are used as well, as much as my compiler (Visual C++) allows it.

Beyond dialog/window message handling, WinLamb also has wrappers for most native Windows controls (textbox, listview, etc.), along with other utility classes (strings, file I/O, COM wrappers, etc.) which play nice together. These controls and utilities, however, are not mandatory: you can use your own classes upon the basic dialog/window infrastructure.

WinLamb by no means covers the whole Win32 API, simply because it's too huge. It just wraps some things. New features are constantly being added, though.

There is a great WinLamb presentation from Utah C++ Programmers here: https://youtu.be/2K52YX-vHv4

2. Setup

WinLamb is a header-only library. You can clone the repository or simply download the files; once referenced in your source code, it should work right away.

It has been tested with Visual C++ 2017.

2.1. Windows 10 manifest file

There's an included win10.exe.manifest file, which you can add to your Visual Studio project. This manifest includes Common Controls and gives you Windows 10 support.

3. Example

This is a simple Win32 program written with WinLamb. Each window has a class, and messages are handled with C++11 lambdas using message crackers. There's no need to write a message loop or window registering.

Declaration: My_Window.h

#include "winlamb/window_main.h"

class My_Window : public wl::window_main {
public:
    My_Window();
};

Implementation: My_Window.cpp

#include "My_Window.h"

RUN(My_Window) // optional, generate WinMain call and instantiate My_Window

My_Window::My_Window()
{
    setup.wndClassEx.lpszClassName = L"SOME_CLASS_NAME"; // class name to be registered
    setup.title = L"This is my window";
    setup.style |= WS_MINIMIZEBOX;

    on_message(WM_CREATE, [this](wl::wm::create p) -> LRESULT
    {
        set_text(L"A new title for the window");
        return 0;
    });

    on_message(WM_LBUTTONDOWN, [](wl::wm::lbuttondown p) -> LRESULT
    {
        bool isCtrlDown = p.has_ctrl();
        long xPos = p.pos().x;
        return 0;
    });
}

3.1. Project examples

I've written the following examples showcasing different things:

More projects can be seen browsing winlamb topic.

4. Classes summary

Most files are named after the class they contain; for example, file "button.h" contains button class.

To create your windows, you inherit from these classes below. See the article and the examples to learn how to use them:

Class Description
dialog_control Inherit from this class to have a dialog to be used as a control within a parent window.
dialog_main Inherit from this class to have a dialog as the main window for your application.
dialog_modal Inherit from this class to have a modal dialog popup.
dialog_modeless Inherit from this class to have a dialog modeless popup.
window_control Inherit from this class to have an user-custom window control.
window_main Inherit from this class to have an ordinary main window for your application.

Wrappers and utilities:

Class Description
button Wrapper to native button control.
checkbox Wrapper to native checkbox control.
com::bstr Wrapper to BSTR string, used with COM.
com::lib Smart class to automate CoInitialize and CoUninitialize calls.
com::ptr Wrapper to a COM pointer.
com::variant Wrapper to VARIANT object, used with COM.
combobox Wrapper to native combobox control.
datetime Wrapper to SYSTEMTIME structure.
datetime_picker Wrapper to datetime picker control from Common Controls library.
gdi::dc Wrapper to device context.
gdi::dc_painter Wrapper to device context which calls BeginPaint/EndPaint automatically.
gdi::dc_painter_buffered Wrapper to device context which calls BeginPaint/EndPaint automatically with double-buffer.
download Automates internet download operations.
executable Executable-related utilities.
file Wrapper to a low-level HANDLE of a file.
file_ini Wrapper to INI file.
file_mapped Wrapper to a memory-mapped file.
font Wrapper to HFONT handle.
icon Wrapper to HICON handle.
image_list Wrapper to image list object from Common Controls library.
insert_order_map Vector-based associative container which keeps the insertion order.
label Wrapper to native static text control.
listview Wrapper to listview control from Common Controls library.
menu Wrapper to HMENU handle.
path Utilities to file path operations with std::wstring.
progress_taskbar Allows to show a progress bar in the taskbar button of the window, in green, yellow or red.
progressbar Wrapper to progressbar control from Common Controls library.
radio Wrapper to native radio button control.
radio_group Automates a group of native radio buttons.
resizer Allows the resizing of multiple controls when the parent window is resized.
scrollinfo Automates SCROLLINFO operations.
statusbar Wrapper to status control from Common Controls library.
str Utilities to std::wstring.
subclass Manages window subclassing for a window.
sysdlg Wrappers to system dialogs.
syspath Retrieves system paths.
textbox Wrapper to native edit box control.
treeview Wrapper to treeview control from Common Controls library.
vec Utilities to std::vector.
version Parses version information from an EXE or DLL.
wnd Simple HWND wrapper, base to all dialog and window classes.
xml XML wrapper class to MSXML2 Windows library.
zip Utilities to work with zipped files.

5. License

Licensed under MIT license, see LICENSE.txt for details.

winlamb's People

Contributors

grx78fl avatar rodrigocfd avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

winlamb's Issues

window.h compiler error

Hi Rodrigo

I get
window.h(45): error C2512: 'wl::wli::styler<wl::wli::window<wl::wli::w_thread_capable<LRESULT,0>>>': no appropriate default constructor available

and

window.h(45): error C2614: 'wl::wli::window<wl::wli::w_thread_capable<LRESULT,0>>::_styler': illegal member initialization: 'styler' is not a base or member

Here is the output:
output-build.txt

WS_EX_NOREDIRECTIONBITMAP

WS_EX_NOREDIRECTIONBITMAP is only #defined if WINVER >= 0x0602:

winuser.h:

#if(WINVER >= 0x0602)
#define WS_EX_NOREDIRECTIONBITMAP 0x00200000L
#endif /* WINVER >= 0x0602 */

internals\styles_wsx.h uses it unconditionally:

NOREDIRECTIONBITMAP = WS_EX_NOREDIRECTIONBITMAP,

it should probably check if WS_EX_NOREDIRECTIONBITMAP is defined and fallback to a hardcoded 0x00200000L if not (or exclude NOREDIRECTIONBITMAP in that case)

process.h file name conflict

Hi Rodrigo

I get
atlbase.h(5107): error C3861: '_beginthreadex': identifier not found

which I believe is due to there's a winlamb file called process.h which hides the C library header with the same name containing the _beginthreadex function. Please rename the file.

FYI, I renamed mine to child_process.h to get further

Sample application request

Hello Rodrigo, could you provide a sample application, inherited from window_main, complete with menubar, toolbar and statusbar?
Thank you, so much and congratulation for your beautiful library!
frame

error C3861: '_endthreadex': identifier not found

I Has been set RunTime Library to MultiThreads DLL (/MD)
but always got this msg:

error C3861: '_endthreadex': identifier not found WindowsProject1 c:\users\soar\source\repos\cpp\3dr\winlamb\internals\w_thread_capable.h 56

Platform:windows10 x64 1803

NuGet package?

Is there any NuGet package exists that I can install in MSVS to easely use winlamb?

Using DLGTEMPLATE to create dialog.

Now, WinLamb only support using a resource id to construct dialog and it's simple. However, using "DLGTEMPLATE" is a more flexible way to create dialog. Do you have any plan for it?

Example doesn't compile with `g++`

g++ My_Window.cpp

In file included from winlamb/internals/base_msg.h:11,
                 from winlamb/internals/base_msg_pubm.h:9,
                 from winlamb/window_main.h:10,
                 from My_Window.h:1,
                 from My_Window.cpp:1:
winlamb/internals/params_wmn.h:61:36: error: 'NMLVEMPTYMARKUP' does not name a type
   WINLAMB_NOTIFYWM(getemptymarkup, NMLVEMPTYMARKUP);
                                    ^~~~~~~~~~~~~~~
winlamb/internals/params_wmn.h:20:3: note: in definition of macro 'WINLAMB_NOTIFYWM'
   oname& nmhdr() const noexcept { return *reinterpret_cast<oname*>(this->lParam); } \
   ^~~~~
winlamb/internals/params_wmn.h:70:31: error: 'NMLVLINK' does not name a type; did you mean
'NMLINK'?
   WINLAMB_NOTIFYWM(linkclick, NMLVLINK);
                               ^~~~~~~~
winlamb/internals/params_wmn.h:20:3: note: in definition of macro 'WINLAMB_NOTIFYWM'
   oname& nmhdr() const noexcept { return *reinterpret_cast<oname*>(this->lParam); } \
   ^~~~~
winlamb/internals/params_wmn.h:122:38: error: 'NMTRBTHUMBPOSCHANGING' does not name a type; did you mean 'WM_WINDOWPOSCHANGING'?
   WINLAMB_NOTIFYWM(thumbposchanging, NMTRBTHUMBPOSCHANGING);
                                      ^~~~~~~~~~~~~~~~~~~~~
winlamb/internals/params_wmn.h:20:3: note: in definition of macro 'WINLAMB_NOTIFYWM'
   oname& nmhdr() const noexcept { return *reinterpret_cast<oname*>(this->lParam); } \
   ^~~~~
In file included from C:/Mingw-w64/mingw64/x86_64-w64-mingw32/include/Windows.h:72,
                 from winlamb/internals/base_loop.h:11,
                 from winlamb/window_main.h:9,
                 from My_Window.h:1,
                 from My_Window.cpp:1:
winlamb/window_main.h: In member function 'void wl::window_main::_init_setup_styles()':
winlamb/window_main.h:83:57: error: cannot convert 'LPSTR' {aka 'char*'} to 'LPCWSTR' {aka
'const wchar_t*'}
   this->setup.wndClassEx.hCursor = LoadCursorW(nullptr, IDC_ARROW);
                                                         ^~~~~~~~~
In file included from C:/Mingw-w64/mingw64/x86_64-w64-mingw32/include/Windows.h:72,
                 from winlamb/internals/base_loop.h:11,
                 from winlamb/window_main.h:9,
                 from My_Window.h:1,
                 from My_Window.cpp:1:
C:/Mingw-w64/mingw64/x86_64-w64-mingw32/include/winuser.h:3962:69: note:   initializing argument 2 of 'HICON__* LoadCursorW(HINSTANCE, LPCWSTR)'
   WINUSERAPI HCURSOR WINAPI LoadCursorW(HINSTANCE hInstance,LPCWSTR lpCursorName);

missing returns

winlamb/internals/params_wm.h: In member function 'UINT wl::wm::menudrag::initial_pos() const':
winlamb/internals/params_wm.h:369:73: warning: no return statement in function returning non-void [-Wreturn-type]
   UINT  initial_pos() const noexcept { static_cast<UINT>(this->wParam); }
                                                                         ^
winlamb/internals/params_wm.h: In member function 'RECT& wl::wm::sizing::screen_coords() const':
winlamb/internals/params_wm.h:613:82: warning: no return statement in function returning non-void [-Wreturn-type]
   RECT& screen_coords() const noexcept { *reinterpret_cast<RECT*>(this->lParam); }
diff --git a/internals/params_wm.h b/internals/params_wm.h
index b2e71ab..68a0ae5 100644
--- a/internals/params_wm.h
+++ b/internals/params_wm.h
@@ -366,7 +366,7 @@ namespace wm {
        };
        struct menudrag : public params {
                menudrag(const params& p) noexcept : params(p) { }
-               UINT  initial_pos() const noexcept { static_cast<UINT>(this->wParam); }
+               UINT  initial_pos() const noexcept { return static_cast<UINT>(this->wParam); }
                HMENU hmenu() const noexcept       { return reinterpret_cast<HMENU>(this->lParam); }
        };
        struct menugetobject : public params {
@@ -610,7 +610,7 @@ namespace wm {
        struct sizing : public params {
                sizing(const params& p) noexcept : params(p) { }
                WORD  edge() const noexcept          { return static_cast<WORD>(this->wParam); }
-               RECT& screen_coords() const noexcept { *reinterpret_cast<RECT*>(this->lParam); }
+               RECT& screen_coords() const noexcept { return *reinterpret_cast<RECT*>(this->lParam); }
        };
        struct spoolerstatus : public params {
                spoolerstatus(const params& p) noexcept : params(p) { }

crtdbg.h

For compiling with clang/mingw64, internals\run.h needs an #include <crtdbg.h>

base_window.h error C2664

Hi Rodrigo

I get:
base_window.h(129): error C2664: 'LONG_PTR std::_Func_class<_Ret,wl::params &>::operator ()(wl::params &) const': cannot convert argument 1 from 'wl::params' to 'wl::params &' ...note: A non-const reference may only be bound to an lvalue
code:
LRESULT ret = (*pFunc)(params{msg, wp, lp}); // call user lambda

Microsoft (R) C/C++ Optimizing Compiler Version 19.11.25547 for x64
-sdl -guard:cf -Zc:inline -Zc:rvalueCast -Zc:referenceBinding -Zc:strictStrings -std:c++latest

C2664 reference to temp object

In the function _register_create in the window.h header I get

error C2664: 'ATOM wl::wli::window<wl::wli::w_thread_capable<LRESULT,0>>::_register_class(WNDCLASSEXW &,const wl::wli::window<wl::wli::w_thread_capable<LRESULT,0>>::setup_vars &)': cannot convert argument 1 from 'WNDCLASSEXW' to 'WNDCLASSEXW &'

I suggest the following simple patch to solve it:

-  ATOM atom = this->_register_class(this->_gen_wndclassex(setup.wndClassEx, hInst), setup);
+  WNDCLASSEXW wcx = this->_gen_wndclassex(setup.wndClassEx, hInst);
+  ATOM atom = this->_register_class(wcx, setup);

window.diff.txt

Does not compile with GCC

Awesome idea for a project. I am trying to cross-compile on GCC on Linux. After fixing things like Windows.h to windows.h I am getting the following errors:

[ 50%] Building CXX object CMakeFiles/installer.dir/installer.cpp.obj
In file included from /home/rush/code/installer/winlamb/window_main.h:8:0,
                 from /home/rush/code/installer/SimpleMainWindow.h:3,
                 from /home/rush/code/installer/installer.cpp:1:
/home/rush/code/installer/winlamb/base_window.h: In member function 'bool wl::base::window::_register_create(wl::base::window::setup_vars&, HWND, HINSTANCE)':
/home/rush/code/installer/winlamb/base_window.h:73:30: error: cannot convert 'LPTSTR {aka char*}' to 'LPCWSTR {aka const wchar_t*}' for argument '2' to 'HWND__* CreateWindowExW(DWORD, LPCWSTR, LPCWSTR, DWORD, int, int, int, int, HWND, HMENU, HINSTANCE, LPVOID)'
     static_cast<LPVOID>(this)) != nullptr;
                              ^
/home/rush/code/installer/winlamb/base_window.h: In member function 'ATOM wl::base::window::_register_class(wl::base::window::setup_vars&, HINSTANCE)':
/home/rush/code/installer/winlamb/base_window.h:92:50: error: cannot convert 'WNDCLASSEX* {aka tagWNDCLASSEXA*}' to 'const WNDCLASSEXW* {aka const tagWNDCLASSEXW*}' for argument '1' to 'ATOM RegisterClassExW(const WNDCLASSEXW*)'
    ATOM atom = RegisterClassExW(&setup.wndClassEx);
                                                  ^
/home/rush/code/installer/winlamb/base_window.h:97:24: error: cannot convert 'LPCSTR {aka const char*}' to 'LPCWSTR {aka const wchar_t*}' for argument '2' to 'WINBOOL GetClassInfoExW(HINSTANCE, LPCWSTR, LPWNDCLASSEXW)'
       &setup.wndClassEx)); // https://blogs.msdn.microsoft.com/oldnewthing/20041011-00/?p=37603
                        ^
/home/rush/code/installer/winlamb/base_window.h: In static member function 'static LRESULT wl::base::window::_window_proc(HWND, UINT, WPARAM, LPARAM)':
/home/rush/code/installer/winlamb/base_window.h:129:48: error: no match for call to '(wl::base::inventory::msg_funcT {aka std::function<long int(wl::params&)>}) (wl::params)'
      LRESULT ret = (*pFunc)(params{msg, wp, lp}); // call user lambda
                                                ^
In file included from /usr/lib64/gcc/i686-w64-mingw32/7.1.0/include/c++/functional:58:0,
                 from /home/rush/code/installer/winlamb/base_depot.h:8,
                 from /home/rush/code/installer/winlamb/base_inventory.h:9,
                 from /home/rush/code/installer/winlamb/base_window.h:8,
                 from /home/rush/code/installer/winlamb/window_main.h:8,
                 from /home/rush/code/installer/SimpleMainWindow.h:3,
                 from /home/rush/code/installer/installer.cpp:1:
/usr/lib64/gcc/i686-w64-mingw32/7.1.0/include/c++/bits/std_function.h:701:5: note: candidate: _Res std::function<_Res(_ArgTypes ...)>::operator()(_ArgTypes ...) const [with _Res = long int; _ArgTypes = {wl::params&}] <near match>
     function<_Res(_ArgTypes...)>::
     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/lib64/gcc/i686-w64-mingw32/7.1.0/include/c++/bits/std_function.h:701:5: note:   conversion of argument 1 would be ill-formed:
In file included from /home/rush/code/installer/winlamb/window_main.h:8:0,
                 from /home/rush/code/installer/SimpleMainWindow.h:3,
                 from /home/rush/code/installer/installer.cpp:1:
/home/rush/code/installer/winlamb/base_window.h:129:29: error: cannot bind non-const lvalue reference of type 'wl::params&' to an rvalue of type 'wl::params'
      LRESULT ret = (*pFunc)(params{msg, wp, lp}); // call user lambda
                             ^~~~~~~~~~~~~~~~~~~
In file included from /home/rush/code/installer/winlamb/window_main.h:10:0,
                 from /home/rush/code/installer/SimpleMainWindow.h:3,
                 from /home/rush/code/installer/installer.cpp:1:
/home/rush/code/installer/winlamb/base_wheel.h: In member function 'void wl::base::wheel::_apply_wheel_hover_behavior() const':
/home/rush/code/installer/winlamb/base_wheel.h:38:45: error: invalid user-defined conversion from 'wl::base::wheel::_apply_wheel_hover_behavior() const::<lambda(HWND, LPARAM)>' to 'WNDENUMPROC {aka int (__attribute__((__stdcall__)) *)(HWND__*, long int)}' [-fpermissive]
    }, reinterpret_cast<LPARAM>(this->hwnd()));
                                             ^
/home/rush/code/installer/winlamb/base_wheel.h:31:63: note: candidate is: wl::base::wheel::_apply_wheel_hover_behavior() const::<lambda(HWND, LPARAM)>::operator BOOL (*)(HWND, LPARAM)() const <near match>
    EnumChildWindows(this->hwnd(), [](HWND hChild, LPARAM lp)->BOOL {
                                                               ^~~~
/home/rush/code/installer/winlamb/base_wheel.h:31:63: note:   no known conversion from 'BOOL (*)(HWND, LPARAM) {aka int (*)(HWND__*, long int)}' to 'WNDENUMPROC {aka int (__attribute__((__stdcall__)) *)(HWND__*, long int)}'
In file included from /usr/i686-w64-mingw32/sys-root/mingw/include/windows.h:72:0,
                 from /home/rush/code/installer/winlamb/base_wnd.h:8,
                 from /home/rush/code/installer/winlamb/base_inventory.h:8,
                 from /home/rush/code/installer/winlamb/base_window.h:8,
                 from /home/rush/code/installer/winlamb/window_main.h:8,
                 from /home/rush/code/installer/SimpleMainWindow.h:3,
                 from /home/rush/code/installer/installer.cpp:1:
/usr/i686-w64-mingw32/sys-root/mingw/include/winuser.h:3785:29: note:   initializing argument 2 of 'WINBOOL EnumChildWindows(HWND, WNDENUMPROC, LPARAM)'
   WINUSERAPI WINBOOL WINAPI EnumChildWindows(HWND hWndParent,WNDENUMPROC lpEnumFunc,LPARAM lParam);
                             ^~~~~~~~~~~~~~~~
In file included from /home/rush/code/installer/winlamb/window_main.h:11:0,
                 from /home/rush/code/installer/SimpleMainWindow.h:3,
                 from /home/rush/code/installer/installer.cpp:1:
/home/rush/code/installer/installer.cpp: In function 'int wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int)':
/home/rush/code/installer/winlamb/base_run.h:27:11: error: '_CrtDumpMemoryLeaks' was not declared in this scope
  _ASSERT(!_CrtDumpMemoryLeaks()); \
           ^
/home/rush/code/installer/winlamb/base_run.h:27:11: note: in definition of macro 'RUN'
  _ASSERT(!_CrtDumpMemoryLeaks()); \
           ^~~~~~~~~~~~~~~~~~~
/home/rush/code/installer/winlamb/base_run.h:27:2: error: '_ASSERT' was not declared in this scope
  _ASSERT(!_CrtDumpMemoryLeaks()); \
  ^
/home/rush/code/installer/winlamb/base_run.h:27:2: note: in definition of macro 'RUN'
  _ASSERT(!_CrtDumpMemoryLeaks()); \
  ^~~~~~~
/home/rush/code/installer/winlamb/base_run.h:27:2: note: suggested alternative: 'C_ASSERT'
  _ASSERT(!_CrtDumpMemoryLeaks()); \
  ^
/home/rush/code/installer/winlamb/base_run.h:27:2: note: in definition of macro 'RUN'
  _ASSERT(!_CrtDumpMemoryLeaks()); \
  ^~~~~~~
/home/rush/code/installer/installer.cpp: In constructor 'SimpleMainWindow::SimpleMainWindow()':
/home/rush/code/installer/installer.cpp:6:36: error: cannot convert 'const wchar_t [16]' to 'LPCSTR {aka const char*}' in assignment
   setup.wndClassEx.lpszClassName = L"SOME_CLASS_NAME";
                                    ^~~~~~~~~~~~~~~~~~
/home/rush/code/installer/installer.cpp: In lambda function:
/home/rush/code/installer/installer.cpp:12:56: error: cannot convert 'const wchar_t*' to 'LPCSTR {aka const char*}' for argument '2' to 'WINBOOL SetWindowTextA(HWND, LPCSTR)'
     SetWindowText(hwnd(), L"A new title for the window");
                                                        ^
/home/rush/code/installer/installer.cpp: In lambda function:
/home/rush/code/installer/installer.cpp:18:45: error: cannot convert 'const wchar_t*' to 'LPCSTR {aka const char*}' for argument '2' to 'WINBOOL SetWindowTextA(HWND, LPCSTR)'
     SetWindowText(hwnd(), L"Window clicked!");
                                             ^
make[2]: *** [CMakeFiles/installer.dir/build.make:64: CMakeFiles/installer.dir/installer.cpp.obj] Error 1
make[1]: *** [CMakeFiles/Makefile2:68: CMakeFiles/installer.dir/all] Error 2
make: *** [Makefile:84: all] Error 2

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.