窗口样式
This commit is contained in:
@@ -0,0 +1,333 @@
|
||||
#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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user