📄 win32.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 + -