diff --git a/reactos/apps/tests/edit/edit.c b/reactos/apps/tests/edit/edit.c deleted file mode 100644 index 0fcd96774b4..00000000000 --- a/reactos/apps/tests/edit/edit.c +++ /dev/null @@ -1,82 +0,0 @@ -#include -#include - -HFONT tf; -LRESULT WINAPI MainWndProc(HWND, UINT, WPARAM, LPARAM); - -int WINAPI -WinMain(HINSTANCE hInstance, - HINSTANCE hPrevInstance, - LPSTR lpszCmdLine, - int nCmdShow) -{ - WNDCLASS wc; - MSG msg; - HWND hWnd; - HWND hWnd2; - - wc.lpfnWndProc = MainWndProc; - wc.style = CS_VREDRAW | CS_HREDRAW; - wc.hInstance = hInstance; - wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); - wc.hCursor = LoadCursor(NULL, IDC_ARROW); - wc.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH); - wc.lpszMenuName = NULL; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - if (RegisterClass(&wc) == 0) - { - fprintf(stderr, "RegisterClass failed (last error 0x%X)\n", - GetLastError()); - return(1); - } - - hWnd = CreateWindow("EDIT", - "Edit Control Test", - WS_OVERLAPPEDWINDOW|WS_VISIBLE, - 0, - 0, - 320, - 240, - NULL, - NULL, - hInstance, - NULL); - - if (!hWnd) - { - fprintf(stderr, "CreateWindow failed (last error 0x%X)\n", - GetLastError()); - return(1); - } - ShowWindow(hWnd, nCmdShow); - - while(GetMessage(&msg, NULL, 0, 0)) - { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - return msg.wParam; -} - -LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) -{ - PAINTSTRUCT ps; - HDC hDC; - - switch(msg) - { - case WM_PAINT: - hDC = BeginPaint(hWnd, &ps); - EndPaint(hWnd, &ps); - break; - - case WM_DESTROY: - PostQuitMessage(0); - break; - - default: - return DefWindowProc(hWnd, msg, wParam, lParam); - } - return 0; -} diff --git a/reactos/apps/tests/edit/edittest.c b/reactos/apps/tests/edit/edittest.c new file mode 100644 index 00000000000..2d55c28112d --- /dev/null +++ b/reactos/apps/tests/edit/edittest.c @@ -0,0 +1,649 @@ +/* Edit Control Test for ReactOS, quick n' dirty. Very rigid too. + * There you go, is only a test program. Not made to be fast, small + * easy to mantain, or portable. Lots of duplicated code too. + + * I'm not erasing text because I don't want to use other functions from th API + * or make this more complex. + + * This source code is in the PUBLIC DOMAIN and has NO WARRANTY. + * by Waldo Alvarez Caņizares , June 22, 2003. */ + +//#define WIN32_LEAN_AND_MEAN +#include +#include "utils.h" + +#define CREATEWINDOW 106 +#define CREATEWINDOWEX 107 +#define CREATEWINDOWW 108 + +#define ResultX 0 +#define ResultY 305 + +#define NOTIFYX 350 +#define NOTIFYY 285 + +#define BUFFERLEN 80 /* Size of buffer to hold result strings */ + +/* Edit is created with this text */ +#define TestStr "The quick brown fox jumps over the lazy dog" + +#define TestStrW L"This is a WCHAR string" /* Wide to support unicode edits */ + +#define MAXMESSAGEBUTTONS 42 + +HWND g_hwnd = NULL; +HINSTANCE g_hInst = NULL; + +int pos = 10; +int n = 0; +int yButPos = 10; +int xButPos = 10; + +DWORD EditStyle = 0; +DWORD EditWidth = 240; +DWORD EditHeight = 250; + +BOOL UnicodeUsed = FALSE; + +HWND hwndEdit = NULL; + +POINTL point={10,3}; +RECT rect = {0,0,20,20},rect2; +DWORD StartP,EndP; + +#define ReplaceText "->> Replaced!! <<-" + +char* AllocatedText; /* Buffer in the heap to feed it to the edit control */ +char* NewText = "New text for the edit control"; +wchar_t* NewTextW = L"New text for the edit control in UNICODE"; // Wide + +char TextBuffer[BUFFERLEN]={'R','e','s','u','l','t',':',' '}; + +typedef void FunctionHandler(HWND,DWORD,WPARAM,LPARAM); +typedef FunctionHandler* LPFUNCTIONHANDLER; + +PrintTextXY(char* Text,int x,int y,int len) +{ + HDC hdc; + hdc = GetDC (g_hwnd); + SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)); + + TextOut (hdc, x,y,Text,len); + ReleaseDC (g_hwnd, hdc); + ValidateRect (g_hwnd, &rect); +} + +static +VOID +HandlePrintReturnHex(HWND handle,DWORD Msg,WPARAM wParam,LPARAM lParam) + { + int ret; + ret = SendMessage(handle,Msg,wParam,lParam); + htoa(ret,&TextBuffer[8]); + PrintTextXY(TextBuffer,ResultX,ResultY,16); + } + +static +VOID +HandleSetHandlePrintHex(HWND handle,DWORD Msg,WPARAM wParam,LPARAM lParam) + { + LPVOID pMem; + HANDLE hNewBuffer; + int ret; + + LocalFree((HLOCAL)SendMessage(handle, EM_GETHANDLE, 0, 0L)); + if (UnicodeUsed) + { + hNewBuffer = LocalAlloc(LMEM_MOVEABLE | LMEM_ZEROINIT, 100); + pMem = LocalLock(hNewBuffer); + strcpyw_((wchar_t*)pMem,NewTextW); + } + else + { + hNewBuffer = LocalAlloc(LMEM_MOVEABLE | LMEM_ZEROINIT,50); + pMem = LocalLock(hNewBuffer); + strcpy_((char*)pMem,NewText); + } + + LocalUnlock(pMem); + hNewBuffer = LocalHandle(pMem); + + /* Updates the buffer and displays new buffer */ + ret = SendMessage(handle, EM_SETHANDLE, (WPARAM)hNewBuffer, 0L); + + htoa(ret,&TextBuffer[8]); + PrintTextXY(TextBuffer,ResultX,ResultY,16); + } + +static +VOID +HandlePrintReturnStr(HWND handle,DWORD Msg,WPARAM wParam,LPARAM lParam) + { + int ret; + TextBuffer[8] = (char)(BUFFERLEN - 8); /* Setting the max size to put chars in first byte */ + ret = SendMessage(handle,Msg,wParam,lParam); + PrintTextXY(TextBuffer,ResultX,ResultY,8+ret); + } + +static +VOID +HandlePrintRect(HWND handle,DWORD Msg,WPARAM wParam,LPARAM lParam) + { + TextBuffer[8] = (char)(BUFFERLEN - 8); /* Setting the max size to put chars in first byte */ + SendMessage(handle,Msg,wParam,lParam); + + htoa(rect.top,&TextBuffer[8]); + TextBuffer[8+8] = ' '; + htoa(rect.bottom,&TextBuffer[8+8+1]); + TextBuffer[8+8+8+1] = ' '; + htoa(rect.left,&TextBuffer[8+8+8+1+1]); + TextBuffer[8+8+8+8+1+1] = ' '; + htoa(rect.right,&TextBuffer[8+8+8+8+1+1+1]); + + PrintTextXY(TextBuffer,ResultX,ResultY,8+4*9-1); + } + +static +VOID +HandlePrintPasswdChar(HWND handle,DWORD Msg,WPARAM wParam,LPARAM lParam) + { + HDC hdc; + int ret = SendMessage(handle,Msg,wParam,lParam); + + int s; + + if (ret) + { + s = 1; + TextBuffer[8] = (char)(ret); + } + else + { + TextBuffer[8] = 'N'; + TextBuffer[9] = 'U'; + TextBuffer[10] = 'L'; + TextBuffer[11] = 'L'; + s = 4; + } + + hdc = GetDC (g_hwnd); + SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)); + + TextOut (hdc,ResultX ,ResultY,TextBuffer,8+s); + ReleaseDC (g_hwnd, hdc); + ValidateRect (g_hwnd, &rect); + } + + +struct +{ + char* Text; /* Text for the button */ + DWORD MsgCode; /* Message Code */ + WPARAM wParam; /* Well hope you can understand this */ + LPARAM lParam; /* ditto */ + LPFUNCTIONHANDLER Handler; /* Funtion called to handle the result of each message */ +} +Msg[] = +{ + "EM_CANUNDO",EM_CANUNDO,0,0,&HandlePrintReturnHex, + "EM_CHARFROMPOS",EM_CHARFROMPOS,(WPARAM)&point,0,&HandlePrintReturnHex, + "EM_EMPTYUNDOBUFFER",EM_EMPTYUNDOBUFFER,0,0,&HandlePrintReturnHex, + "EM_FMTLINES",EM_FMTLINES,TRUE,0,&HandlePrintReturnHex, + "EM_GETFIRSTVISIBLELINE",EM_GETFIRSTVISIBLELINE,0,0,&HandlePrintReturnHex, + + "EM_GETLIMITTEXT",EM_GETLIMITTEXT,0,0,&HandlePrintReturnHex, + "EM_GETLINE",EM_GETLINE,2,(WPARAM)&TextBuffer[8],&HandlePrintReturnStr, + "EM_GETLINECOUNT",EM_GETLINECOUNT,0,0,&HandlePrintReturnHex, + "EM_GETMARGINS",EM_GETMARGINS,0,0,&HandlePrintReturnHex, + "EM_SETMARGINS",EM_SETMARGINS,EC_LEFTMARGIN,10,&HandlePrintReturnHex, + + "EM_GETMODIFY",EM_GETMODIFY,0,0,&HandlePrintReturnHex, + "EM_SETMODIFY",EM_SETMODIFY,TRUE,0,&HandlePrintReturnHex, + + "EM_GETSEL",EM_GETSEL,(WPARAM)&StartP,(LPARAM)&EndP,&HandlePrintReturnHex, + + "EM_GETTHUMB",EM_GETTHUMB,0,0,&HandlePrintReturnHex, + + "EM_LIMITTEXT",EM_LIMITTEXT,10,0,&HandlePrintReturnHex, + "EM_LINEFROMCHAR",EM_LINEFROMCHAR,-1,0,&HandlePrintReturnHex, + "EM_POSFROMCHAR",EM_POSFROMCHAR,10,0,&HandlePrintReturnHex, + "EM_LINEINDEX",EM_LINEINDEX,2,0,&HandlePrintReturnHex, + "EM_LINELENGTH",EM_LINELENGTH,-1,0,&HandlePrintReturnHex, + + "EM_GETWORDBREAKPROC",EM_GETWORDBREAKPROC,0,0,&HandlePrintReturnHex, + "EM_REPLACESEL",EM_REPLACESEL,TRUE,(LPARAM)&ReplaceText,&HandlePrintReturnHex, + + "EM_LINESCROLL",EM_LINESCROLL,5,1,&HandlePrintReturnHex, + "EM_SCROLL",EM_SCROLL,SB_LINEDOWN,0,&HandlePrintReturnHex, + "EM_SCROLLCARET",EM_SCROLLCARET,0,0,&HandlePrintReturnHex, + + "EM_SETHANDLE",EM_SETHANDLE,0,0,&HandleSetHandlePrintHex, + "EM_GETHANDLE",EM_GETHANDLE,0,0,&HandlePrintReturnHex, + "EM_GETPASSWORDCHAR",EM_GETPASSWORDCHAR,0,0,&HandlePrintPasswdChar, + "EM_SETPASSWORDCHAR - clear",EM_SETPASSWORDCHAR,0,0,&HandlePrintReturnHex, + "EM_SETPASSWORDCHAR - x",EM_SETPASSWORDCHAR,'x',0,&HandlePrintReturnHex, + + "EM_SETREADONLY - set",EM_SETREADONLY,TRUE,0,&HandlePrintReturnHex, + "EM_SETREADONLY - clear",EM_SETREADONLY,FALSE,0,&HandlePrintReturnHex, + + "EM_GETRECT",EM_GETRECT,0,(LPARAM)&rect2,&HandlePrintRect, + "EM_SETRECT",EM_SETRECT,0,(LPARAM)&rect,&HandlePrintReturnHex, + "EM_SETRECTNP",EM_SETRECTNP,0,(LPARAM)&rect,&HandlePrintReturnHex, + "EM_SETSEL",EM_SETSEL,1,3,&HandlePrintReturnHex, + + "EM_SETSEL - all",EM_SETSEL,0,-1,&HandlePrintReturnHex, + "EM_SETSEL - remove",EM_SETSEL,-1,0,&HandlePrintReturnHex, + "EM_UNDO",EM_UNDO,0,0,&HandlePrintReturnHex, + "WM_UNDO",WM_UNDO,0,0,&HandlePrintReturnHex, + "WM_PASTE",WM_PASTE,0,0,&HandlePrintReturnHex, + + "WM_CUT",WM_CUT,0,0,&HandlePrintReturnHex, + "WM_COPY",WM_COPY,0,0,&HandlePrintReturnHex + +}; + +DWORD EditStyles[] = { + WS_THICKFRAME,WS_DISABLED,WS_BORDER,ES_LOWERCASE,ES_UPPERCASE,ES_NUMBER,ES_AUTOVSCROLL, + ES_AUTOHSCROLL,ES_LEFT,ES_CENTER,ES_RIGHT,ES_MULTILINE, + ES_NOHIDESEL,ES_OEMCONVERT,ES_PASSWORD,ES_READONLY,ES_WANTRETURN, + WS_HSCROLL,WS_VSCROLL + }; + +char* StyleNames[] = { + "WS_THICKFRAME","WS_DISABLED","WS_BORDER","ES_LOWERCASE","ES_UPPERCASE","ES_NUMBER","ES_AUTOVSCROLL", + "ES_AUTOHSCROLL","ES_LEFT","ES_CENTER","ES_RIGHT","ES_MULTILINE", + "ES_NOHIDESEL","ES_OEMCONVERT","ES_PASSWORD","ES_READONLY","ES_WANTRETURN", + "WS_HSCROLL","WS_VSCROLL" + }; + +#define NUMBERBUTTONS 26 +HWND Buttons[NUMBERBUTTONS]; +HWND MessageButtons[MAXMESSAGEBUTTONS]; +HWND Back1But,Back2But; +HWND NextBut; + + +HWND +CreateCheckButton(const char* lpWindowName, DWORD xSize, DWORD id) + { + HWND h; + h = CreateWindowEx(0, + "BUTTON", + lpWindowName, + WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, + xButPos, /* x */ + yButPos, /* y */ + xSize, /* nWidth */ + 20, /* nHeight */ + g_hwnd, + (HMENU) id, + g_hInst, + NULL + ); + yButPos += 21; + return h; + } + +HWND +CreatePushButton(const char* lpWindowName, DWORD xSize, DWORD id,DWORD Style) + { + + HWND h = CreateWindow("BUTTON", + lpWindowName, + WS_CHILD | BS_PUSHBUTTON | Style, + xButPos, // x + yButPos, // y + xSize, // nWidth + 20, // nHeight + g_hwnd, + (HMENU) id, + g_hInst, + NULL + ); + + yButPos += 21; + return h; + } + +VOID +ReadNHide() + { + int i; + EditStyle = 0; + for (i=0 ; i< 19 ; i++) + { + if(BST_CHECKED == SendMessage(Buttons[i],BM_GETCHECK,0,0)) + EditStyle |= EditStyles[i]; + ShowWindow(Buttons[i],SW_HIDE); + } + + for (; i< NUMBERBUTTONS ; i++)ShowWindow(Buttons[i],SW_HIDE); + for (i=0 ; i< 26 ; i++) ShowWindow(MessageButtons[i],SW_SHOW); + + ShowWindow(Back1But,SW_SHOW); + ShowWindow(NextBut,SW_SHOW); + } + +VOID +ForwardToSecondPage() + { + int i; + for (i=0;i<26;i++)ShowWindow(MessageButtons[i],SW_HIDE); + for(;i= 600) + { + Msg[LOWORD(wParam)-600].Handler(hwndEdit, + Msg[LOWORD(wParam)-600].MsgCode, + Msg[LOWORD(wParam)-600].wParam, + Msg[LOWORD(wParam)-600].lParam); + break; + } + + switch(LOWORD(wParam)){ + + case 100: + EditWidth += 10; + break; + + case 101: + EditWidth -= 10; + break; + + case 102: + EditHeight += 10; + break; + + case 103: + EditHeight -= 10; + break; + + case 400: + BackToInitialPage(); + break; + + case 401: + ForwardToSecondPage(); + break; + + case 402: + BackToFirstPage(); + break; + + case CREATEWINDOW: + UnicodeUsed = FALSE; + ReadNHide(); + hwndEdit = CreateWindow("EDIT", + TestStr, + EditStyle | WS_CHILD | WS_VISIBLE, + 350, + 10, + EditWidth, + EditHeight, + g_hwnd, + NULL, + g_hInst, + NULL); + break; + + case CREATEWINDOWEX: + UnicodeUsed = FALSE; + ReadNHide(); + hwndEdit = CreateWindowEx(WS_EX_CLIENTEDGE, + "EDIT", + TestStr, + EditStyle | WS_CHILD | WS_VISIBLE , + 350, + 10, + EditWidth, + EditHeight, + g_hwnd, + NULL, + g_hInst, + NULL); + break; + + case CREATEWINDOWW: + UnicodeUsed = TRUE; + ReadNHide(); + hwndEdit = CreateWindowExW(WS_EX_CLIENTEDGE, + L"EDIT", + TestStrW, + EditStyle | WS_CHILD | WS_VISIBLE , + 350, + 10, + EditWidth, + EditHeight, + g_hwnd, + NULL, + g_hInst, + NULL); + break; + } + + if (lParam == (LPARAM)hwndEdit) + switch(HIWORD(wParam)) + { + case EN_CHANGE: + PrintTextXY("EN_CHANGE notification",NOTIFYX,NOTIFYY,22); + break; + + case EN_ERRSPACE: + PrintTextXY("EN_ERRSPACE notification",NOTIFYX,NOTIFYY,24); + break; + + /* --- FIXME not defined in w32api-2.3 headers + case H_SCROLL: + PrintTextXY("H_SCROLL notification",NOTIFYX,NOTIFYY,21); + break; */ + + /* --- FIXME not defined in w32api-2.3 headers + case KILL_FOCUS: + PrintTextXY("KILL_FOCUS notification",NOTIFYX,NOTIFYY,23); + break; */ + + /* --- FIXME not defined in w32api-2.3 headers + case EN_MAXTEST: + PrintTextXY("EN_MAXTEXT notification",NOTIFYX,NOTIFYY,23); + break; */ + + case EN_SETFOCUS: + PrintTextXY("EN_SETFOCUS notification",NOTIFYX,NOTIFYY,24); + break; + + case EN_UPDATE: + PrintTextXY("EN_UPDATE notification",NOTIFYX,NOTIFYY + 20,22); + break; + + case EN_VSCROLL: + PrintTextXY("EN_VSCROLL notification",NOTIFYX,NOTIFYY,23); + break; + + } + + break; + + case WM_SIZE : + return 0; + + case WM_CLOSE: + DestroyWindow (g_hwnd); + return 0; + + case WM_QUERYENDSESSION: + return 0; + + case WM_DESTROY: + PostQuitMessage(0); + return 0; + } + return DefWindowProc ( hwnd, msg, wParam, lParam ); +} + + +HWND +RegisterAndCreateWindow (HINSTANCE hInst, + const char* className, + const char* title) +{ + WNDCLASSEX wc; + HWND hwnd; + + g_hInst = hInst; + + wc.cbSize = sizeof (WNDCLASSEX); + + wc.lpfnWndProc = WndProc; /* window procedure */ + wc.hInstance = hInst; /* owner of the class */ + + wc.lpszClassName = className; + wc.hCursor = LoadCursor ( 0, IDC_ARROW ); + wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1); + wc.style = CS_HREDRAW | CS_VREDRAW; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hIcon = 0; + wc.hIconSm = 0; + wc.lpszMenuName = 0; + + if ( !RegisterClassEx ( &wc ) ) + return NULL; + + hwnd = CreateWindowEx ( + 0, /* dwStyleEx */ + className, /* class name */ + title, /* window title */ + + WS_OVERLAPPEDWINDOW, /* dwStyle */ + + 1, /* x */ + 1, /* y */ + 560, /* width */ + 350, /* height */ + NULL, /* hwndParent */ + NULL, /* hMenu */ + hInst, + 0 + ); + + if (!hwnd) return NULL; + + ShowWindow (hwnd, SW_SHOW); + UpdateWindow (hwnd); + + return hwnd; +} + +int +WINAPI +WinMain ( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR cmdParam, int cmdShow ) +{ + char className [] = "Edit Control Test"; + MSG msg; + + RegisterAndCreateWindow ( hInst, className, "Edit Control Styles Test" ); + + // Message loop + while (GetMessage (&msg, NULL, 0, 0)) + { + TranslateMessage (&msg); + DispatchMessage (&msg); + } + return msg.wParam; + +} diff --git a/reactos/apps/tests/edit/makefile b/reactos/apps/tests/edit/makefile index d4a7802362b..04a37249600 100644 --- a/reactos/apps/tests/edit/makefile +++ b/reactos/apps/tests/edit/makefile @@ -7,11 +7,13 @@ TARGET_TYPE = program TARGET_APPTYPE = windows -TARGET_NAME = edit-control +TARGET_NAME = edittest TARGET_SDKLIBS = kernel32.a gdi32.a -TARGET_OBJECTS = edit.o +TARGET_OBJECTS = \ + edittest.o \ + utils.o include $(PATH_TO_TOP)/rules.mak diff --git a/reactos/apps/tests/edit/utils.c b/reactos/apps/tests/edit/utils.c new file mode 100644 index 00000000000..f1eff54609f --- /dev/null +++ b/reactos/apps/tests/edit/utils.c @@ -0,0 +1,33 @@ +/* + * Edit Control Test for ReactOS, quick n' dirty. There you go + * This source code is in the PUBLIC DOMAIN and has NO WARRANTY. + * by Waldo Alvarez Caņizares , June 22, 2003. + */ + +#include + +static const char hexvals[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; +VOID htoa (unsigned int val, char *buf) +{ + int i; + buf += 7; + + for (i=0;i<8;i++) + { + *buf-- = hexvals[val & 0x0000000F]; + val = val >> 4; + } +} + + +VOID strcpy_(char *dst, const char *src) +{ + const char* p = src; + while ((*dst++ = *p++)) {} +} + +VOID strcpyw_(wchar_t* dst,wchar_t* src) +{ + const wchar_t* p = src; + while ((*dst++ = *p++)) {} +} diff --git a/reactos/apps/tests/edit/utils.h b/reactos/apps/tests/edit/utils.h new file mode 100644 index 00000000000..f6a12649c1e --- /dev/null +++ b/reactos/apps/tests/edit/utils.h @@ -0,0 +1,9 @@ +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ +VOID htoa (unsigned int, char *); +VOID strcpy_(char *, const char *); +VOID strcpyw_(wchar_t*,wchar_t*); +#ifdef __cplusplus + } +#endif