#include <windows.h>
#include <string>
#include <commctrl.h>
#include <richedit.h>
using namespace std;

LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

char sz_Klasa[ ] = "RicheditApp";
HWND h_Okno, h_Rich, h_Button_Bold, h_Button_Italic;
HINSTANCE h_Inst;
CHARFORMAT chf_format;

int WINAPI WinMain (HINSTANCE h_Inst, HINSTANCE, LPSTR lpsz_KlasaOkna, int i_Show)
{
    if(!LoadLibrary("RICHED32.DLL"))
    {
        MessageBox(0,"Nie uda³o siê za³adowaæ biblioteki \"RICHED32.DLL\"","B³¹d!",MB_ICONERROR);
        PostQuitMessage(0);
    }
    //globalnij kfyt procesu//
    ::h_Inst=h_Inst;
    //budowa//
    WNDCLASSEX WinCl_Okno;
    WinCl_Okno.hInstance = h_Inst;
    WinCl_Okno.lpszClassName = sz_Klasa;
    WinCl_Okno.lpfnWndProc = WindowProcedure;
    WinCl_Okno.style = CS_DBLCLKS;
    WinCl_Okno.cbSize = sizeof (WNDCLASSEX);
    //wyglad//
    WinCl_Okno.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    WinCl_Okno.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    WinCl_Okno.hCursor = LoadCursor (NULL, IDC_ARROW);
    WinCl_Okno.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
    //menu//
    WinCl_Okno.lpszMenuName = NULL;
    //dodatkowe info//
    WinCl_Okno.cbClsExtra = 0;
    WinCl_Okno.cbWndExtra = 0;
    //rejestruj klase//
    if (!RegisterClassEx (&WinCl_Okno)) return 0;

    MSG messages;
    h_Okno=CreateWindowEx(0, sz_Klasa, "Obs³uga Richedit", WS_OVERLAPPED|WS_SYSMENU, 300,300,500,400,0,0,h_Inst,0);
    ShowWindow(h_Okno,i_Show);

    //obsluga komunikatow//
    while (GetMessage (&messages, NULL, 0, 0))
    {
        TranslateMessage(&messages);
        DispatchMessage(&messages);
    }
    return messages.wParam;
}

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
        case WM_CREATE:
            h_Rich=CreateWindowEx(WS_EX_CLIENTEDGE,"richedit","",WS_CHILD|WS_VISIBLE|ES_MULTILINE, 25, 25, 450, 200, hwnd, (HMENU)100,h_Inst,0);
            SendMessage(h_Rich,EM_GETCHARFORMAT,(WPARAM)SCF_DEFAULT,(LPARAM)&chf_format);
            h_Button_Bold=CreateWindowEx(0,WC_BUTTON,"BOLD",WS_CHILD|WS_VISIBLE, 25, 250, 150, 50, hwnd, (HMENU)1,h_Inst,0);
            h_Button_Italic=CreateWindowEx(0,WC_BUTTON, "ITALIC",WS_CHILD|WS_VISIBLE, 325,250,150,50,hwnd,(HMENU)2,h_Inst,0);
            break;
        case WM_DESTROY:
            DestroyWindow(h_Rich);
            DestroyWindow(h_Button_Italic);
            DestroyWindow(h_Button_Bold);
            PostQuitMessage (0);
            break;
        case WM_COMMAND:
            switch (wParam)
            {
                case 1:
                    chf_format.dwMask=CFM_BOLD;
                    chf_format.dwEffects=CFE_BOLD;
                    SendMessage(h_Rich,EM_SETCHARFORMAT,SCF_ALL,(LPARAM)&chf_format);
                    break;
                case 2:
                    chf_format.dwMask=CFM_ITALIC;
                    chf_format.dwEffects=CFE_ITALIC;
                    SendMessage(h_Rich,EM_SETCHARFORMAT,SCF_ALL,(LPARAM)&chf_format);
                    break;
            }
            break;
        default:
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}
