|
ArmKing
初级用户
积分 66
发帖 22
注册 2006-8-27
状态 离线
|
『第
91 楼』:
如何支持 LCD Touch Panel?
请问配备相关硬件情况下,软件如何支持 LCD Touch Panel?
|
|
2006-8-28 02:03 |
|
|
ArmKing
初级用户
积分 66
发帖 22
注册 2006-8-27
状态 离线
|
『第
92 楼』:
WinSail 内的某些控件做的有些小问题, 请问如何修改啊? 内核源码, 控件源码会公开吗?
|
|
2006-8-28 02:06 |
|
|
firstsail
高级用户
积分 668
发帖 295
注册 2005-7-26 来自 广东深圳
状态 离线
|
『第
93 楼』:
关于鼠标触摸屏:
(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;
}
|
|
2006-8-28 11:26 |
|
|
profree
中级用户
积分 478
发帖 132
注册 2003-7-2
状态 离线
|
『第
94 楼』:
winsail里如何获得复选框和单选框的状态?
我用GetRadio()不能获取
|
|
2006-9-18 23:39 |
|
|
firstsail
高级用户
积分 668
发帖 295
注册 2005-7-26 来自 广东深圳
状态 离线
|
『第
95 楼』:
用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提出的问题,可能是指“单选按钮”吧!
|
|
2006-9-19 03:55 |
|
|
profree
中级用户
积分 478
发帖 132
注册 2003-7-2
状态 离线
|
『第
96 楼』:
谢谢回复
如果是复选框又怎么获得哪些项被选中了呢?
我很是搞不明白,如果我的一个窗口中有多个单选框/复选框,是分为一个以上组的,怎么分清是属于哪个组,又要怎么设置才能分开呢?
比如:
性别 分为 男,女,
年龄分为:15-20,21-30,31-40,
学历:大专,本科,硕士,博士
以上三个组都是同一窗口中,怎么分开设置,我认为应该有一个“归属于哪个组”的概念就好办多了
另外,如果一个对话框要设计成上一步,下一步,具体该怎么做?难道是上一步,下一步都要分别调用另一个函数来“画”对话框吗?这样如果对话框“画”多了,程序会就自动退出(应该是内存不够吧)
|
|
2006-9-19 22:54 |
|
|
firstsail
高级用户
积分 668
发帖 295
注册 2005-7-26 来自 广东深圳
状态 离线
|
『第
97 楼』:
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有一些已经更新,可重新下载了!
|
|
2006-9-20 05:04 |
|
|
firstsail
高级用户
积分 668
发帖 295
注册 2005-7-26 来自 广东深圳
状态 离线
|
『第
98 楼』:
(1)WinSail V2.0的全局控件句柄只有120个。
#define MAX_OBJECT_LIST_COUNT 120
(2)WinSail V2.0运行于实模式,受DOS的640K内存限制。
(3) 每一个窗口/对话框中的控件不限,受内存和全局控件句柄个数限制。
|
|
2006-9-20 05:19 |
|
|
profree
中级用户
积分 478
发帖 132
注册 2003-7-2
状态 离线
|
『第
99 楼』:
我的窗口需要使用下一步,上一步来完成,我想按下一步或上一步时,删除本窗口,重新生成新的窗口,我定义一个全局变量,在执行下一步时,先删除上一窗口,再生成新的窗口,但不成功,不知是为什么
|
|
2006-9-21 00:20 |
|
|
firstsail
高级用户
积分 668
发帖 295
注册 2005-7-26 来自 广东深圳
状态 离线
|
『第
100 楼』:
不能在本窗口的“控件”函数里面删除其父窗口。
只能发出窗口退出消息,可通过
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;
}
|
|
2006-9-21 21:28 |
|
|
firstsail
高级用户
积分 668
发帖 295
注册 2005-7-26 来自 广东深圳
状态 离线
|
『第
101 楼』:
int CWindow::PurseMessage()的函数源代码为
int CWindow::PurseMessage()
{
int nOldMessageFlags = nAfxMessageFlags; // 保护原值
nAfxMessageFlags = IDNULL; //刷新窗口退出标志
//......
//窗口消息循环
while (nAfxMessageFlags == IDNULL)
{
//....
}
//...
int nResult = nAfxMessageFlags;
nAfxMessageFlags = nOldMessageFlags; //恢复原值
return (nResult);
}
|
|
2006-9-21 21:34 |
|
|
firstsail
高级用户
积分 668
发帖 295
注册 2005-7-26 来自 广东深圳
状态 离线
|
『第
102 楼』:
发给一个实用的“向导”类
/*
向导属性封装,由于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);
}
|
|
2006-9-21 23:53 |
|
|
firstsail
高级用户
积分 668
发帖 295
注册 2005-7-26 来自 广东深圳
状态 离线
|
『第
103 楼』:
将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);
}
|
|
2006-9-21 23:58 |
|
|
profree
中级用户
积分 478
发帖 132
注册 2003-7-2
状态 离线
|
『第
104 楼』:
非常感谢firstsail的热心帮助!
这几天一直在看winsail的资料,现有几个建议:
一、好像winsail没有驱动器列表,选项卡控件和数值增减控件,不知firstsail能否加入
二、本人以前也反映过firstsail的界面和控件的美观问题,firstsail能否再考虑
前久下载了chicago9的源代码(全部为源代码),里面有可执行文件,包括驱winsail没有动器列表控件,数值增减控件等控件,运行截图如下:
建议firstsail能取其长处,这个文件可以到网上下载,或需要的话我可以上传
[ Last edited by profree on 2006-9-23 at 02:32 ]
|
|
2006-9-23 00:09 |
|
|
firstsail
高级用户
积分 668
发帖 295
注册 2005-7-26 来自 广东深圳
状态 离线
|
『第
105 楼』:
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”文件形式记录下来,方便写说明书。
|
|
2006-9-23 06:04 |
|
|