diff --git a/GUITest/WinStyle.h b/GUITest/WinStyle.h new file mode 100644 index 0000000..6136749 --- /dev/null +++ b/GUITest/WinStyle.h @@ -0,0 +1,15 @@ +#ifndef INCLUDED_WINSTYLE_H +#define INCLUDED_WINSTYLE_H + +#define CM_ARRANGE 1 +#define CM_WHISTLE 2 +#define CM_EXIT 3 +#define CM_HELP 4 +#define CM_BLUE 101 +#define CM_RED 102 +#define CM_GREEN 103 +#define CM_SPECIAL1 104 +#define CM_SPECIAL2 105 +#define CM_SPECIAL3 106 + +#endif /*INCLUDED_WINSTYLE_H*/ diff --git a/GUITest/WinStyle.rc b/GUITest/WinStyle.rc new file mode 100644 index 0000000..fa25386 --- /dev/null +++ b/GUITest/WinStyle.rc @@ -0,0 +1,22 @@ +#include "WinStyle.h" + +Menu MENU +BEGIN + MENUITEM "E&xit", CM_EXIT + MENUITEM "&Arrange", CM_ARRANGE + MENUITEM "&Whistle", CM_WHISTLE + POPUP "&Background" + BEGIN + MENUITEM "&Blue", CM_BLUE + MENUITEM "&Red", CM_RED + MENUITEM "&Green", CM_GREEN + MENUITEM "&Special_1", CM_SPECIAL1 + MENUITEM "&Special_2", CM_SPECIAL2 + MENUITEM "&Special_3", CM_SPECIAL3 + END + MENUITEM "&Help", CM_HELP +END + +PATTERN1 BITMAP "Pattern1.bmp" +PATTERN2 BITMAP "Pattern2.bmp" +PATTERN3 BITMAP "Pattern3.bmp" diff --git a/GUITest/WinStyle.t.c b/GUITest/WinStyle.t.c new file mode 100644 index 0000000..70de396 --- /dev/null +++ b/GUITest/WinStyle.t.c @@ -0,0 +1,333 @@ +#include + +#include "c_WinApp.h" +#include "WinStyle.h" + +#ifndef GCL_HBRBACKGROUND +#define GCL_HBRBACKGROUND (-10) +#endif +/* ------------------------------------------------------------------------------------------------------------------ */ +/* */ + +#define WINDOW_CLASS_NAME "WinStyle.Main" +#define CHILD_CLASS_NAME "WinStyle.Child" + +static HWND ChildWindows[10]; +static HBRUSH hPurpleHaze; +static HBITMAP Pattern1; +static HBITMAP Pattern2; +static HBITMAP Pattern3; + +static DWORD Styles[]={ + WS_POPUP|WS_VISIBLE, + WS_POPUP|WS_VISIBLE|WS_CAPTION, + WS_POPUP|WS_VISIBLE|WS_CAPTION|WS_MINIMIZEBOX|WS_MAXIMIZEBOX, + WS_POPUP|WS_VISIBLE|WS_CAPTION|WS_HSCROLL|WS_VSCROLL, + WS_OVERLAPPEDWINDOW|WS_VISIBLE, + WS_CHILDWINDOW|WS_VISIBLE, + WS_CHILDWINDOW|WS_VISIBLE|WS_THICKFRAME, + WS_CHILDWINDOW|WS_VISIBLE|WS_BORDER|WS_CAPTION, + WS_CHILDWINDOW|WS_VISIBLE|WS_CAPTION|WS_DISABLED, + WS_OVERLAPPEDWINDOW|WS_VISIBLE, +}; + +static char* szStyles[]={ + "WS_POPUP|WS_VISIBLE", + "WS_POPUP|WS_VISIBLE|WS_CAPTION", + "WS_POPUP|WS_VISIBLE|WS_CAPTION|WS_MINIMIZEBOX|WS_MAXIMIZEBOX", + "WS_POPUP|WS_VISIBLE|WS_CAPTION|WS_HSCROLL|WS_VSCROLL", + "WS_OVERLAPPEDWINDOW|WS_VISIBLE", + "WS_CHILDWINDOW|WS_VISIBLE", + "WS_CHILDWINDOW|WS_VISIBLE|WS_THICKFRAME", + "WS_CHILDWINDOW|WS_VISIBLE|WS_BORDER|WS_CAPTION", + "WS_CHILDWINDOW|WS_VISIBLE|WS_CAPTION|WS_DISABLED", + "WS_OVERLAPPEDWINDOW|WS_VISIBLE", +}; + +/* ------------------------------------------------------------------------------------------------------------------ */ +/* */ + +static void ArrangeWinds(HWND hwnd) { + RECT R; + int i; + int j = 0; + for (i=0; i<9; i++) { + MoveWindow(ChildWindows[i], 10 + (j* 100), 10, 100, 100, TRUE); + if (i==4) { + j=0; + }else { + j++; + } + GetWindowRect(hwnd, &R); + MoveWindow(ChildWindows[i], R.left + 10 + GetSystemMetrics(SM_CXFRAME) + (j*100), + R.top + GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME) + GetSystemMetrics(SM_CYMENU) + 10, + 100, 100, TRUE); + } +} + +static void HandleBrush(HWND hwnd, int id) { + HBRUSH OldBrush; +#ifdef WIN32 + OldBrush = (HBRUSH)GetClassLongPtr(hwnd, GCLP_HBRBACKGROUND); +#else + OldBrush = (HBRUSH)GetClassWord(hwnd, GCL_HBRBACKGROUND); +#endif + switch (id) { + case CM_RED: { + hPurpleHaze = CreateSolidBrush(RGB(255, 127, 127)); + break; + } + case CM_GREEN: { + hPurpleHaze = CreateSolidBrush(RGB(127, 255, 127)); + break; + } + case CM_BLUE: { + hPurpleHaze = CreateSolidBrush(RGB(127, 127, 255)); + break; + } + case CM_SPECIAL1: { + hPurpleHaze = CreatePatternBrush(Pattern1); + break; + } + case CM_SPECIAL2: { + hPurpleHaze = CreatePatternBrush(Pattern2); + break; + } + case CM_SPECIAL3: { + hPurpleHaze = CreatePatternBrush(Pattern3); + break; + } + } +#ifdef WIN32 + SetClassLongPtr(hwnd, GCLP_HBRBACKGROUND, (LONG_PTR)hPurpleHaze); +#else + SetClassWord(hwnd, GCLP_HBRBACKGROUND, (WORD)hPurpleHaze); +#endif + DeleteBrush(OldBrush); + InvalidateRect(hwnd, NULL, TRUE); + UpdateWindow(hwnd); +} + +/* ------------------------------------------------------------------------------------------------------------------ */ +/* */ + + +c_WinGUI_EventHandlerDef(WM_DESTROY, Main_Destroy) { + HBRUSH OldBrush; + DeleteObject(Pattern1); + DeleteObject(Pattern2); + DeleteObject(Pattern3); + +#ifdef WIN32 + OldBrush = (HBRUSH)GetClassLong(hwnd, GCL_HBRBACKGROUND); + SetClassLongPtr(hwnd, GCLP_HBRBACKGROUND, (LONG)GetStockObject(WHITE_BRUSH)); +#else + OldBrush = (HBRUSH)GetClassWord(hwnd, GCL_HBRBACKGROUND); + SetClassWord(hwnd, GCL_HBRBACKGROUND, (WORD)GetStockObject(WHITE_BRUSH)); +#endif + + DeleteBrush(OldBrush); + + PostQuitMessage(0); +} + +c_WinGUI_EventHandlerDef(WM_CREATE, Main_Create) { + WORD i; + Pattern1 = LoadBitmap(WinApp.hInstance, "PATTERN1"); + if (!Pattern1) { + MessageBox(hwnd, "No Pattern", "Error", MB_OK); + } + Pattern2 = LoadBitmap(WinApp.hInstance, "PATTERN2"); + if (!Pattern2) { + MessageBox(hwnd, "No Pattern", "Error", MB_OK); + } + Pattern3 = LoadBitmap(WinApp.hInstance, "PATTERN3"); + if (!Pattern3) { + MessageBox(hwnd, "No Pattern", "Error", + MB_OK); + } + hPurpleHaze = CreateSolidBrush(RGB(127, 255, 255)); +#ifdef WIN32 + SetClassLongPtr(hwnd, GCLP_HBRBACKGROUND, (LONG)hPurpleHaze); +#else + SetClassWord(hwnd, GCW_HBRBACKGROUND, (WORD)hPurpleHaze); +#endif + + for (i=0; i<9; i++) { + ChildWindows[i] = CreateWindow(CHILD_CLASS_NAME, NULL, Styles[i], 0, 0, 0, 0, hwnd, NULL, WinApp.hInstance, NULL); + } + ChildWindows[i] = CreateWindow(CHILD_CLASS_NAME, NULL, Styles[i], 0, 0, 0, 0, hwnd, NULL, WinApp.hInstance, NULL); + +#ifdef WIN32 + SetClassLongPtr(ChildWindows[0], GCLP_HBRBACKGROUND, (LONG)hPurpleHaze); +#else + SetClassWord(ChildWindows[0], GCW_HBRBACKGROUND, (WORD)hPurpleHaze); +#endif + + for (i=0; i<10; i++) { + SetWindowLong(ChildWindows[i], 0, i); + } + ArrangeWinds(hwnd); + SetWindowText(ChildWindows[8], "Inactive"); + return TRUE; +} + +c_WinGUI_EventHandlerDef(WM_COMMAND, Main_Command) { + HBRUSH OldBrush; + switch (id) { + case CM_ARRANGE: { + ArrangeWinds(hwnd); + InvalidateRect(hwnd, NULL, TRUE); + break; + } + case CM_WHISTLE: { + SetFocus(ChildWindows[9]); + break; + } + case CM_RED: + case CM_GREEN: + case CM_BLUE: + case CM_SPECIAL1: + case CM_SPECIAL2: + case CM_SPECIAL3: { + HandleBrush(hwnd, id); + break; + } + case CM_EXIT: { + SendMessage(ChildWindows[9], WM_CLOSE, 0, 0); +#ifdef WIN32 + OldBrush = (HBRUSH)GetClassLong(ChildWindows[0], GCL_HBRBACKGROUND); + SetClassLong(ChildWindows[0], GCL_HBRBACKGROUND, (WORD)GetStockObject(WHITE_BRUSH)); +#else + OldBrush = (HBRUSH)GetClassWord(ChildWindows[0], GCL_HBRBACKGROUND); + SetClassWord(ChildWindows[0], GCL_HBRBACKGROUND, (WORD)GetStockObject(WHITE_BRUSH)); +#endif + DeleteBrush(OldBrush); + DestroyWindow(hwnd); + break; + } + case CM_HELP: { + MessageBox(hwnd, "Click on child windows to see their style", "Help", MB_OK|MB_ICONASTERISK); + break; + } + } +} + +c_WinGUI_EventMapBegin(WndProc) + c_WinGUI_EventMap(WM_DESTROY, Main_Destroy); + c_WinGUI_EventMap(WM_CREATE, Main_Create); + c_WinGUI_EventMap(WM_COMMAND, Main_Command); +c_WinGUI_EventMapEnd() + + +/* ------------------------------------------------------------------------------------------------------------------ */ +/* */ + +c_WinGUI_EventHandlerDef(WM_LBUTTONDOWN, Child_LButtonDown) { + char szNum[100]; + LONG i= GetWindowLong(hwnd, 0); + sprintf(szNum, "Number: %ld", i); + MessageBox(hwnd, szStyles[i], szNum, MB_OK|MB_ICONINFORMATION); +} + +c_WinGUI_EventHandlerDef(WM_PAINT, Child_Paint) { + PAINTSTRUCT ps; + char lpszBuffer[100]; + RECT R; + LONG i = GetWindowLong(hwnd, 0); + sprintf(lpszBuffer, "%ld", i); + + HDC PaintDC = BeginPaint(hwnd, &ps); + SetTextColor(PaintDC, RGB(0, 0, 255)); + SetBkMode(PaintDC, TRANSPARENT); + GetClientRect(hwnd, &R); + DrawText(PaintDC, lpszBuffer, -1, &R, DT_SINGLELINE|DT_CENTER|DT_VCENTER); + EndPaint(hwnd, &ps); +} + +c_WinGUI_EventMapBegin(ChildWndProc) + c_WinGUI_EventMap(WM_PAINT, Child_Paint); + c_WinGUI_EventMap(WM_LBUTTONDOWN, Child_LButtonDown); +c_WinGUI_EventMapEnd() + + +/* ------------------------------------------------------------------------------------------------------------------ */ +/* */ + + +static +BOOL Register(HINSTANCE hInstance) { + WNDCLASS WndClass; + WndClass.style = CS_HREDRAW | CS_VREDRAW; + WndClass.lpfnWndProc = WndProc; + WndClass.cbClsExtra = 0; + WndClass.cbWndExtra = 0; + WndClass.hInstance = hInstance; + WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); + WndClass.hCursor = LoadCursor(NULL, IDC_ARROW); + WndClass.hbrBackground = NULL; + WndClass.lpszMenuName = "Menu"; + WndClass.lpszClassName = WINDOW_CLASS_NAME; + BOOL Result = RegisterClass(&WndClass); + if (!Result) { + return FALSE; + } + + WndClass.lpfnWndProc = ChildWndProc; + WndClass.cbWndExtra = sizeof(LONG); + WndClass.hIcon = NULL; + WndClass.hCursor = LoadCursor(NULL, IDC_IBEAM); + WndClass.lpszMenuName = NULL; + WndClass.lpszClassName = CHILD_CLASS_NAME; + return RegisterClass(&WndClass); +} + +static +HWND Create(HINSTANCE hInstance, int nCmdShow) { + HWND hwnd = CreateWindow(WINDOW_CLASS_NAME, WINDOW_CLASS_NAME, + WS_OVERLAPPEDWINDOW, + 100, 150, + CW_USEDEFAULT, CW_USEDEFAULT, + NULL, NULL, hInstance, NULL + ); + + if (hwnd == NULL) { + return NULL; + } + + ShowWindow(hwnd, nCmdShow); + UpdateWindow(hwnd); + return hwnd; +} + +/* ------------------------------------------------------------------------------------------------------------------ */ +/* */ + +c_WinGUI_Main(){ + MSG msg; + + if (!hPrevInstance) { + if (!Register(hInstance)) { + return FALSE; + } + } + + WinApp.hInstance = hInstance; + + + HWND MainHwnd = Create(hInstance, nShowCmd); + if (!MainHwnd) { + return FALSE; + } + + WinApp.hwnd = MainHwnd; + + while (GetMessage(&msg, NULL, 0, 0)) { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + + + return (int)msg.wParam; +} +