#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; }