![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-09-14 23:33 |
共 47,812 主题排行 / 349,917 发帖 / 今日 0 篇 / 48,268 会员排行 |
| DOS开发编程 & 发展交流 (开发室) » DOS的界面开发终结者 |
| 可打印版本 98,398 / 290 |
| 第91楼 ArmKing | 发表于 2006-08-28 02:03 |
| 初级用户 发帖 22 积分 66 | |
|
如何支持 LCD Touch Panel? 请问配备相关硬件情况下,软件如何支持 LCD Touch Panel?
|
|
| 第92楼 ArmKing | 发表于 2006-08-28 02:06 |
| 初级用户 发帖 22 积分 66 | |
|
WinSail 内的某些控件做的有些小问题, 请问如何修改啊? 内核源码, 控件源码会公开吗?
|
|
| 第93楼 firstsail | 发表于 2006-08-28 11:26 |
| 高级用户 发帖 295 积分 668 来自 广东深圳 | |
|
关于鼠标触摸屏:
(1)在InitSystem()这前,向WinSail内核注册用户自己编写的鼠标功能调用函数 ::AfxRegisterMouseFc(::MyMouse_Touch); 其中MyMouse_Touch的原型为: void far MyMouse_Touch(unsigned int ax, unsigned int bx, unsigned int cx, unsigned int dx); void far MyMouse_Touch(unsigned int ax, unsigned int bx, unsigned int cx, unsigned int dx) { //Register AX = 0 --> Reset Mouse //Register AX = 1 --> Open Mouse //Register AX = 2 --> Close Mouse //Register AX = 3 --> IsMouseDown //Register AX = 4 --> SetMouseLocation REGS regs; _fmemset(®s, 0, sizeof(REGS)); /* 在这时编写您自己的代码,参考鼠标功能调用INT33,根据入口和出口格式化regs寄存器 Register AX = 0 --> Reset Mouse ->复位鼠标 Register AX = 1 --> Open Mouse ->显示鼠标 Register AX = 2 --> Close Mouse ->不显示鼠标 Register AX = 3 --> IsMouseDown ->取按键信息 Register AX = 4 --> SetMouseLocation ->设置鼠标位置 */ //..... //..... //.... //这里根据regs返回值,格式化鼠标消息结构MOUSEMSG SystemMouse switch(ax) { case 0: //Reset Mouse { if (regs.x.ax == (unsigned) - 1) { SystemMouse.exist = 1; } else { SystemMouse.exist = 0; } SystemMouse.visible = FALSE; break; } case 1: //Open Mouse case 2: //Close Mouse { break; } case 3: //IsMouseDown { SystemMouse.statue = regs.x.bx; SystemMouse.point.x = regs.x.cx; SystemMouse.point.y = regs.x.dx; break; } case 4: //SetMouseLocation { SystemMouse.statue = 0; SystemMouse.times = 0; SystemMouse.point.x = cx; SystemMouse.point.y = dx; break; } default: { break; } } return; } |
|
| 第94楼 profree | 发表于 2006-09-18 23:39 |
| 中级用户 发帖 132 积分 478 | |
|
winsail里如何获得复选框和单选框的状态?
我用GetRadio()不能获取 |
|
| 第95楼 firstsail | 发表于 2006-09-19 03:55 |
| 高级用户 发帖 295 积分 668 来自 广东深圳 | |
|
用CRadio::SetBox()函数来设置复选框还是单选框。
用CRadio::SetRadio()函数来设置复选框/单选框的状态。 用CRadio::GetRadio()函数来获得复选框/单选框的状态。 用CRadio::GetStatic()函数来设置单选框的组属性。 对于单选框来说:有一个“组”的问题,如同Windows中的VC按钮控件的WS_GROUP属性。在一组中,只有组中的第一个CRadio才能有WS_GROUP属性。 假设有3个单选按钮,其构成3选一的一组逻辑操作,分别是 CRadio* pRadio1 --- 单选按钮1,内容为“男性” CRadio* pRadio2 --- 单选按钮2,内容为“女性” CRadio* pRadio3 --- 单选按钮3,内容为“保密” ......... CRadio* pRadio1 = new CRadio(pDialog); //分配实例 CRadio* pRadio2 = new CRadio(pDialog); //分配实例 CRadio* pRadio3 = new CRadio(pDialog); //分配实例 pRadio1->CreateObject(10,30 + 18 * 0, 100, 16, "男性"); pRadio2->CreateObject(10,30 + 18 * 1, 100, 16, "女性"); pRadio3->CreateObject(10,30 + 18 * 2, 100, 16, "保密"); pRadio1->SetBoX(FALSE); //是单选按钮,不是复选按钮 pRadio2->SetBoX(FALSE); //是单选按钮,不是复选按钮 pRadio3->SetBoX(FALSE); //是单选按钮,不是复选按钮 pRadio1->SetStatic(TRUE); //Radio1控件是Radio1~3单选按钮一组的第一个。 ................ 为了获得该组中是哪一个被选中,只能遍历该组中的每一个成员。 if (pRadio1->GetRadio()) { } else if (pRadio2->GetRadio()) { } else if (pRadio3->GetRadio()) { } ........ 所以profree提出的问题,可能是指“单选按钮”吧! |
|
| 第96楼 profree | 发表于 2006-09-19 22:54 |
| 中级用户 发帖 132 积分 478 | |
|
谢谢回复
如果是复选框又怎么获得哪些项被选中了呢? 我很是搞不明白,如果我的一个窗口中有多个单选框/复选框,是分为一个以上组的,怎么分清是属于哪个组,又要怎么设置才能分开呢? 比如: 性别 分为 男,女, 年龄分为:15-20,21-30,31-40, 学历:大专,本科,硕士,博士 以上三个组都是同一窗口中,怎么分开设置,我认为应该有一个“归属于哪个组”的概念就好办多了 另外,如果一个对话框要设计成上一步,下一步,具体该怎么做?难道是上一步,下一步都要分别调用另一个函数来“画”对话框吗?这样如果对话框“画”多了,程序会就自动退出(应该是内存不够吧) |
|
| 第97楼 firstsail | 发表于 2006-09-20 05:04 |
| 高级用户 发帖 295 积分 668 来自 广东深圳 | |
|
VC++生成对话框,MakeDlg转换成WinSail的源代码,阅读之,可以较好的了解。
关于单选按钮(适用于WinSail及微软的Windows) (1)一个对话框中,可以有多“组”单选按钮 (2)一组单选按钮中,所有的单选按钮必须是连续分配的。 (3)一组单选按钮中的第一个单选按钮的属性是带有WS_GROUP窗口风格的 如果是VC,在单选按钮的属性框中选中Static属性。 如果是Winsail,调用CRadio::SetStatic(TRUE); (4)假设有3组单选按钮 第一组是性别 分为 男,女, 第二组是年龄:15-20,21-30,31-40, 第三组是学历:大专,本科,硕士,博士 //第一组 CRadio* pRadio1 = new CRadio(pDialog); //分配实例 CRadio* pRadio2 = new CRadio(pDialog); //分配实例 pRadio1->CreateObject(10,30 + 18 * 0, 100, 16, "男"); pRadio2->CreateObject(10,30 + 18 * 1, 100, 16, "女"); pRadio1->SetBox(FALSE); //是单选按钮,不是复选按钮 pRadio2->SetBox(FALSE); //是单选按钮,不是复选按钮 pRadio1->SetStatic(TRUE); //Radio1控件是Radio1-2的组带头人 //第二组 CRadio* pRadio3 = new CRadio(pDialog); //分配实例 CRadio* pRadio4 = new CRadio(pDialog); //分配实例 CRadio* pRadio5 = new CRadio(pDialog); //分配实例 pRadio3->CreateObject(10,50 + 18 * 0, 100, 16, "15-20"); pRadio4->CreateObject(10,50 + 18 * 1, 100, 16, "21-30"); pRadio5->CreateObject(10,50 + 18 * 2, 100, 16, "31-40"); pRadio3->SetStatic(TRUE); //Radio3控件是Radio3-5的组带头人 //第三组 CRadio* pRadio6 = new CRadio(pDialog); //分配实例 CRadio* pRadio7 = new CRadio(pDialog); //分配实例 CRadio* pRadio8 = new CRadio(pDialog); //分配实例 CRadio* pRadio9 = new CRadio(pDialog); //分配实例 pRadio6->CreateObject(10,70 + 18 * 0, 100, 16, "大专"); pRadio7->CreateObject(10,70 + 18 * 1, 100, 16, "本科"); pRadio8->CreateObject(10,70 + 18 * 2, 100, 16, "硕士"); pRadio9->CreateObject(10,70 + 18 * 3, 100, 16, "博士"); pRadio6->SetStatic(TRUE); //Radio6控件是Radio6-9的组带头人 ------------------------------------------------------------ WinSail V2.0的GUI有一些已经更新,可重新下载了! |
|
| 第98楼 firstsail | 发表于 2006-09-20 05:19 |
| 高级用户 发帖 295 积分 668 来自 广东深圳 | |
|
(1)WinSail V2.0的全局控件句柄只有120个。
#define MAX_OBJECT_LIST_COUNT 120 (2)WinSail V2.0运行于实模式,受DOS的640K内存限制。 (3) 每一个窗口/对话框中的控件不限,受内存和全局控件句柄个数限制。 |
|
| 第99楼 profree | 发表于 2006-09-21 00:20 |
| 中级用户 发帖 132 积分 478 | |
|
我的窗口需要使用下一步,上一步来完成,我想按下一步或上一步时,删除本窗口,重新生成新的窗口,我定义一个全局变量,在执行下一步时,先删除上一窗口,再生成新的窗口,但不成功,不知是为什么
|
|
| 第100楼 firstsail | 发表于 2006-09-21 21:28 |
| 高级用户 发帖 295 积分 668 来自 广东深圳 | |
|
不能在本窗口的“控件”函数里面删除其父窗口。
只能发出窗口退出消息,可通过 void CloseWindow(CObject* pObj); -------- 窗口返回值为“IDCLOSE” void ClickCloseButton(CObject* pObj); --- 窗口返回值为“IDCLOSE” void ClickEnterButton(CObject* pObj); --- 窗口返回值为“IDOK” void ClickCancelButton(CObject* pObj); -- 窗口返回值为“IDCANCEL” void ClickYesButton(CObject* pObj); ----- 窗口返回值为“IDYES” void ClickNoButton(CObject* pObj); ------ 窗口返回值为“IDNO” void ClickRetryButton(CObject* pObj); --- 窗口返回值为“IDRETRY” 窗口消息循环函数为: int CWindow::PurseMessage(); 对话框消息循环函数为:int CDialog::DoModal(); int CDialog::DoModal()的函数源代码为 int CDialog::DoModal() { return(CWindow::PurseMessage()); } void ClickEnterButton(CObject* pObj)的函数源代码为 void ClickEnterButton(CObject* pObj) { ::CloseWindow(pObj); extern int nAfxMessageFlags; nAfxMessageFlags = IDOK; } void ClickCancelButton(CObject* pObj)的函数源代码为 void ClickCancelButton(CObject* pObj) { ::CloseWindow(pObj); extern int nAfxMessageFlags; nAfxMessageFlags = IDCANCEL; } |
|
| 第101楼 firstsail | 发表于 2006-09-21 21:34 |
| 高级用户 发帖 295 积分 668 来自 广东深圳 | |
|
int CWindow::PurseMessage()的函数源代码为
int CWindow::PurseMessage() { int nOldMessageFlags = nAfxMessageFlags; // 保护原值 nAfxMessageFlags = IDNULL; //刷新窗口退出标志 //...... //窗口消息循环 while (nAfxMessageFlags == IDNULL) { //.... } //... int nResult = nAfxMessageFlags; nAfxMessageFlags = nOldMessageFlags; //恢复原值 return (nResult); } |
|
| 第102楼 firstsail | 发表于 2006-09-21 23:53 |
| 高级用户 发帖 295 积分 668 来自 广东深圳 | |
|
发给一个实用的“向导”类 /*
向导属性封装,由于WinSail受640K内存限制,可以这样来设计 (1)向“向导页”注册的页是函数,函数原型为 int far page(CObject* pObj); 对返回值要求 IDNO ------ 表示单击了“上一步”按钮 IDYES ----- 表示单击了“下一步”按钮 IDCANCEL -- 表示单击了“退出”按钮 (2)最多支持MAX_WIZARD_COUNT ( =10)个页 */ #include <Symbol.h> #include <Myframe.h> #define MAX_WIZARD_COUNT 10 class CWizard { private: int m_nOrder; int m_nCount; int far (*m_psFc[MAX_WIZARD_COUNT])(CObject *); public: BOOL AddDialog(int far (*pFc)(CObject*)); public: int DoWizard(); public: CWizard(); ~CWizard(); }; CWizard::CWizard() { m_nOrder = 0; m_nCount = 0; for (int i = 0; i < MAX_WIZARD_COUNT; i++) { m_psFc[i] = NULL; } } CWizard::~CWizard() { } BOOL CWizard::AddDialog(int far (*pFc)(CObject *)) { if (pFc == NULL || m_nCount >= MAX_WIZARD_COUNT) { return (FALSE); } m_psFc[m_nCount++] = pFc; return (TRUE); } int CWizard::DoWizard() { //1 - IDNO -- Prev //2 - IDYES -- Next //3 - Cancel -- Cancel int far (*pFc)(CObject *) = NULL; int nResult = IDCLOSE; while (1) { pFc = m_psFc[m_nOrder]; if (pFc == NULL) { break; } nResult = pFc(NULL); if (nResult == IDNO) { if (m_nOrder > 0) { m_nOrder--; } continue; } else if (nResult == IDYES) { if (m_nOrder + 1 < m_nCount) { m_nOrder++; } continue; } break; } return (nResult); } |
|
| 第103楼 firstsail | 发表于 2006-09-21 23:58 |
| 高级用户 发帖 295 积分 668 来自 广东深圳 | |
|
将CWizard::AddDialog()函数改名为CWizard::AddPage()函数
现举例如下: #include <Symbol.h> #include <MyFrame.h> int far Page1(CObject* pCurObj) { //Create a Dialog On the Center of Desktop CDialog* pDialog = new CDialog;//分配实例 pDialog->CreateWindow(0, 0, 321, 240, "第一页:1");//建立窗口 pDialog->Center();//窗口对中 //Create Close's Button Control CCloseButton* pCloseButton = new CCloseButton(pDialog);//分配和建立关闭按钮 //Create a Button Control CButton* pButton1 = new CButton(pDialog); pButton1->CreateObject(10, 199, 93, 24, "上一步(\x3P\x3)"); pButton1->SetShortcutKey(VK_ALT_P); pButton1->SetFc(ClickNoButton); //Create a Button Control CButton* pButton2 = new CButton(pDialog); pButton2->CreateObject(111, 199, 93, 24, "下一步(\x3N\x3)"); pButton2->SetShortcutKey(VK_ALT_N); pButton2->SetFc(ClickYesButton); //Create a Button Control CButton* pButton3 = new CButton(pDialog); pButton3->CreateObject(211, 199, 93, 24, "退出(\x3\C\x3)"); pButton3->SetShortcutKey(VK_ALT_C); pButton3->SetFc(ClickCancelButton); //Create Radio Control CRadio* pRadio1 = new CRadio(pDialog); pRadio1->CreateObject(28, 59, 57, 24, "男姓"); pRadio1->SetStatic(TRUE); pRadio1->SetRadio(TRUE); pRadio1->SetID(RADIOBASE + 1 - 1); //Create Radio Control CRadio* pRadio2 = new CRadio(pDialog); pRadio2->CreateObject(100, 61, 57, 24, "女性"); pRadio2->SetID(RADIOBASE + 2 - 1); //Create Radio Control CRadio* pRadio3 = new CRadio(pDialog); pRadio3->CreateObject(171, 61, 57, 24, "保密"); pRadio3->SetID(RADIOBASE + 3 - 1); //Create Radio Control CRadio* pRadio4 = new CRadio(pDialog); pRadio4->CreateObject(28, 148, 57, 24, "大专"); pRadio4->SetStatic(TRUE); pRadio4->SetRadio(TRUE); pRadio4->SetID(RADIOBASE + 4 - 1); //Create Radio Control CRadio* pRadio5 = new CRadio(pDialog); pRadio5->CreateObject(100, 148, 57, 24, "本科"); pRadio5->SetID(RADIOBASE + 5 - 1); //Create Radio Control CRadio* pRadio6 = new CRadio(pDialog); pRadio6->CreateObject(169, 148, 57, 24, "硕士"); pRadio6->SetID(RADIOBASE + 6 - 1); //Create Radio Control CRadio* pRadio7 = new CRadio(pDialog); pRadio7->CreateObject(229, 147, 57, 24, "博士"); pRadio7->SetID(RADIOBASE + 7 - 1); //Create Group Control CStatic* pGroup1 = new CStatic(pDialog); pGroup1->CreateObject(10, 29, 285, 67, "性别"); //Create Group Control CStatic* pGroup2 = new CStatic(pDialog); pGroup2->CreateObject(10, 118, 285, 66, "学位"); //Show Window pDialog->ShowWindow();//显示窗口 //go into Message Loop int nResult = pDialog->DoModal();//进入窗口消息循环 //Destroy Window delete pDialog;//删除对话框 return (nResult); } int far Page2(CObject* pCurObj) { //Create a Dialog On the Center of Desktop CDialog* pDialog = new CDialog;//分配实例 pDialog->CreateWindow(0, 0, 321, 240, "第二页:2");//建立窗口 pDialog->Center();//窗口对中 //Create Close's Button Control CCloseButton* pCloseButton = new CCloseButton(pDialog);//分配和建立关闭按钮 //Create a Button Control CButton* pButton1 = new CButton(pDialog); pButton1->CreateObject(10, 199, 93, 24, "上一步(\x3P\x3)"); pButton1->SetShortcutKey(VK_ALT_P); pButton1->SetFc(ClickNoButton); //Create a Button Control CButton* pButton2 = new CButton(pDialog); pButton2->CreateObject(111, 199, 93, 24, "下一步(\x3N\x3)"); pButton2->SetShortcutKey(VK_ALT_N); pButton2->SetFc(ClickYesButton); //Create a Button Control CButton* pButton3 = new CButton(pDialog); pButton3->CreateObject(211, 199, 93, 24, "退出(\x3\C\x3)"); pButton3->SetShortcutKey(VK_ALT_C); pButton3->SetFc(ClickCancelButton); //Create Radio Control CRadio* pRadio1 = new CRadio(pDialog); pRadio1->CreateObject(28, 64, 57, 24, "北京"); pRadio1->SetStatic(TRUE); pRadio1->SetRadio(TRUE); pRadio1->SetID(RADIOBASE + 1 - 1); //Create Radio Control CRadio* pRadio2 = new CRadio(pDialog); pRadio2->CreateObject(100, 65, 57, 24, "上海"); pRadio2->SetID(RADIOBASE + 2 - 1); //Create Radio Control CRadio* pRadio3 = new CRadio(pDialog); pRadio3->CreateObject(171, 65, 57, 24, "广州"); pRadio3->SetID(RADIOBASE + 3 - 1); //Create Combo Control CComboBox* pComboBox1 = new CComboBox(pDialog); pComboBox1->CreateCombo(124, 122, 169, 24, NULL); pComboBox1->SetID(COMBOBASE + 1 - 1); //Create Group Control CStatic* pGroup1 = new CStatic(pDialog); pGroup1->CreateObject(10, 34, 285, 67, "籍贯"); //Create a Label Control CLabel* pLabel1 = new CLabel(pDialog); pLabel1->CreateObject(13, 125, 67, 12, "选择年份(N)"); //Show Window pDialog->ShowWindow();//显示窗口 //go into Message Loop int nResult = pDialog->DoModal();//进入窗口消息循环 //Destroy Window delete pDialog;//删除对话框 return (nResult); } int far Page3(CObject* pCurObj) { //Create a Dialog On the Center of Desktop CDialog* pDialog = new CDialog;//分配实例 pDialog->CreateWindow(0, 0, 321, 240, "第三页:3");//建立窗口 pDialog->Center();//窗口对中 //Create Close's Button Control CCloseButton* pCloseButton = new CCloseButton(pDialog);//分配和建立关闭按钮 //Create a Button Control CButton* pButton1 = new CButton(pDialog); pButton1->CreateObject(10, 199, 93, 24, "上一步(\x3P\x3)"); pButton1->SetShortcutKey(VK_ALT_P); pButton1->SetFc(ClickNoButton); //Create a Button Control CButton* pButton2 = new CButton(pDialog); pButton2->CreateObject(111, 199, 93, 24, "下一步(\x3N\x3)"); pButton2->SetShortcutKey(VK_ALT_N); pButton2->SetFc(ClickYesButton); //Create a Button Control CButton* pButton3 = new CButton(pDialog); pButton3->CreateObject(211, 199, 93, 24, "退出(\x3\C\x3)"); pButton3->SetShortcutKey(VK_ALT_C); pButton3->SetFc(ClickCancelButton); //Create Slider Control CSliderCtrl* pSliderCtrl1 = new CSliderCtrl(pDialog); pSliderCtrl1->CreateObject(37, 153, 241, 24, NULL); pSliderCtrl1->SetID(SLIDERBASE + 1 - 1); pSliderCtrl1->SetHorz(TRUE); //Create Slider Control CSliderCtrl* pSliderCtrl2 = new CSliderCtrl(pDialog); pSliderCtrl2->CreateObject(138, 38, 30, 111, NULL); pSliderCtrl2->SetID(SLIDERBASE + 2 - 1); pSliderCtrl2->SetHorz(FALSE); //Show Window pDialog->ShowWindow();//显示窗口 //go into Message Loop int nResult = pDialog->DoModal();//进入窗口消息循环 //Destroy Window delete pDialog;//删除对话框 return(nResult); } void DemoWizard() { CWizard *pWizard = new CWizard; pWizard->AddPage (Page1); pWizard->AddPage (Page2); pWizard->AddPage (Page3); pWizard->DoWizard(); DELETE(pWizard); } |
|
| 第104楼 profree | 发表于 2006-09-23 00:09 |
| 中级用户 发帖 132 积分 478 | |
|
非常感谢firstsail的热心帮助!
这几天一直在看winsail的资料,现有几个建议: 一、好像winsail没有驱动器列表,选项卡控件和数值增减控件,不知firstsail能否加入 二、本人以前也反映过firstsail的界面和控件的美观问题,firstsail能否再考虑 前久下载了chicago9的源代码(全部为源代码),里面有可执行文件,包括驱winsail没有动器列表控件,数值增减控件等控件,运行截图如下: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 建议firstsail能取其长处,这个文件可以到网上下载,或需要的话我可以上传 [ Last edited by profree on 2006-9-23 at 02:32 ] |
|
| 第105楼 firstsail | 发表于 2006-09-23 06:04 |
| 高级用户 发帖 295 积分 668 来自 广东深圳 | |
|
WinSail V2.0内核已经重新上传。
(1) 演示程序所在的目录是“Sail3000” (2)“向导”类已经被“WinSail”内核支持。 (3)“向导”类的详细设计文档名为“界面非控件类_CWizard向导类详细设计.doc” (4)“向导”演示模块在“sail3000\Wizard2.cpp”文件 (5) 可在Win98,Windows2000,WindowsXP运行Sail3000\sail2000.exe可执行文件。 (6) 鼠标只能在“Win98”或“纯DOS”下显示。 所有用WinSail V2.0开发出来的界面,只要按下“F3”功能键,就自动会将当前窗口的画 面以256色的“a.bmp”文件形式记录下来,方便写说明书。 |
|
| 上一页 1 … 4 5 6 7 8 9 10 … 20 下一页 |
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |