How can i use ClearType on my win32 app?

Daniel Shepherd 246 Reputation points
2021-08-18T14:56:55.173+00:00

I am making a win32 app, and I have created text using this code:

TCHAR test[] = _T("welcome to my app :D");  
//the textout part is already in WM_PAINT.  
TextOut(hdc,  
      5, 5,  
      test, _tcslen(test));  

and the text appears like this:
124351-screenshot-2021-08-18-094437.png
as you can see, the text is sort of low quality. how can I make my text look better, for example using ClearType?
Example:
124362-screenshot-2021-08-18-095545.png

Windows API - Win32
Windows API - Win32
A core set of Windows application programming interfaces (APIs) for desktop and server applications. Previously known as Win32 API.
2,412 questions
0 comments No comments
{count} votes

Accepted answer
  1. RLWA32 39,911 Reputation points
    2021-08-18T15:44:01.443+00:00

    What you are seeing is the ugly default font that Windows GDI will use.

    For the Windows desktop application created by the new project template -

    Step 1. Create the desired font. Store the handle to the font for later use.
    Step 2. When handling WM_PAINT after calling BeginPaint select the font you created into the device context .
    Step 3. Draw your text.
    Step 4. Select the font out of the device context before calling EndPaint.
    Step 5. Delete the font when it will not be used again.

    An example (error checking omitted) -

    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        static HFONT hFont;
    
        switch (message)
        {
        case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // Parse the menu selections:
            switch (wmId)
            {
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
        break;
        case WM_CREATE:
        {
            HDC hDC = GetDC(hWnd);
            int nHeight = -MulDiv(11, GetDeviceCaps(hDC, LOGPIXELSY), 72);
            hFont = CreateFont(nHeight, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, CLEARTYPE_QUALITY, DEFAULT_PITCH, _T("Segoe UI"));
            ReleaseDC(hWnd, hDC);
        }
        case WM_PAINT:
        {
            // TODO: Add any drawing code that uses hdc here...
            PAINTSTRUCT ps;
            TCHAR szTest[] = _T("Welcome to my Font test");
            HDC hdc = BeginPaint(hWnd, &ps);
            HGDIOBJ hOld = SelectObject(hdc, (HGDIOBJ) hFont);
            TextOut(hdc, 10, 10, szTest, _tcslen(szTest));
            SelectObject(hdc, hOld);
            EndPaint(hWnd, &ps);
        }
        break;
        case WM_DESTROY:
            if (hFont)
                DeleteObject(hFont);
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        return 0;
    }
    

3 additional answers

Sort by: Most helpful
  1. Daniel Shepherd 246 Reputation points
    2021-08-19T20:08:48.323+00:00

    no variables outside of the case statement are found. so the code will not work.


  2. Daniel Shepherd 246 Reputation points
    2021-08-19T21:02:58.557+00:00
    case WM_CREATE:
        {
            HWND button = CreateWindow(L"BUTTON", L"test", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 50, 50, 50, 20, hWnd, (HMENU)BUTTON_ID, hInst, NULL);
            //i have already #defined BUTTON_ID
            HWND hedit = CreateWindowEx(WS_EX_CLIENTEDGE, L"EDIT", L"", WS_CHILD | WS_VSCROLL | WS_VISIBLE | WS_HSCROLL, 200,200,100,100, hWnd,(HMENU)IDC_MAIN_EDIT, GetModuleHandle(NULL), NULL);
            HWND commandlinktest = CreateWindow(L"BUTTON", L"", WS_VISIBLE | WS_CHILD | BS_COMMANDLINK, 200, 10, 100, 100, hWnd, NULL, (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE), NULL);
            HWND checkbox = CreateWindow(L"BUTTON", L"test", WS_VISIBLE | WS_CHILD | BS_CHECKBOX, 150, 30, 230, 23, hWnd, (HMENU)CHECKBOX, hInst, NULL);
            HWND radiobutton = CreateWindow(L"BUTTON", L"a", WS_VISIBLE | WS_CHILD | BS_RADIOBUTTON, 233,100,56,23,hWnd, NULL, (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE), NULL);
            HWND cbox = CreateWindow(L"BUTTON", L"cbox", WS_VISIBLE | WS_CHILD | BS_DEFSPLITBUTTON, 334, 110, 80, 40, hWnd, NULL,(HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE), NULL);
            HWND test = CreateWindow(MONTHCAL_CLASS, L"", WS_VISIBLE | WS_CHILD | CAL_GREGORIAN,  1000,100,100,100,hWnd, NULL,(HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE), NULL);
            HWND text = CreateWindow(L"TEXT", L"this is text!", WS_CHILDWINDOW | BS_TEXT, 10, 400, 43, 24, hWnd, NULL, (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE), NULL);
            HWND combobox = CreateWindow(WC_COMBOBOX, TEXT("testithink"), CBS_DROPDOWN | WS_CHILD | WS_VISIBLE | WS_OVERLAPPED, 10, 300, 40, 90, hWnd, NULL, (HINSTANCE)HINST_THISCOMPONENT, NULL);
            SendMessageW(commandlinktest, WM_SETTEXT, 0, (LPARAM)L"test :D");
            SendMessageW(commandlinktest, BCM_SETNOTE, 0, (LPARAM)L"test");
            SystemParametersInfo(SPI_SETFONTSMOOTHING, 0, (PVOID)1600, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
            HDC hDC = GetDC(hWnd);
            int nHeight = MulDiv(11,GetDeviceCaps(hDC,
                LOGPIXELSY), 72);
            hFont = CreateFont(nHeight, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, CLEARTYPE_QUALITY, DEFAULT_PITCH, _T("Segoe UI"));
            ReleaseDC(hWnd, hDC);
            break;
        }
        case WM_COMMAND:
            {
            HWND mytoolbar = NULL;
                int wmId = LOWORD(wParam);
                // Parse the menu selections:
                switch (wmId)
                {
                case IDM_ABOUT:
                {
                    DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                    break;
                    return 0;
                }
                case ID_OPENDIALOG_OPENDIALOGBOXTHATIMADE:
                {
                    break;
                    return 0;
                }
                case IDM_EXIT:
                    MessageBox(hWnd, L"bye", L"bye!", MB_OK | MB_ICONHAND);
                    DestroyWindow(hWnd);
                    break;
                case ID_CLOSEWINDOWFORSOMETREASON_YESCLOSEIT:
                        DestroyWindow(hWnd);
                        break;
                case ID_FILE_OPENFILETEST:
                {
                    OPENFILENAME ofn;
                    WCHAR szFileName[MAX_PATH] = L"";
                    ZeroMemory(&ofn, sizeof(ofn));
                    ofn.lStructSize = sizeof(ofn);
                    ofn.hwndOwner = hWnd;
                    ofn.lpstrFilter = L"My Windows App files (*.mwa)\0*.mwa\0All files i guess (*.*)\0*.*\0";
                    ofn.lpstrFile = szFileName;
                    ofn.nMaxFile = MAX_PATH;
                    ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
                    ofn.lpstrDefExt = L"mwa";
                    if (GetOpenFileName(&ofn))
                    {
    
                    }
                }
                case ID_WMCOMMANDS_WM:
                {
                case WM_CLOSE:
                {
                    DestroyWindow(hWnd);
                }
                }
    
                case ID_MAKESOMETEXT:
                {
                    case WM_PAINT:
                    {
                    TCHAR outtext[] = _T("ok here it is mr magic man");
                    PAINTSTRUCT ps;
                    char szSize[80];
                    char szTitle[] = "test :D";
                    HDC hdc = BeginPaint(hWnd, &ps);
                    HDC hdcMem = CreateCompatibleDC(hdc);
                    TextOut(hdc,
                        10,30,
                        outtext, _tcslen(outtext));
                    EndPaint(hWnd, &ps);
                    }
                    break;
                }
                case ID_OTHERS_DESTROYWINDOW:
                {
                    DestroyWindow(hWnd);
                    break;
                    return 0;
                }
                case ID_OTHERS_CLOSEWINDOW:
                {
                    std::cout << "test \n";
                    CloseWindow(hWnd);
                    break;
                    return 0;
                }
                default:
                    return DefWindowProc(hWnd, message, wParam, lParam);
                }
            }
            break;
        case WM_MDIMAXIMIZE:
        {
            if (MessageBox(hWnd, L"you have maximized the window.", L"thx", MB_OK) == IDOK){
                SC_MAXIMIZE;
                }
        }
        case WM_LBUTTONDOWN:
        {
            MessageBox(hWnd, L"test", L"test", MB_OKCANCEL | MB_ICONINFORMATION);
            testheaderfunc();
            object.integer = 1;
    
            break;
            return 0;
        }
        case WM_RBUTTONDOWN:
        {
            MessageBox(hWnd, L"you have right clicked the window", L"right click", MB_OK | MB_ICONASTERISK);
            break;
            return 0;
        }
        case WM_VSCROLL:
        {
            std::wcout << "wcout? what is this? \n";
        }
        case WM_MBUTTONDOWN:
        {
            switch (MessageBox(hWnd, L"test and press ok or cancel", L"press somethign i guess", MB_OKCANCEL)) {
            case IDCANCEL:
            {
                MessageBox(hWnd, L"you have pressed the cancel button!", L"Button pressed", MB_OK);
            }
            case IDOK:
            {
                MessageBox(hWnd, L"you pressed ok", L"ok pressed", MB_OK);
            }
            }
        }
        case WM_CLIPBOARDUPDATE:
        {
            MessageBox(hWnd, L"your clipboard that let you copy and paste has been updated", L"clipoard updated", MB_OKCANCEL);
        }
        case WM_KEYDOWN:
        {
            MessageBox(hWnd, L"", L"", MB_YESNOCANCEL | MB_USERICON);
            break;
            return 0;
        }
        case WM_CLOSE:
        {
            if (MessageBox(hWnd, L"you have called WM_CLOSE. goodbye!", L"WM_CLOSE called", MB_OK | MB_ICONWARNING) == IDOK) {
                DestroyWindow(hWnd);
                return 0;
            }
        }
        case WM_PAINT:
            {
                PAINTSTRUCT ps;
                HDC hdc = BeginPaint(hWnd, &ps);
                HGDIOBJ hOLD = SelectObject(hdc, (HGDIOBJ)hFont);
                TextOut(hdc,
                    5, 5,
                    test, _tcslen(test));
                TextOut(hdc,
                    10, 20,
                    testagain, _tcslen(testagain));
                EndPaint(hWnd, &ps);
            }
            break;
        case WM_DESTROY:
    
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        return 0;
    }
    
    // Message handler for about box.
    INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    {
        UNREFERENCED_PARAMETER(lParam);
        switch (message)
        {
        case WM_INITDIALOG:
            return (INT_PTR)TRUE;
    
        case WM_COMMAND:
            if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
            {
                EndDialog(hDlg, LOWORD(wParam));
                return (INT_PTR)TRUE;
            }
            break;
        }
        return (INT_PTR)FALSE;
    }
    

  3. Daniel Shepherd 246 Reputation points
    2021-08-19T22:14:15.077+00:00

    here is my code now
    #include "framework.h"
    #include "my windows app.h"
    #include <wincodec.h>
    #include "winuser.h"
    #include <iostream>
    #include "Header.h"
    #include "Resource.h"
    #include "windows.h"
    #include "commdlg.h"
    #include "commctrl.h"
    #include "Wingdi.h"
    #define treeviewtest 454
    #define CALENDERTHINGY_IDK 5656
    #define BUTTON_ID 1001
    #define IDC_MAIN_EDIT 109
    #define MAX_LOADSTRING 100
    #define CHECKBOX 2332
    #define HINST_THISCOMPONENT 45

    // Global Variables:
    HINSTANCE hInst;                                // current instance
    WCHAR szTitle[MAX_LOADSTRING];                  // The title bar text
    WCHAR szWindowClass[MAX_LOADSTRING];            // the main window class name
    
    // Forward declarations of functions included in this code module:
    ATOM                MyRegisterClass(HINSTANCE hInstance);
    BOOL                InitInstance(HINSTANCE, int);
    LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
    INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
    BOOL CALLBACK mydialog(HWND, UINT, WPARAM, LPARAM)
    {
        return 0;
    }
    int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                         _In_opt_ HINSTANCE hPrevInstance,
                         _In_ LPWSTR    lpCmdLine,
                         _In_ int       nCmdShow)
    {
        UNREFERENCED_PARAMETER(hPrevInstance);
        UNREFERENCED_PARAMETER(lpCmdLine);
        // TODO: Place code here.
    
        // Initialize global strings
        LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
        LoadStringW(hInstance, IDC_MYWINDOWSAPP, szWindowClass, MAX_LOADSTRING);
        MyRegisterClass(hInstance);
    
        // Perform application initialization:
        if (!InitInstance (hInstance, nCmdShow))
        {
            return FALSE;
        }
    
        HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_MYWINDOWSAPP));
    
        MSG msg;
    
        // Main message loop:
        while (GetMessage(&msg, nullptr, 0, 0))
        {
            if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
        }
    
        return (int) msg.wParam;
    }
    
    //
    //  FUNCTION: MyRegisterClass()
    //
    //  PURPOSE: Registers the window class.
    //
    ATOM MyRegisterClass(HINSTANCE hInstance)
    {
        WNDCLASSEXW wcex;
    
        wcex.cbSize = sizeof(WNDCLASSEX);
    
        wcex.style          = CS_HREDRAW | CS_VREDRAW;
        wcex.lpfnWndProc    = WndProc;
        wcex.cbClsExtra     = 0;
        wcex.cbWndExtra     = 0;
        wcex.hInstance      = hInstance;
        wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MYWINDOWSAPP));
        wcex.hCursor        = LoadCursor(nullptr, IDC_ARROW);
        wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
        wcex.lpszMenuName   = MAKEINTRESOURCEW(IDC_MYWINDOWSAPP);
        wcex.lpszClassName  = szWindowClass;
        wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
    
        return RegisterClassExW(&wcex);
    }
    
    //
    //   FUNCTION: InitInstance(HINSTANCE, int)
    //
    //   PURPOSE: Saves instance handle and creates main window
    //
    //   COMMENTS:
    //
    //        In this function, we save the instance handle in a global variable and
    //        create and display the main program window.
    //
    BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
    {
       hInst = hInstance; // Store instance handle in our global variable
    
       HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
          CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);
    
       if (!hWnd)
       {
          return FALSE;
       }
    
       ShowWindow(hWnd, nCmdShow);
       UpdateWindow(hWnd);
    
    
       return TRUE;
    }
    //
    //  FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
    //
    //  PURPOSE: Processes messages for the main window.
    //
    //  WM_COMMAND  - process the application menu
    //  WM_PAINT    - Paint the main window
    //  WM_DESTROY  - post a quit message and return
    //
    //
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        TCHAR test[] = _T("welcome to my app :D");
        TCHAR testagain[] = _T("try clicking about :D");
        switch (message)
        {
            static HFONT hFont;
        case WM_CREATE:
        {
            HWND button = CreateWindow(L"BUTTON", L"test", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 50, 50, 50, 20, hWnd, (HMENU)BUTTON_ID, hInst, NULL);
            //i have already #defined BUTTON_ID
            HWND hedit = CreateWindowEx(WS_EX_CLIENTEDGE, L"EDIT", L"", WS_CHILD | WS_VSCROLL | WS_VISIBLE | WS_HSCROLL, 200,200,100,100, hWnd,(HMENU)IDC_MAIN_EDIT, GetModuleHandle(NULL), NULL);
            HWND commandlinktest = CreateWindow(L"BUTTON", L"", WS_VISIBLE | WS_CHILD | BS_COMMANDLINK, 200, 10, 100, 100, hWnd, NULL, (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE), NULL);
            HWND checkbox = CreateWindow(L"BUTTON", L"test", WS_VISIBLE | WS_CHILD | BS_CHECKBOX, 150, 30, 230, 23, hWnd, (HMENU)CHECKBOX, hInst, NULL);
            HWND radiobutton = CreateWindow(L"BUTTON", L"a", WS_VISIBLE | WS_CHILD | BS_RADIOBUTTON, 233,100,56,23,hWnd, NULL, (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE), NULL);
            HWND cbox = CreateWindow(L"BUTTON", L"cbox", WS_VISIBLE | WS_CHILD | BS_DEFSPLITBUTTON, 334, 110, 80, 40, hWnd, NULL,(HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE), NULL);
            HWND test = CreateWindow(MONTHCAL_CLASS, L"", WS_VISIBLE | WS_CHILD | CAL_GREGORIAN,  1000,100,100,100,hWnd, NULL,(HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE), NULL);
            HWND text = CreateWindow(L"TEXT", L"this is text!", WS_CHILDWINDOW | BS_TEXT, 10, 400, 43, 24, hWnd, NULL, (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE), NULL);
            HWND combobox = CreateWindow(WC_COMBOBOX, TEXT("testithink"), CBS_DROPDOWN | WS_CHILD | WS_VISIBLE | WS_OVERLAPPED, 10, 300, 40, 90, hWnd, NULL, (HINSTANCE)HINST_THISCOMPONENT, NULL);
            SendMessageW(commandlinktest, WM_SETTEXT, 0, (LPARAM)L"test :D");
            SendMessageW(commandlinktest, BCM_SETNOTE, 0, (LPARAM)L"test");
            SystemParametersInfo(SPI_SETFONTSMOOTHING, 0, (PVOID)1600, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
            HDC hDC = GetDC(hWnd);
            int nHeight = MulDiv(11,GetDeviceCaps(hDC,
                LOGPIXELSY), 72);
            hFont = CreateFont(nHeight, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, CLEARTYPE_QUALITY, DEFAULT_PITCH, _T("Segoe UI"));
            ReleaseDC(hWnd, hDC);
            break;
        }
        case WM_COMMAND:
            {
            HWND mytoolbar = NULL;
                int wmId = LOWORD(wParam);
                // Parse the menu selections:
                switch (wmId)
                {
                case IDM_ABOUT:
                {
                    DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                    break;
                    return 0;
                }
                case ID_OPENDIALOG_OPENDIALOGBOXTHATIMADE:
                {
                    break;
                    return 0;
                }
                case IDM_EXIT:
                    MessageBox(hWnd, L"bye", L"bye!", MB_OK | MB_ICONHAND);
                    DestroyWindow(hWnd);
                    break;
                case ID_CLOSEWINDOWFORSOMETREASON_YESCLOSEIT:
                        DestroyWindow(hWnd);
                        break;
                case ID_FILE_OPENFILETEST:
                {
                    OPENFILENAME ofn;
                    WCHAR szFileName[MAX_PATH] = L"";
                    ZeroMemory(&ofn, sizeof(ofn));
                    ofn.lStructSize = sizeof(ofn);
                    ofn.hwndOwner = hWnd;
                    ofn.lpstrFilter = L"My Windows App files (*.mwa)\0*.mwa\0All files i guess (*.*)\0*.*\0";
                    ofn.lpstrFile = szFileName;
                    ofn.nMaxFile = MAX_PATH;
                    ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
                    ofn.lpstrDefExt = L"mwa";
                    if (GetOpenFileName(&ofn))
                    {
    
                    }
                }
                case ID_WMCOMMANDS_WM:
                {
                case WM_CLOSE:
                {
                    DestroyWindow(hWnd);
                }
                }
    
                case ID_MAKESOMETEXT:
                {
                    case WM_PAINT:
                    {
                    TCHAR outtext[] = _T("ok here it is mr magic man");
                    PAINTSTRUCT ps;
                    char szSize[80];
                    char szTitle[] = "test :D";
                    HDC hdc = BeginPaint(hWnd, &ps);
                    HDC hdcMem = CreateCompatibleDC(hdc);
                    TextOut(hdc,
                        10,30,
                        outtext, _tcslen(outtext));
                    EndPaint(hWnd, &ps);
                    }
                    break;
                }
                case ID_OTHERS_DESTROYWINDOW:
                {
                    DestroyWindow(hWnd);
                    break;
                    return 0;
                }
                case ID_OTHERS_CLOSEWINDOW:
                {
                    std::cout << "test \n";
                    CloseWindow(hWnd);
                    break;
                    return 0;
                }
                default:
                    return DefWindowProc(hWnd, message, wParam, lParam);
                }
            }
            break;
        case WM_MDIMAXIMIZE:
        {
            if (MessageBox(hWnd, L"you have maximized the window.", L"thx", MB_OK) == IDOK){
                SC_MAXIMIZE;
                }
        }
        case WM_LBUTTONDOWN:
        {
            MessageBox(hWnd, L"test", L"test", MB_OKCANCEL | MB_ICONINFORMATION);
            testheaderfunc();
            object.integer = 1;
    
            break;
            return 0;
        }
        case WM_RBUTTONDOWN:
        {
            MessageBox(hWnd, L"you have right clicked the window", L"right click", MB_OK | MB_ICONASTERISK);
            break;
            return 0;
        }
        case WM_VSCROLL:
        {
            std::wcout << "wcout? what is this? \n";
        }
        case WM_MBUTTONDOWN:
        {
            switch (MessageBox(hWnd, L"test and press ok or cancel", L"press somethign i guess", MB_OKCANCEL)) {
            case IDCANCEL:
            {
                MessageBox(hWnd, L"you have pressed the cancel button!", L"Button pressed", MB_OK);
            }
            case IDOK:
            {
                MessageBox(hWnd, L"you pressed ok", L"ok pressed", MB_OK);
            }
            }
        }
        case WM_CLIPBOARDUPDATE:
        {
            MessageBox(hWnd, L"your clipboard that let you copy and paste has been updated", L"clipoard updated", MB_OKCANCEL);
        }
        case WM_KEYDOWN:
        {
            MessageBox(hWnd, L"", L"", MB_YESNOCANCEL | MB_USERICON);
            break;
            return 0;
        }
        case WM_CLOSE:
        {
            if (MessageBox(hWnd, L"you have called WM_CLOSE. goodbye!", L"WM_CLOSE called", MB_OK | MB_ICONWARNING) == IDOK) {
                DestroyWindow(hWnd);
                return 0;
            }
        }
        case WM_PAINT:
            {
                PAINTSTRUCT ps;
                HDC hdc = BeginPaint(hWnd, &ps);
                HGDIOBJ hOLD = SelectObject(hdc, (HGDIOBJ)hFont);
                TextOut(hdc,
                    5, 5,
                    test, _tcslen(test));
                TextOut(hdc,
                    10, 20,
                    testagain, _tcslen(testagain));
                SelectObject(hdc, hOLD);
                EndPaint(hWnd, &ps);
            }
            break;
        case WM_DESTROY:
            if (hFont)
            {
                DeleteObject(hFont);
            }
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        return 0;
    }
    
    // Message handler for about box.
    INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    {
        UNREFERENCED_PARAMETER(lParam);
        switch (message)
        {
        case WM_INITDIALOG:
            return (INT_PTR)TRUE;
    
        case WM_COMMAND:
            if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
            {
                EndDialog(hDlg, LOWORD(wParam));
                return (INT_PTR)TRUE;
            }
            break;
        }
        return (INT_PTR)FALSE;
    }