diff --git a/reactos/apps/tests/winhello/winhello.c b/reactos/apps/tests/winhello/winhello.c index 89da4185918..ffdbee65f3d 100644 --- a/reactos/apps/tests/winhello/winhello.c +++ b/reactos/apps/tests/winhello/winhello.c @@ -1,9 +1,29 @@ +/* + * ReactOS Winhello - Simple Win32 Windowing test + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + #include #include -#include +#include -//HFONT tf; +HFONT tf; LRESULT WINAPI MainWndProc(HWND, UINT, WPARAM, LPARAM); +BOOLEAN bolWM_CHAR; +BOOLEAN bolWM_KEYDOWN; int WINAPI WinMain(HINSTANCE hInstance, @@ -14,6 +34,8 @@ WinMain(HINSTANCE hInstance, WNDCLASS wc; MSG msg; HWND hWnd; + bolWM_CHAR = 0; + bolWM_KEYDOWN = 0; wc.lpszClassName = "HelloClass"; wc.lpfnWndProc = MainWndProc; @@ -33,16 +55,16 @@ WinMain(HINSTANCE hInstance, } hWnd = CreateWindow("HelloClass", - "Hello World", - WS_OVERLAPPEDWINDOW|WS_HSCROLL|WS_VSCROLL, - 0, - 0, - CW_USEDEFAULT, - CW_USEDEFAULT, - NULL, - NULL, - hInstance, - NULL); + "Hello World", + WS_OVERLAPPEDWINDOW|WS_HSCROLL|WS_VSCROLL, + 0, //Position; you can use CW_USEDEFAULT, too + 0, + 600, //height + 400, + NULL, + NULL, + hInstance, + NULL); if (hWnd == NULL) { fprintf(stderr, "CreateWindow failed (last error 0x%lX)\n", @@ -50,9 +72,9 @@ WinMain(HINSTANCE hInstance, return(1); } - //tf = CreateFontA(14, 0, 0, TA_BASELINE, FW_NORMAL, FALSE, FALSE, FALSE, - // ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, - // DEFAULT_QUALITY, FIXED_PITCH|FF_DONTCARE, "Timmons"); + tf = CreateFontA(14, 0, 0, TA_BASELINE, FW_NORMAL, FALSE, FALSE, FALSE, + ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, + DEFAULT_QUALITY, FIXED_PITCH|FF_DONTCARE, "Timmons"); ShowWindow(hWnd, nCmdShow); @@ -62,37 +84,531 @@ WinMain(HINSTANCE hInstance, DispatchMessage(&msg); } - //DeleteObject(tf); + DeleteObject(tf); return msg.wParam; } LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { - PAINTSTRUCT ps; - HDC hDC; - RECT clr, wir; + PAINTSTRUCT ps; /* Also used during window drawing */ + HDC hDC; /* A device context used for drawing */ + RECT rc, clr, wir; /* A rectangle used during drawing */ char spr[100], sir[100]; + static HBRUSH hbrWhite=NULL, hbrGray=NULL, hbrBlack=NULL, hbrRed=NULL, hbrBlue=NULL, hbrYellow=NULL; + + /* The window handle for the "Click Me" button. */ + static HWND hwndButton = 0; + static int cx, cy; /* Height and width of our button. */ switch(msg) { - case WM_LBUTTONUP: - { - ULONG x, y; - RECT Rect; - hDC = GetDC(hWnd); - x = LOWORD(lParam); - y = HIWORD(lParam); - Rect.left = x - 5; - Rect.top = y - 5; - Rect.right = x + 5; - Rect.bottom = y + 5; - FillRect(hDC, &Rect, CreateSolidBrush(RGB(0xFF, 0x00, 0x00))); - ReleaseDC(hWnd, hDC); - break; - } + + case WM_CHAR: + { + + hDC = GetDC(hWnd); + TCHAR text[2]; + text[0] = (TCHAR)wParam; + text[1] = _T('\0'); + + //Write in window + if( bolWM_KEYDOWN ) + { + TextOut(hDC, 400, 10, "WM CHAR:", strlen("WM CHAR:")); + bolWM_KEYDOWN = 0; + } + else + { + TextOut(hDC, 400, 10, "WM_CHAR:", strlen("WM_CHAR:")); + bolWM_KEYDOWN = 1; + } + TextOut(hDC, 530, 10, text, strlen(text)); + + /* + //Make a line depending on the typed key + Rect.left = 10; + Rect.top = 75; + Rect.right = 610; + Rect.bottom = 85; + FillRect(hDC, &Rect, hbrWhite); + + Rect.left=308; + Rect.right=312; + FillRect(hDC, &Rect, hbrRed); + + Rect.left = 310; + Rect.top = 75; + Rect.right = 310 +text[0]*2; + Rect.bottom = 85; + HBRUSH hbrCustom = CreateSolidBrush ( RGB(text[0], text[0], text[0])); + FillRect(hDC, &Rect, hbrCustom); + DeleteObject ( hbrCustom ); + */ + ReleaseDC(hWnd, hDC); + return 0; + } - case WM_PAINT: + case WM_KEYDOWN: + { + + hDC = GetDC(hWnd); + RECT Rect; + TCHAR text[2]; + text[0] = (TCHAR)wParam; + text[1] = _T('\0'); + + + //Write in window + Rect.left = 400; + Rect.top = 50; + Rect.right = 550; + Rect.bottom = 70; + FillRect(hDC, &Rect, hbrWhite); + if( bolWM_CHAR ) + { + TextOut(hDC, 400, 30, "WM KEYDOWN:", strlen("WM KEYDOWN:")); + bolWM_CHAR = 0; + } + else + { + TextOut(hDC, 400, 30, "WM_KEYDOWN:", strlen("WM_KEYDOWN:")); + bolWM_CHAR = 1; + } + TextOut(hDC, 530, 30, text, strlen(text)); + ReleaseDC(hWnd, hDC); + return 0; + } + + case WM_KEYUP: + { + + hDC = GetDC(hWnd); + RECT Rect; + TCHAR text[2]; + text[0] = (TCHAR)wParam; + text[1] = _T('\0'); + + + //Write in window + Rect.left = 400; + Rect.top = 10; + Rect.right = 550; + Rect.bottom = 70; + FillRect(hDC, &Rect, hbrWhite); + TextOut(hDC, 400, 50, "WM_KEYUP:", strlen("WM_KEYUP:")); + TextOut(hDC, 530, 50, text, strlen(text)); + ReleaseDC(hWnd, hDC); + return 0; + } + + + case WM_LBUTTONDOWN: + { + ULONG x, y; + RECT Rect; + hDC = GetDC(hWnd); + x = LOWORD(lParam); + y = HIWORD(lParam); + + Rect.left = x - 5; + Rect.top = y - 5; + Rect.right = x + 5; + Rect.bottom = y + 5; + FillRect(hDC, &Rect, hbrRed); + + Rect.left = x - 3; + Rect.top = y - 3; + Rect.right = x + 3; + Rect.bottom = y + 3; + FillRect(hDC, &Rect, hbrBlack); + + ReleaseDC(hWnd, hDC); + break; + } + case WM_LBUTTONUP: + { + ULONG x, y; + RECT Rect; + hDC = GetDC(hWnd); + x = LOWORD(lParam); + y = HIWORD(lParam); + + Rect.left = x - 5; + Rect.top = y - 5; + Rect.right = x + 5; + Rect.bottom = y + 5; + FillRect(hDC, &Rect, hbrRed); + + Rect.left = x - 3; + Rect.top = y - 3; + Rect.right = x + 3; + Rect.bottom = y + 3; + FillRect(hDC, &Rect, hbrGray); + + ReleaseDC(hWnd, hDC); + break; + } + case WM_MBUTTONDOWN: + { + ULONG x, y; + RECT Rect; + hDC = GetDC(hWnd); + x = LOWORD(lParam); + y = HIWORD(lParam); + + Rect.left = x - 5; + Rect.top = y - 5; + Rect.right = x + 5; + Rect.bottom = y + 5; + FillRect(hDC, &Rect, hbrBlue); + + Rect.left = x - 3; + Rect.top = y - 3; + Rect.right = x + 3; + Rect.bottom = y + 3; + FillRect(hDC, &Rect, hbrBlack); + + ReleaseDC(hWnd, hDC); + break; + } + case WM_MBUTTONUP: + { + ULONG x, y; + RECT Rect; + hDC = GetDC(hWnd); + x = LOWORD(lParam); + y = HIWORD(lParam); + + Rect.left = x - 5; + Rect.top = y - 5; + Rect.right = x + 5; + Rect.bottom = y + 5; + FillRect(hDC, &Rect, hbrBlue); + + Rect.left = x - 3; + Rect.top = y - 3; + Rect.right = x + 3; + Rect.bottom = y + 3; + FillRect(hDC, &Rect, hbrGray); + + ReleaseDC(hWnd, hDC); + break; + } + case WM_RBUTTONDOWN: + { + ULONG x, y; + RECT Rect; + hDC = GetDC(hWnd); + x = LOWORD(lParam); + y = HIWORD(lParam); + + Rect.left = x - 5; + Rect.top = y - 5; + Rect.right = x + 5; + Rect.bottom = y + 5; + FillRect(hDC, &Rect, hbrYellow); + + Rect.left = x - 3; + Rect.top = y - 3; + Rect.right = x + 3; + Rect.bottom = y + 3; + FillRect(hDC, &Rect, hbrBlack); + + ReleaseDC(hWnd, hDC); + break; + } + case WM_RBUTTONUP: + { + ULONG x, y; + RECT Rect; + hDC = GetDC(hWnd); + x = LOWORD(lParam); + y = HIWORD(lParam); + + Rect.left = x - 5; + Rect.top = y - 5; + Rect.right = x + 5; + Rect.bottom = y + 5; + FillRect(hDC, &Rect, hbrYellow); + + Rect.left = x - 3; + Rect.top = y - 3; + Rect.right = x + 3; + Rect.bottom = y + 3; + FillRect(hDC, &Rect, hbrGray); + + ReleaseDC(hWnd, hDC); + break; + } + + case WM_MOUSEMOVE: + { + int fwKeys; + int x; + int y; + RECT Rect; + int temp; + TCHAR text[256]; + + hDC = GetDC(hWnd); + fwKeys = wParam; // key flags + x = LOWORD(lParam); // horizontal position of cursor + y = HIWORD(lParam); // vertical position of cursor + + Rect.left = 10; + Rect.top = 100; + Rect.right = 160; + Rect.bottom = 300; + FillRect(hDC, &Rect, hbrWhite); + + temp = _sntprintf ( text, sizeof(text)/sizeof(*text), _T("x: %d"), x ); + TextOut(hDC,10,100,text,strlen(text)); + temp = _sntprintf ( text, sizeof(text)/sizeof(*text), _T("y: %d"), y ); + TextOut(hDC,10,120,text,strlen(text)); + + Rect.left = x - 2; + Rect.top = y - 2; + Rect.right = x + 2; + Rect.bottom = y + 2; + + switch ( fwKeys ) + { + case MK_CONTROL: + TextOut(hDC,10,140,"Control",strlen("Control")); + break; + case MK_SHIFT: + TextOut(hDC,10,160,"Shift",strlen("Shift")); + break; + case MK_LBUTTON: + TextOut(hDC,10,180,"Left",strlen("Left")); + FillRect(hDC, &Rect, hbrRed); + break; + case MK_MBUTTON: + TextOut(hDC,10,200,"Middle",strlen("Middle")); + FillRect(hDC, &Rect, hbrBlue); + break; + case MK_RBUTTON: + TextOut(hDC,10,220,"Right",strlen("Right")); + FillRect(hDC, &Rect, hbrYellow); + break; + } + ReleaseDC(hWnd, hDC); + break; + } + + case WM_HSCROLL: + { + int nPos; + int temp; + RECT Rect; + int nScrollCode; + HWND hwndScrollBar; + TCHAR text[256]; + SCROLLINFO Scrollparameter; + nScrollCode = (int) LOWORD(wParam); // scroll bar value + nPos = (short int) HIWORD(wParam); // scroll box position + hwndScrollBar = (HWND) lParam; // handle to scroll bar + hDC = GetDC(hWnd); + + Scrollparameter.cbSize = sizeof(Scrollparameter); + Scrollparameter.fMask = SIF_ALL; + GetScrollInfo ( hWnd, SB_HORZ, &Scrollparameter ); + + Rect.left = 200; + Rect.top = 100; + Rect.right = 350; + Rect.bottom = 300; + FillRect(hDC, &Rect, hbrWhite); + + switch ( nScrollCode ) + { + case SB_ENDSCROLL: //Ends scroll. + TextOut(hDC,200,120,"SB_ENDSCROLL ",16); + Scrollparameter.nPos = Scrollparameter.nPos; + break; + case SB_LEFT: //Scrolls to the upper left. + TextOut(hDC,200,140,"SB_LEFT ",16); + Scrollparameter.nPos = Scrollparameter.nMin; + break; + case SB_RIGHT: //Scrolls to the lower right. + TextOut(hDC,200,160,"SB_RIGHT ",16); + Scrollparameter.nPos = Scrollparameter.nMax; + break; + case SB_LINELEFT: //Scrolls left by one unit. + TextOut(hDC,200,180,"SB_LINELEFT ",16); + Scrollparameter.nPos--; + break; + case SB_LINERIGHT: //Scrolls right by one unit. + TextOut(hDC,200,200,"SB_LINERIGHT ",16); + Scrollparameter.nPos++; + break; + case SB_PAGELEFT: //Scrolls left by the width of the window. + TextOut(hDC,200,220,"SB_PAGELEFT ",16); + Scrollparameter.nPos -= Scrollparameter.nPage; + break; + case SB_PAGERIGHT: //Scrolls right by the width of the window. + TextOut(hDC,200,240,"PAGERIGHT ",16); + Scrollparameter.nPos += Scrollparameter.nPage; + break; + case SB_THUMBPOSITION: //The user has dragged the scroll box (thumb) and released the mouse button. The nPos parameter indicates the position of the scroll box at the end of the drag operation. + TextOut(hDC,200,260,"SB_THUMBPOSITION",16); + Scrollparameter.nPos = Scrollparameter.nTrackPos; + break; + case SB_THUMBTRACK: // + TextOut(hDC,200,280,"SB_THUMBTRACK ",16); + Scrollparameter.nPos = Scrollparameter.nTrackPos; + break; + } + + SetScrollInfo( + hWnd, // handle to window with scroll bar + SB_HORZ, // scroll bar flag + &Scrollparameter, // pointer to structure with scroll parameters + 1 // redraw flag + ); + temp = _sntprintf ( text, sizeof(text)/sizeof(*text), _T("Horizontal: %d"), Scrollparameter.nPos ); + TextOut(hDC,200,100,text,strlen(text)); + + return 0; + } + + case WM_VSCROLL: + { + int nPos; + int temp; + RECT Rect; + int nScrollCode; + HWND hwndScrollBar; + TCHAR text[256]; + SCROLLINFO Scrollparameter; + nScrollCode = (int) LOWORD(wParam); // scroll bar value + nPos = (short int) HIWORD(wParam); // scroll box position + hwndScrollBar = (HWND) lParam; // handle to scroll bar + hDC = GetDC(hWnd); + + Scrollparameter.cbSize = sizeof(Scrollparameter); + Scrollparameter.fMask = SIF_ALL; + GetScrollInfo ( hWnd, SB_VERT, &Scrollparameter ); + + Rect.left = 400; + Rect.top = 100; + Rect.right = 550; + Rect.bottom = 300; + FillRect(hDC, &Rect, hbrWhite); + + switch ( nScrollCode ) + { + case SB_ENDSCROLL: //Ends scroll. + TextOut(hDC,400,120,"SB_ENDSCROLL ",16); + Scrollparameter.nPos = Scrollparameter.nPos; + break; + case SB_LEFT: //Scrolls to the upper left. + TextOut(hDC,400,140,"SB_LEFT ",16); + Scrollparameter.nPos = Scrollparameter.nMin; + break; + case SB_RIGHT: //Scrolls to the lower right. + TextOut(hDC,400,160,"SB_RIGHT ",16); + Scrollparameter.nPos = Scrollparameter.nMax; + break; + case SB_LINELEFT: //Scrolls left by one unit. + TextOut(hDC,400,180,"SB_LINELEFT ",16); + Scrollparameter.nPos--; + break; + case SB_LINERIGHT: //Scrolls right by one unit. + TextOut(hDC,400,200,"SB_LINERIGHT ",16); + Scrollparameter.nPos++; + break; + case SB_PAGELEFT: //Scrolls left by the width of the window. + TextOut(hDC,400,220,"SB_PAGELEFT ",16); + Scrollparameter.nPos -= Scrollparameter.nPage; + break; + case SB_PAGERIGHT: //Scrolls right by the width of the window. + TextOut(hDC,400,240,"PAGERIGHT ",16); + Scrollparameter.nPos += Scrollparameter.nPage; + break; + case SB_THUMBPOSITION: //The user has dragged the scroll box (thumb) and released the mouse button. The nPos parameter indicates the position of the scroll box at the end of the drag operation. + TextOut(hDC,400,260,"SB_THUMBPOSITION",16); + Scrollparameter.nPos = Scrollparameter.nTrackPos; + break; + case SB_THUMBTRACK: // + TextOut(hDC,400,280,"SB_THUMBTRACK ",16); + Scrollparameter.nPos = Scrollparameter.nTrackPos; + break; + } + + SetScrollInfo( + hWnd, // handle to window with scroll bar + SB_VERT, // scroll bar flag + &Scrollparameter, // pointer to structure with scroll parameters + 1 // redraw flag + ); + temp = _sntprintf ( text, sizeof(text)/sizeof(*text), _T("Vertical: %d"), Scrollparameter.nPos ); + TextOut(hDC,400,100,text,strlen(text)); + + return 0; + } + case WM_DESTROY: + PostQuitMessage(0); + DeleteObject ( hbrWhite ); + DeleteObject ( hbrGray ); + DeleteObject ( hbrBlack ); + DeleteObject ( hbrRed ); + DeleteObject ( hbrBlue ); + DeleteObject ( hbrYellow ); + break; + + case WM_CREATE: + { + hbrWhite = CreateSolidBrush ( RGB(0xFF, 0xFF, 0xFF)); + hbrGray = CreateSolidBrush ( RGB(0xAF, 0xAF, 0xAF)); + hbrBlack = CreateSolidBrush ( RGB(0x00, 0x00, 0x00)); + hbrRed = CreateSolidBrush ( RGB(0xFF, 0x00, 0x00)); + hbrBlue = CreateSolidBrush ( RGB(0x00, 0x00, 0xFF)); + hbrYellow = CreateSolidBrush ( RGB(0xFF, 0xFF, 0x00)); + + SCROLLINFO si; + si.cbSize = sizeof(si); + si.fMask = SIF_ALL; + si.nMin = 0; + si.nMax = 100; + si.nPage = 5; + si.nPos = 0; + + SetScrollInfo ( hWnd, SB_HORZ, &si, FALSE ); + SetScrollInfo ( hWnd, SB_VERT, &si, FALSE ); + + + /* The window is being created. Create our button + * window now. */ + TEXTMETRIC tm; + + /* First we use the system fixed font size to choose + * a nice button size. */ + hDC = GetDC (hWnd); + SelectObject (hDC, GetStockObject (SYSTEM_FIXED_FONT)); + GetTextMetrics (hDC, &tm); + cx = tm.tmAveCharWidth * 30; + cy = (tm.tmHeight + tm.tmExternalLeading) * 2; + ReleaseDC (hWnd, hDC); + + /* Now create the button */ + hwndButton = CreateWindow ( + "button", /* Builtin button class */ + "Click Here", + WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, + 0, 0, cx, cy, + hWnd, /* Parent is this window. */ + (HMENU) 1, /* Control ID: 1 */ + ((LPCREATESTRUCT) lParam)->hInstance, + NULL + ); + + return 0; + break; + } + + case WM_PAINT: hDC = BeginPaint(hWnd, &ps); EndPaint(hWnd, &ps); //SelectObject(hDC, tf); @@ -105,12 +621,48 @@ LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) TextOut(hDC, 10, 30, spr, 20); TextOut(hDC, 10, 50, sir, 20); ReleaseDC ( hWnd, hDC ); + + /* Draw "Hello, World" in the middle of the upper + * half of the window. */ + rc.bottom = rc.bottom / 2; + DrawText (hDC, "Hello, World", -1, &rc, + DT_SINGLELINE | DT_CENTER | DT_VCENTER); + + EndPaint (hWnd, &ps); + return 0; break; - case WM_DESTROY: - PostQuitMessage(0); + case WM_SIZE: + /* The window size is changing. If the button exists + * then place it in the center of the bottom half of + * the window. */ + if (hwndButton && + (wParam == SIZEFULLSCREEN || + wParam == SIZENORMAL) + ) + { + rc.left = (LOWORD(lParam) - cx) / 2; + rc.top = HIWORD(lParam) * 3 / 4 - cy / 2; + MoveWindow ( + hwndButton, + rc.left, rc.top, cx, cy, TRUE); + } break; + case WM_COMMAND: + /* Check the control ID, notification code and + * control handle to see if this is a button click + * message from our child button. */ + if (LOWORD(wParam) == 1 && + HIWORD(wParam) == BN_CLICKED && + (HWND) lParam == hwndButton) + { + /* Our button was clicked. Close the window. */ + DestroyWindow (hWnd); + } + return 0; + break; + default: return DefWindowProc(hWnd, msg, wParam, lParam); }