Files
WinGUI/GUITest/WinStyle.t.c
T

335 lines
9.4 KiB
C
Raw Normal View History

2026-07-29 13:11:28 +08:00
#include <stdio.h>
#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++) {
2026-07-31 19:26:40 +08:00
MoveWindow(ChildWindows[i], 10 + (j * 100), 10, 100, 100, TRUE);
2026-07-29 13:11:28 +08:00
if (i==4) {
j=0;
}else {
j++;
}
}
2026-07-31 19:26:40 +08:00
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);
2026-07-29 13:11:28 +08:00
}
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;
}