⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 win32.c

📁 Seekfor WinOS的GUI图形界面程序
💻 C
字号:

#ifndef __WIN32_C__
#define __WIN32_C__
#include "gui.h"


#if MENU_EN==1
/*MENU DATA 举例*/
DT_CODE DT_CHAR menu[]={
BEGIN
	POPUP 'F','i','l','e',0,MF_ENABLED,
		BEGIN
			POPUP 'O','l','d',0,MF_ENABLED,
				BEGIN
					MENUITEM 'F','i','l','e','1',0,101,MF_ENABLED,
					MENUITEM 'F','i','l','e','2',0,102,MF_ENABLED,
				END

			MENUITEM 'N','e','w',100,MF_ENABLED,
		END
	POPUP 'E','d','i','t',0,MF_ENABLED,
		BEGIN
			MENUITEM 'C','u','t',0,201,MF_ENABLED,
			MENUITEM 'C','o','p','y',0,202,MF_GRAYED,
		END
END
};

	typedef struct
	{
		DT_CHAR nType;/*类型,POPUP or MENUITEM*/
		DT_CHAR *szCaption;/*标题文字*/
		DT_CHAR nCmd;/*命令ID,菜单被点击的话做为WM_COMMAND的wParam参数*/
		DT_CHAR nStatus;/*状态,MF_GRAYED,MF_ENABLED*/
		DT_CHAR nTotal;/*总的子菜单数目*/
		DT_CHAR nIndex;/*当前高亮的索引*/
		COLORREF *lpImage;/*保存的图象*/
		HANDLE child[MAX_MENUS];/*子菜单*/
	}_HMENU_,*_HMENU;

	_HMENU hPopup;/*弹出菜单*/

_HMENU LoadMenu(DT_INT hInst,void *lpItem)
{
	hInst=hInst;
	lpItem=lpItem;
	return NULL;
}


#endif

/*定义窗口类型,和def.h的定义不同的目的是为了防止用户程序使用内部数据*/
typedef DT_XDATA struct _HWND
{
	DT_CHAR style;/*窗口类型,WS_XX|WS_XX*/
	DT_CHAR exstyle;/*窗口扩展类型,BS_XX*/
	DT_CHAR status;/*窗口状态,BS_CHECKED,BS_UNCHECKED or other*/
	DT_INT nCmdID;/*窗口的命令ID*/
	RECT rtRect;/*窗口的区域*/
	RECT rtClient;/*窗口的客户区域*/
	DT_CHAR szCaption[MAX_CAPTION+1];/*窗口标题文本*/

	DT_CHAR index;/*内部使用的索引*/
	DT_CHAR group;/*窗口所在的组(RADIOBOX应用)*/
	HANDLE hIcon;/*窗口的图标*/
	WNDPROC lpfnWndProc;/*窗口的回调喊函数*/
	HANDLE child[MAX_WINDOWS+3];/*该窗口下属的子窗口*/
	HANDLE parent;/*该窗口的父窗口*/
	HANDLE hFocus;/*该窗口下的焦点窗口*/
	DT_INT lpdata;/*私有数据*/
#if MENU_EN==1
	_HMENU hMenu;/*窗口主菜单*/
#endif

}_HWND_,*_HWND;



static DT_XDATA struct
{
	MSG msg[MAX_MESSAGES];/*系统消息队列表*/
#if MAX_MESSAGES>255
	DT_INT rd;		/*系统读指针*/
	DT_INT wr;		/*系统写指针*/
#else
	DT_CHAR rd;
	DT_CHAR wr;
#endif
	DT_CHAR bValid;		/*标志消息是否有效*/
}sysmsg;

static DT_XDATA struct
{
	WNDCLASS wc[MAX_CLASSES];/*窗口类列表*/
#if MAX_CLASSES<256
	DT_CHAR nTotal;/*当前窗口类总数*/
#else
	DT_INT nTotal;/*当前窗口类总数*/
#endif
}sysatom;

/*外部提供优化的清除区域函数指针*/
static lpfnCLRSCR fillrect=(lpfnCLRSCR)FillRect;

/*位于前台的窗口指针*/
static _HWND hActive=NULL;
/*系统桌面窗口*/
static _HWND hDesktop=NULL;
/*树窗口*/
static _HWND *hStart=NULL;
static _HWND *hEnd=NULL;
/*Z-order窗口*/
static _HWND link[MAX_WINDOWS+3];

/*系统刷新位置,暂时未用*/
static RECT *rtInvalid=NULL;
/*系统色彩设置*/
static SYSCOLOR sc={
			DESKTOP_COLOR,
			BTNFACE_COLOR,
			BTNTEXT_COLOR,
			D3DARK_COLOR,
			D3LIGHT_COLOR,
			D3SHADOW_COLOR,
			ACTIVECAPTION_COLOR,
			ACTIVECAPTIONTEXT_COLOR,
			INACTIVECAPTION_COLOR,
			INACTIVECAPTIONTEXT_COLOR,
			GRAYTEXT_COLOR,
			GRAYCOLOR_COLOR,
			WINDOW_COLOR,
			FOCUSCOLOR_COLOR
		};

/*系统消息返回,如果用户程序调用了DefWindowProc则msg_result=1,否则msg_result=0*/
static DT_CHAR msg_result;
/*GUI状态,包含消息对列是否有消息,GUI是否结束绘制等*/
static DT_CHAR gui_status=GUI_ENDDRAW|GUI_NOMESSAGE;


/*一些内部函数原型*/
static DWORD STDBUTTON_Proc(_HWND hWnd,DT_CHAR Msg,WPARAM wParam,LPARAM lParam);
static _HWND FindCheckedRadioBox(_HWND hWnd,DT_CHAR group);
static _HWND FindNextChild(_HWND hWnd);
static _HWND FindPrevChild(_HWND hWnd);
static DT_CHAR TRACKBAR_Key(_HWND,DT_CHAR);
static DT_CHAR EDITBOX_Key(_HWND,DT_CHAR);

/*检测消息是否是系统消息*/
static DT_CHAR IsSystemMessage(DT_CHAR msg)
{
	DT_CHAR i=0;
	switch(msg)
	{
		default:
			break;
		case WM_PAINT:
		case WM_KEYDOWN:
		case WM_KEYUP:
		case WM_MOUSEMOVE:
		case WM_LBUTTONDOWN:
		case WM_RBUTTONDOWN:
		case WM_LBUTTONUP:
		case WM_RBUTTONUP:
		case WM_DESTROY:
			i=1;
	}
	return i;
}


static DWORD DirectMessageProcess(MSG msg)
{
	int i=0;
	_HWND item;
	msg_result=0;
	item=msg.hWnd;
	/*调用本窗口的过程*/
	if(!item->exstyle&&msg.msg==WM_PAINT&&item->index);/*如果WM_PAINT消息不是第一次,则不再调用用户程序*/
	else	i=item->lpfnWndProc(msg.hWnd,msg.msg,msg.wParam,msg.lParam);
	if(i==-1) return -1;/*DefWindow()调用了ExitWindows()*/
	/*如果回调过程返回1且不是系统消息或者该过程调用了DefWindowProc()直接返回i*/
	else if((i&&!IsSystemMessage(msg.msg))||msg_result) return i;
	/*回调函数返回0或者是系统消息,则必须调用DefWindowProc()*/
	 i= DefWindowProc(msg.hWnd,msg.msg,msg.wParam,msg.lParam);
	return i;
}


/*获取ATOM指针*/
static WNDCLASS* GetATOM(LPCTSTR lpszClassName)
{
#if MAX_CLASSES<256
	DT_CHAR i;
#else
	DT_INT i;
#endif
	for(i=0;i<sysatom.nTotal;i++)
		if(!strcmp(lpszClassName,sysatom.wc[i].lpszClassName)) return &sysatom.wc[i];
	return NULL;
}

static DT_CHAR IsSystemButton(_HWND hWnd)
{
	if(!hWnd) return 0;
	if(!strcmp(hWnd->szCaption,"SYS_CLOSE")||!strcmp(hWnd->szCaption,"SYS_MAXIMIZE")||!strcmp(hWnd->szCaption,"SYS_MINIMIZE")) return 1;
	return 0;
}

static DT_INT GetChildWindowID(_HWND parent,_HWND child)
{
	DT_CHAR i;
	for(i=0;i<MAX_WINDOWS+3;i++)
	{
		if(!parent->child[i]) return 0;
		if(parent->child[i]==child) break;
	}
	return i;
}

static _HWND FindPrevChild(_HWND hWnd)
{
	_HWND parent=hWnd->parent;
	_HWND ret;
	DT_CHAR i=GetChildWindowID(parent,hWnd);
	if(!hWnd) return NULL;
	while(i)
	{
		i--;
		ret=parent->child[i];
		if(!ret) break;
		if(ret->exstyle==BS_STATIC||ret->exstyle==BS_PROGRESSBAR||ret->exstyle==BS_GROUPBOX) continue;
		if(IsWindowEnabled(ret)&&IsWindowVisible(ret)&&!IsSystemButton(ret)) return parent->child[i];
	}
	return hWnd;
}

static _HWND FindNextChild(_HWND hWnd)
{
	_HWND parent=hWnd->parent;
	_HWND ret;
	DT_CHAR i=GetChildWindowID(parent,hWnd);
	if(!hWnd) return NULL;
	while(++i<MAX_WINDOWS+3)
	{
		ret=parent->child[i];
		if(!ret) break;
		if(ret->exstyle==BS_STATIC||ret->exstyle==BS_PROGRESSBAR||ret->exstyle==BS_GROUPBOX) continue;
		if(IsWindowEnabled(ret)&&IsWindowVisible(ret)&&!IsSystemButton(ret)) return parent->child[i];
	}
	return hWnd;
}

/********************_HWND FindNextWindow(_HWND)*****************************
功能

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -