334 lines
9.4 KiB
C
334 lines
9.4 KiB
C
#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++) {
|
||
|
|
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;
|
||
|
|
}
|
||
|
|
|