📄 main.c
字号:
static CHECKBOX *draw3DCube;
static void CreateGDCWin(void)
{
WINDOW *pLWin;
pGdc = (GDC *)CreateGDC(120, 120);
rho = 10;
theta = 0;
phi = 0;
ox = - 0.5; oy = - 0.5; oz = - 0.5;
cx = 0; cy = 0; xr = 0; yr = 0;
pLWin = CreateWindow(500, 200, 126, 140, NULL,
"GDCWin", (PCREATE)NULL, 0);
draw3DCube = CreateCheckbox(25, 4, 75, 18, pLWin->pMainView,
"3D cube", (PCHECK)(NULL), CTRL_ALIGN_VCENTER);
pLWin->pClientView->pViewProc = GDCViewMSG;
pGDCView = pLWin->pClientView;
}
//----------------------下面通过透明窗口来生成非矩形窗口----------------------//
static CBOOL _cdecl_ UnViewMSG(VMSG *pMsg)
{
VIEW *pView = pMsg->pView ;
int dx, dy, i;
WINDOW *pLWin = OBJ_FROM_VIEW(pMsg->pView);
switch (pMsg->MsgID) {
case VMSG_PAINT:
for (i = 0; i <= (pView->viewRect.bottom-pView->viewRect.top); i++) {
DrawHLine(pView->viewRect.top+i, pView->viewRect.left, pView->viewRect.left+i, GD_GRAY);
}
DrawLine(pView->viewRect.left, pView->viewRect.top,
pView->viewRect.right, pView->viewRect.bottom, GD_LIGHTGRAY);
DrawLine(pView->viewRect.left, pView->viewRect.top+1,
pView->viewRect.right-1, pView->viewRect.bottom, GD_WHITE);
DrawHLine(pView->viewRect.bottom, pView->viewRect.left, pView->viewRect.right, GD_BLACK);
DrawHLine(pView->viewRect.bottom-1, pView->viewRect.left+1, pView->viewRect.right-1, GD_DARKGRAY);
DrawVLine(pView->viewRect.left, pView->viewRect.top, pView->viewRect.bottom-1, GD_LIGHTGRAY);
DrawVLine(pView->viewRect.left+1, pView->viewRect.top+1, pView->viewRect.bottom-2, GD_WHITE);
return (true);
case VMSG_TOUCH:
if ((pMsg->pt.y-pView->viewRect.top) >= (pMsg->pt.x-pView->viewRect.left))
return (true);
else
return (-1);
case MSM_LB_DOWN:
pLWin->Status |= WIN_MOUSE_CATCH;
pLWin->ptCatch.x = pMsg->pt.x;
pLWin->ptCatch.y = pMsg->pt.y;
return (true);
case MSM_LB_UP:
pLWin->Status &= ~(WIN_MOUSE_CATCH|WIN_SIZE|WIN_MOVE);
return (true);
case MSM_MS_MOVE:
SetMouseCursor(MOVE);
if ((pLWin->Status & WIN_MOUSE_CATCH)) {
dx = pMsg->pt.x - pLWin->ptCatch.x;
dy = pMsg->pt.y - pLWin->ptCatch.y;
pLWin->ptCatch.x = pMsg->pt.x;
pLWin->ptCatch.y = pMsg->pt.y;
MoveView(pView, dx, dy);
}
return (true);
default:
return (false);
}
}
static void CreateUnnormalWin(void)
{
EDIT *pLEdit;
WINDOW *pLWin;
pLWin = CreateWindowEx(550, 0, 150, 150, NULL,
"UnnormalWin", (PCREATE)NULL, WIN_HASTRANS);
SetWinMainViewFun(pLWin, UnViewMSG);
pLEdit = CreateEdit(5, 120, 100, 25, pLWin->pMainView,
"unnormal view is here.", (PKEYDOWN)NULL, 0, 80);
SetViewTrans(pLEdit->pView, false);
UpdateView(pLWin->pMainView);
}
//----------------------初始化回调函数,用于生成用户窗口----------------------//
void _cdecl_ initHook(void) /* 其中不得包含任何浮点数操作 */
{
int i = 0;
WINDOW *pWin = NULL;
/*******************main window 1: havs child window***********************/
pWin = CreateWindow(0, 0, 500, 475, NULL,
"main window 1: havs child window", (PCREATE)NULL, WIN_RESIZE|WIN_3D_CLIENT|WIN_MAX_BTN|WIN_MIN_BTN);
CreateBotton(50, 50, 80, 25, pWin->pClientView,
"listAdd", listAddbtn);
CreateBotton(150, 50, 80, 25, pWin->pClientView,
"listDel", listDelbtn);
CreateBotton(250, 50, 80, 25, pWin->pClientView,
"New Win", CreateWinbtn);
pListEdit = CreateEdit(10, 10, 300, 30, pWin->pClientView,
"push \"listAdd\" botton to insert edit's text to list.", (PKEYDOWN)NULL, 0, 256);
CreateLabel(350, 10, 260, 20, pWin->pClientView,
"Label of main window 1", (PCLICK)NULL, CTRL_ALIGN_VCENTER, 0);
pList = CreateListbox(330, 80, 300, 200, pWin->pClientView,
(PLISTBOXSEL)NULL, 0, 20);
for (i = 0; i < 16; i ++)
ListboxAppend(pList, "push \"listDel\" botton to delete the current item.");
pList = CreateListbox(20, 80, 300, 200, pWin->pClientView,
(PLISTBOXSEL)NULL, CTRL_LISTBOX_COMB, 20);
for (i = 0; i < 5; i ++)
ListboxAppend(pList, "push \"listDel\" botton to delete the current item.");
CreateBotton(50, 290, 80, 25, pWin->pClientView,
"treeAdd", treeAddbtn);
CreateBotton(150, 290, 80, 25, pWin->pClientView,
"treeDel", treeDelbtn);
CreateBotton(250, 290, 80, 25, pWin->pClientView,
"treeApp", treeAppbtn);
/*****************Child window: has parent window**************************/
pWin = CreateWindow(360, 150, 400, 300, pWin->pClientView,
"Child window: has parent window", (PCREATE)NULL, WIN_RESIZE|WIN_3D_CLIENT|WIN_MAX_BTN|WIN_MIN_BTN);
CreateCheckbox(50, 150, 160, 30, pWin->pClientView,
"Set Win 5 Trans", OnCheckTrans, CTRL_ALIGN_VCENTER);
CreateCheckbox(50, 180, 160, 30, pWin->pClientView,
"Set Win 5 Visible", OnCheckVisible, CTRL_ALIGN_VCENTER);
CreateCheckbox(50, 210, 160, 30, pWin->pClientView,
"Set Win 5 Stay on top", OnCheckOnTop, CTRL_ALIGN_VCENTER);
CreateLabel(560, 50, 60, 50, pWin->pClientView,
"Label of Child window", (PCLICK)NULL, CTRL_ALIGN_VCENTER, 0);
CreateEdit(10, 10, 300, 30, pWin->pClientView,
"pure edit is here.pure edit is here.pure edit is here.", (PKEYDOWN)NULL, CTRL_ALIGN_LEFT, 80);
CreateSlider(300, 60, 60, 200, pWin->pClientView,
OnSliderMoveY, CTRL_ALIGN_VCENTER, 50, 0, 480);
CreateSlider(60, 300, 260, 60, pWin->pClientView,
OnSliderMoveX, 0, 0, 0, 640);
/**************************************************************************/
pWin = CreateWindow(300, 460, 150, 80, NULL,
"trans main TRANS TOP window 2", (PCREATE)NULL, WIN_3D_CLIENT|WIN_RESIZE|WIN_STAYONTOP|WIN_HASTRANS|WIN_MAX_BTN|WIN_MIN_BTN);
CreateCheckbox(50, 150, 160, 30, pWin->pClientView,
"Set Win 5 Trans", OnCheckTrans, CTRL_ALIGN_VCENTER);
CreateCheckbox(50, 180, 160, 30, pWin->pClientView,
"Set Win 5 Visible", OnCheckVisible, CTRL_ALIGN_VCENTER);
CreateCheckbox(50, 210, 160, 30, pWin->pClientView,
"Set Win 5 Stay on top", OnCheckOnTop, CTRL_ALIGN_VCENTER);
CreateBotton(50, 50, 260, 60, pWin->pClientView,
"botton of trans main TOP window 2", (PCLICK)NULL);
CreateLabel(250, 10, 260, 60, pWin->pClientView,
"Label of trans main TRANS TOP window 2", (PCLICK)NULL, CTRL_ALIGN_HCENTER, 0);
/**************************************************************************/
pWin = CreateWindow(160, 150, 300, 100, NULL,
"main TOP window 3", (PCREATE)NULL, WIN_RESIZE|WIN_STAYONTOP);
CreateBotton(50, 50, 260, 80, pWin->pClientView,
"botton of main TOP window 3", (PCLICK)NULL);
CreateLabel(50, 150, 260, 80, pWin->pClientView,
"Label of window 3, abcdefghijklmnopqrstuvwxyz", (PCLICK)NULL, CTRL_ALIGN_HCENTER, CTRL_HTML_LABEL);
/**************************************************************************/
pWin = CreateWindow(160, 260, 300, 100, NULL,
"main window 4", (PCREATE)NULL, WIN_RESIZE|WIN_MIN_BTN);
CreateBotton(50, 50, 260, 90, pWin->pClientView,
"botton of main window 4", (PCLICK)NULL);
CreateLabel(50, 150, 260, 90, pWin->pClientView,
"Label of window 4, ABCDEFGHIJKLMNOPQRSTUVWXYZ", (PCLICK)NULL, CTRL_ALIGN_VCENTER, CTRL_HTML_LABEL);
/**************************************************************************/
pGWin = CreateWindow(160, 370, 300, 100, NULL,
"trans main TRANS window 5", (PCREATE)NULL, WIN_RESIZE|WIN_HASTRANS|WIN_MAX_BTN|WIN_MIN_BTN);
CreateBotton(50, 26, 260, 60, pWin->pClientView,
"botton of main TRANS window 5", (PCLICK)NULL);
}
//-------------连续执行的浮点数处理任务,用于干扰其它浮点数任务---------------//
static void _cdecl_ rtFloat(void)
{
double db;
InitFPStatus(); /* 初始化浮点数协处理器状态,必须在进行任何浮点数操作之前进行 */
db = 0.00001;
for (;;) {
if (db > 1) db = 0.000001;
db /= 3.1415926;
db /= 2;
db *= 0.6;
db += 0.000001;
}
}
/*第一个用户任务,用之初始化所有其它用户任务,因此此处称之为 Shell 任务 */
static void _cdecl_ rtShell(void)
{
double db;
SetInitHook(initHook); /* 其中不得包含任何浮点数操作 */
SetKeybdHook(keybdHook);/* 其中不得包含任何浮点数操作 */
InitClipBoard(1024*4);
StartEngine(); /* 启动GUI引擎,注意在此之前不得调用任何浮点数操作 */
InitFPStatus(); /* 初始化浮点数协处理器状态,必须在进行任何浮点数操作之前进行 */
GUILock();{
CreateUnnormalWin();
CreateGDCWin();
} GUIUnLock();
db = 0.00001;
Sleep(5000);
db = mmGetFreeMemorySize();
putf(db);
///*创建 10 个连续执行的浮点数任务,用以检验浮点协处理器状态是否得到保护
CreateTaskEx((PTASKFUN)rtFloat, 29, NULL, 1024, RR_SCH_TASK);
CreateTaskEx((PTASKFUN)rtFloat, 29, NULL, 1024, RR_SCH_TASK);
CreateTaskEx((PTASKFUN)rtFloat, 29, NULL, 1024, RR_SCH_TASK);
CreateTaskEx((PTASKFUN)rtFloat, 29, NULL, 1024, RR_SCH_TASK);
CreateTaskEx((PTASKFUN)rtFloat, 29, NULL, 1024, RR_SCH_TASK);
CreateTaskEx((PTASKFUN)rtFloat, 29, NULL, 1024, RR_SCH_TASK);
CreateTaskEx((PTASKFUN)rtFloat, 29, NULL, 1024, RR_SCH_TASK);
CreateTaskEx((PTASKFUN)rtFloat, 29, NULL, 1024, RR_SCH_TASK);
CreateTaskEx((PTASKFUN)rtFloat, 29, NULL, 1024, RR_SCH_TASK);
CreateTaskEx((PTASKFUN)rtFloat, 29, NULL, 1024, RR_SCH_TASK);
//*/
//while (CreateTaskEx((PTASKFUN)rtFloat, 29, NULL, 640, RR_SCH_TASK) != 0);
db = mmGetFreeMemorySize();
putf(db);
for (;;) {
if (db > 0.01) db = 0.000001;
db /= 0.3;
db /= 2;
db *= 0.6;
db += 0.000001;
if (pGDCView != NULL) {
GUILock();{
if (draw3DCube->Status & CTRL_CHECKBOX_CHECKED)
draw3D(&(pGDCView->viewRect)); /* 重绘时钟窗口 */
else
drawClock(&(pGDCView->viewRect)); /* 重绘时钟窗口 */
UpdateView(pGDCView);
} GUIUnLock();
}
Sleep(200);
}
}
/* 堆内存初始化,必须在进入内核之前完成 */
static BYTE freeMem0[32767];
static BYTE freeMem1[32767];
static BYTE freeMem2[32767];
static BYTE freeMem3[32767];
static BYTE freeMem4[32767];
static BYTE freeMem5[32767];
static void mmInitMem(void)
{
mmMemoryInit(freeMem0, 32767);
mmAddToMemPool(freeMem1, 32767);
mmAddToMemPool(freeMem2, 32767);
mmAddToMemPool(freeMem3, 32767);
mmAddToMemPool(freeMem4, 32767);
mmAddToMemPool(freeMem5, 32767);
}
void _cdecl_ main(void)
{
CREATE_TASK task;
task.pTaskFun = (PTASKFUN)rtShell; /* Shell 任务 */
task.cwPrio = 7;
task.pData = NULL;
task.poStkSize = 4*1024;
GUIInitEngine(); /* GUI 引擎初始化,必须在进入内核之前完成 */
_asm cli;
out_byte(0x20, 0x11);/* ICW1 for master */
out_byte(0x21, 8); /* ICW2 for master */
out_byte(0x21, (1 << 2));/* ICW3 tells slaves */
out_byte(0x21, 1);
out_byte(0x21, ~(1 << 2));/* IRQ 0-7 mask */
out_byte(0xA0, 0x11); /* ICW1 for slave */
out_byte(0xA1, 0x10); /* ICW2 for slave */
out_byte(0xA1, 2);/* ICW3 is slave nr */
out_byte(0xA1, 1);
out_byte(0xA1, ~0);/* IRQ 8-15 mask */
SetTimer(1000); /* 内核定时器周期为 1 毫秒 */
/* 堆内存,此处设置不当可能造成程序崩溃 */
mmInitMem();
mcStartSys(&task, mmAlloc_mem, mmFree_mem); /* 启动内核 */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -