当前位置:文档之家› 第五章 对话框

第五章 对话框

第五章 对话框
第五章 对话框

第五章对话框

5.1 使用资源编辑器编辑对话框

在Windows开发中弹出对话框是一种常用的输入/输出手段,同时编辑好的对话框可以保存在资源文件中。Visual C++提供了对话框编辑工具,利用编辑工具可以方便的添加各种控件到对话框中,而且利用ClassWizard可以方便的生成新的对话框类和映射消息。

首先资源列表中按下右键,可以在弹出菜单中选择“插入对话框”,如图1。

图1

然后再打开该对话框进行编辑,你会在屏幕上看到一个控件板,如图2。

图2

你可以将所需要添加的控件拖到对话框上,或是先选中后再在对话框上用鼠标画出所占的区域。

接下来我们在对话框上产生一个输入框,和一个用于显示图标的图片框。之后我们使用鼠标右键单击产生的控件并选择其属性,如图3。

图3

我们可以在属性对话框中编辑控件的属性同时也需要指定控件ID,如图4,如果在选择对话框本身的属性那么你可以选择对话框的一些属性,包括字体,外观,是否有系统菜单等等。

图4

最后我们编辑图片控件的属性,如图5,我们设置控件的属性为显示图标并指明一个图标ID。

图5

接下来我们添加一些其他的控件,最后的效果如图6。

图6

按下Ctrl-T可以测试该对话框。此外在对话框中还有一个有用的特性,就是可以利用Tab 键让输入焦点在各个控件间移动,要达到这一点首先需要为控件设置在Tab键按下时可以接受焦点移动的属性Tab Stop,如果某一个控件不打算利用这一特性,你需要清除这一属性。然后从菜单“Layout”选择Tab Order来确定焦点移动顺序,如图7。

图7

使用鼠标依此点击控件就可以重新规定焦点移动次序。最后按下Ctrl-T进行测试。

最后我们需要为对话框产生新的类,ClassWizard可以替我们完成大部分的工作,我们只需要填写几个参数就可以了。在编辑好的对话框上双击,然后系统回询问是否添加新的对话框,选择是并在接下来的对话框中输入类名就可以了。ClassWizard会为你产生所需要的头文件和CPP文件。然后在需要使用的地方包含相应的头文件,对于有模式对话框使用DoModal()产生,对于无模式对话框使用Create()产生。相关代码如下:

void CMy51_s1View::OnCreateDlg()

{//产生无模式对话框

CTestDlg *dlg=new CTestDlg;

dlg->Create(IDD_TEST_DLG);

dlg->ShowWindow(SW_SHOW);

}

void CMy51_s1View::OnDoModal()

{//产生有模式对话框

CTestDlg dlg;

int iRet=dlg.DoModal();

TRACE("dlg return %d\n",iRet);

}

下载例子。如果你在调试这个程序时你会发现程序在退出后会有内存泄漏,这是因为我没有释放无模式对话框所使用的内存,这一问题会在以后的章节5.3 创建无模式对话框中专门讲述。

关于在使用对话框时Enter键和Escape键的处理:在使用对话框是你会发现当你按下Enter 键或Escape键都会退出对话框,这是因为Enter键会引起CDialog::OnOK()的调用,而Escape键会引起CDialog::OnCancel()的调用。而这两个调用都会引起对话框的退出。在MFC中这两个成员函数都是虚拟函数,所以我们需要进行重载,如果我们不希望退出对话框那么我们可以在函数中什么都不做,如果需要进行检查则可以添加检查代码,然后调用父类的OnOK()或OnCancel()。相关代码如下:

void CTestDlg::OnOK()

{

AfxMessageBox("你选择确定");

CDialog::OnOK();

}

void CTestDlg::OnCancel()

{

AfxMessageBox("你选择取消");

CDialog::OnCancel();

}

5.2 创建有模式对话框

使用有模式对话框时在对话框弹出后调用函数不会立即返回,而是等到对话框销毁后才会返回(请注意在对话框弹出后其他窗口的消息依然会被传递)。所以在使用对话框时其他窗口都不能接收用户输入。创建有模式对话框的方法是调用CDialog::DoModal()。下面的代码演示了这种用法:

CYourView::OnOpenDlg()

{

CYourDlg dlg;

int iRet=dlg.DoModal();

}

CDialog::DoModal()的返回值为IDOK,IDCANCEL。表明操作者在对话框上选择“确认”或是“取消”。由于在对话框销毁前DoModal不会返回,所以可以使用局部变量来引用对象。在退出函数体后对象同时也会被销毁。而对于无模式对话框则不能这样使用,下节5.3 创建无模式对话框中会详细讲解。

你需要根据DoModal()的返回值来决定你下一步的动作,而得到返回值也是使用有模式对话框的一个很大原因。

使用有模式对话框需要注意一些问题,比如说不要在一些反复出现的事件处理过程中生成有模式对话框,比如说在定时器中产生有模式对话框,因为在上一个对话框还未退出时,定时器消息又会引起下一个对话框的弹出。

同样的在你的对话框类中为了向调用者返回不同的值可以调用CDialog::OnOK()或是CDialog::OnCancel()以返回IDOK或IDCANCEL,如果你希望返回其他的值,你需要调用CDialog::EndDialog( int nResult );其中nResult会作为DoModal()调用的返回值。

下面的代码演示了如何使用自己的函数来退出对话框:下载例子

void CMy52_s1View::OnLButtonDown(UINT nFlags, CPoint point)

{//创建对话框并得到返回值

CView::OnLButtonDown(nFlags, point);

CTestDlg dlg;

int iRet=dlg.DoModal();

CString szOut;

szOut.Format("return value %d",iRet);

AfxMessageBox(szOut);

}

//重载OnOK,OnCancel

void CTestDlg::OnOK()

{//什么也不做

}

void CTestDlg::OnCancel()

{//什么也不做

}

//在对话框中对三个按钮消息进行映射

void CTestDlg::OnExit1()

{

CDialog::OnOK();

}

void CTestDlg::OnExit2()

{

CDialog::OnCancel();

}

void CTestDlg::OnExit3()

{

CDialog::EndDialog(0XFF);

}

由于重载了OnOK和OnCancel所以在对话框中按下Enter键或Escape键时都不会退出,只有按下三个按钮中的其中一个才会返回。

此外在对话框被生成是会自动调用BOOL CDialog::OnInitDialog(),你如果需要在对话框显示前对其中的控件进行初始化,你需要重载这个函数,并在其中填入相关的初始化代码。利用ClassWizard可以方便的产生一些默认代码,首先打开ClassWizard,选择相应的对话框类,在右边的消息列表中选择WM_INITDIALOG并双击,如图,

ClassWizard会自动产生相关代码,代码如下:

BOOL CTestDlg::OnInitDialog()

{

/*先调用父类的同名函数*/

CDialog::OnInitDialog();

/*填写你的初始化代码*/

return TRUE;

}

有关对对话框中控件进行初始化会在5.4 在对话框中进行消息映射中进行更详细的讲解。

5.3 创建无模式对话框

无模式对话框与有模式对话框不同的是在创建后其他窗口都可以继续接收用户输入,因此无模式对话框有些类似一个弹出窗口。创建无模式对话框需要调用

BOOL CDialog::Create( UINT nIDTemplate, CWnd* pParentWnd = NULL );之后还需要调用BOOL CDialog::ShowWindow( SW_SHOW);进行显示,否则无模式对话框将是不可见的。相关代码如下:

void CYourView::OnOpenDlg(void)

{

/*假设IDD_TEST_DLG为已经定义的对话框资源的ID号*/

CTestDlg *dlg=new CTestDlg;

dlg->Create(IDD_TEST_DLG,NULL);

dlg->ShowWindows(SW_SHOW);

/*不要调用 delete dlg;*/

}

在上面的代码中我们新生成了一个对话框对象,而且在退出函数时并没有销毁该对象。因为如果此时销毁该对象(对象被销毁时窗口同时被销毁),而此时对话框还在显示就会出现错误。那么这就提出了一个问题:什么时候销毁该对象。我时常使用的方法有两个:

?在对话框退出时销毁自己:在对话框中重载OnOK与OnCancel在函数中调用父类的同名函数,然后调用DestroyWindow()强制销毁窗口,在对话框中映射WM_DESTROY

消息,在消息处理函数中调用delete this;强行删除自身对象。相关代码如下:?void CTestDlg1::OnOK()

?{

?CDialog::OnOK();

?DestroyWindow();

?}

?

?void CTestDlg1::OnCancel()

?{

?CDialog::OnCancel();

?DestroyWindow();

?}

?

?void CTestDlg1::OnDestroy()

?{

?CDialog::OnDestroy();

?AfxMessageBox("call delete this");

?delete this;

?}

这种方法的要点是在窗口被销毁的时候,删除自身对象。所以你可以在任何时候调

用DestroyWindow()以达到彻底销毁自身对象的作用。(DestroyWindow()的调用会引起OnDestroy()的调用)

?通过向父亲窗口发送消息,要求其他窗口对其进行销毁:首先需要定义一个消息用于进行通知,然后在对话框中映射WM_DESTROY消息,在消息处理函数中调用消息发送函数通知其他窗口。在接收消息的窗口中利用ON_MESSAGE映射处理消息的函数,并在消息处理函数中删除对话框对象。相关代码如下:

?/*更改对话框的有关文件*/

?CTestDlg2::CTestDlg2(CWnd* pParent /*=NULL*/)

?: CDialog(CTestDlg2::IDD, pParent)

?{/*m_pParent为一成员变量,用于保存通知窗口的指针,

?所以该指针不能是一个临时指针*/

?ASSERT(pParent);

?m_pParent=pParent;

?//{{AFX_DATA_INIT(CTestDlg2)

?// NOTE: the ClassWizard will add member initialization here ?//}}AFX_DATA_INIT

?}

?void CTestDlg2::OnOK()

?{

?CDialog::OnOK();

?DestroyWindow();

?}

?

?void CTestDlg2::OnCancel()

?{

?CDialog::OnCancel();

?DestroyWindow();

?}

?

?void CTestDlg2::OnDestroy()

?{

?CDialog::OnDestroy();

?/*向其他窗口发送消息,将自身指针作为一个参数发送*/

?m_pParent->PostMessage(WM_DELETE_DLG,(WPARAM)this);

?}

?

?/*在消息接收窗口中添加消息映射*/

?/*在头文件中添加函数定义*/

?afx_msg LONG OnDelDlgMsg(WPARAM wP,LPARAM lP);

?/*添加消息映射代码*/

?ON_MESSAGE(WM_DELETE_DLG,OnDelDlgMsg)

?END_MESSAGE_MAP()

?/*实现消息处理函数*/

?LONG CMy53_s1View::OnDelDlgMsg(WPARAM wP,LPARAM lP)

?{

?delete (CTestDlg2*)wP;

?return 0;

?}

?/*创建对话框*/

?void CMy53_s1View::OnTest2()

?{

?CTestDlg2 *dlg=new CTestDlg2(this);

?dlg->Create(IDD_TEST_DLG_2);

?dlg->ShowWindow(SW_SHOW);

?}

在这种方法中我们利用消息来进行通知,在Window系统中利用消息进行通知和传递数据的用法是很多的。

同样无模式对话框的另一个作用还可以用来在用户在对话框中的输入改变时可以及时的反映到其他窗口。下面的代码演示了在对话框中输入一段文字,然后将其更新到视图的显示区域中,这同样也是利用了消息进行通知和数据传递。

/*在对话框中取出数据,并向其他窗口发送消息和数据,将数据指针作为一个参数发送*/ void CTestDlg2::OnCommBtn()

{

char szOut[30];

GetDlgItemText(IDC_OUT,szOut,30);

m_pParent->SendMessage(WM_DLG_NOTIFY,(WPARAM)szOut);

}

/*在消息接收窗口中*/

/*映射消息处理函数*/

ON_MESSAGE(WM_DLG_NOTIFY,OnDlgNotifyMsg)

/*在视图中绘制出字符串 m_szOut*/

void CMy53_s1View::OnDraw(CDC* pDC)

{

CMy53_s1Doc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

// TODO: add draw code for native data here

pDC->TextOut(0,0,"Display String");

pDC->TextOut(0,20,m_szOut);

}

/*处理通知消息,保存信息并更新显示*/

LONG CMy53_s1View::OnDlgNotifyMsg(WPARAM wP,LPARAM lP)

{

m_szOut=(char*)wP;

Invalidate();

return 0;

}

此外这种用法利用消息传递数据的方法对有模式对话框和其他的窗口间通信也一样有效。下载本节例子

5.4 在对话框中进行消息映射

利用对话框的一个好处是可以利用ClassWizard对对话框中各个控件产生的消息进行映射,ClassWizrd可以列出各种控件可以使用的消息,并能自动产生代码。在本节中我们以一个例子来讲解如何在对话框中对子窗口消息进行映射同时还讲解如何对对话框中的子窗口进行初始化。

首先我们产生编辑好一个对话框,如图,

在对话框中使用的控件和ID号如下表:

首先我们需要在对话框的OnInitDialog()函数中对各个控件进行初始化,这里我们使用CWnd* GetDlgItem( int nID )来通过ID号得到子窗口指针。(类似的函数还有UINT GetDlgItemInt( int nID, BOOL* lpTrans = NULL, BOOL bSigned = TRUE ) 通过ID号得到子窗口中输入的数字,int GetDlgItemText( int nID, CString& rString ) 通过ID号得到子窗口中输入的文字)。代码如下:

BOOL CMy54_s1Dlg::OnInitDialog()

{

CDialog::OnInitDialog();

/*添加初始化代码*/

//初始化输入框

((CEdit*)GetDlgItem(IDC_EDIT_TEST))->SetWindowText("this is a edit box");

//初始化列表框

CListBox* pListB=(CListBox*)GetDlgItem(IDC_LIST_TEST);

pListB->AddString("item 1");

pListB->AddString("item 2");

pListB->AddString("item 3");

//初始化组合框

CComboBox* pCB=(CComboBox*)GetDlgItem(IDC_COMBO_TEST);

pCB->AddString("item 1");

pCB->AddString("item 2");

pCB->AddString("item 3");

//初始化Tab Ctrl

CTabCtrl* pTab=(CTabCtrl*)GetDlgItem(IDC_TAB_TEST);

pTab->InsertItem(0,"Tab Page1");

pTab->InsertItem(1,"Tab Page2");

pTab->InsertItem(2,"Tab Page3");

//初始化ListCtrl

CListCtrl* pList=(CListCtrl*)GetDlgItem(IDC_LIST_CTRL);

pList->InsertColumn(0,"Column 1",LVCFMT_LEFT,100);

pList->InsertItem(0,"Item 1");

pList->InsertItem(1,"Item 2");

pList->InsertItem(2,"Item 3");

//初始化TreeCtrl

CTreeCtrl* pTree=(CTreeCtrl*)GetDlgItem(IDC_TREE_TEST);

pTree->InsertItem("Node1",0,0);

HTREEITEM hNode=pTree->InsertItem("Node2",0,0);

pTree->InsertItem("Node2-1",0,0,hNode);

pTree->InsertItem("Node2-2",0,0,hNode);

pTree->Expand(hNode,TVE_EXPAND);

return TRUE; // return TRUE unless you set the focus to a control

}

接下来我们需要利用ClassWizard对控件所产生的消息进行映射,打开ClassWizard对话框,选中相关控件的ID,在右边的列表中就会显示出可用的消息。如我们对按钮的消息进行映射,在选中按钮ID(IDC_BUTTON_TEST)后,会看到两个消息,如图,

一个是BN_CLICKED,一个是BN_DOUBLECLICKED。双击BN_CLICKED后在弹出的对话框中输入函数名,ClassWizard会产生按钮被按的消息映射。

然后我们看看对TabCtrl的TCN_SELCHANGE消息进行映射,如图,

在TabCtrl的当前页选择发生改变时这个消息会被发送,所以通过映射该消息可以在当前页改变时及时得到通知。

最后我们对输入框的EN_CHANGE消息进行映射,如图,

在输入框中的文本改变后该消息会被发送。相关的代码如下:

//头文件中相关的消息处理函数定义

afx_msg void OnButtonTest();

afx_msg void OnSelchangeTabTest(NMHDR* pNMHDR, LRESULT* pResult);

afx_msg void OnChangeEditTest();

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

//CPP文件中消息映射代码

ON_BN_CLICKED(IDC_BUTTON_TEST, OnButtonTest)

ON_NOTIFY(TCN_SELCHANGE, IDC_TAB_TEST, OnSelchangeTabTest)

ON_EN_CHANGE(IDC_EDIT_TEST, OnChangeEditTest)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

//消息处理函数

void CMy54_s1Dlg::OnButtonTest()

{

AfxMessageBox("you pressed a button");

}

void CMy54_s1Dlg::OnSelchangeTabTest(NMHDR* pNMHDR, LRESULT* pResult)

{

TRACE("Tab Select changed\n");

*pResult = 0;

}

void CMy54_s1Dlg::OnChangeEditTest()

{

TRACE("edit_box text changed\n");

}

对于其他的控件都可以采取类似的方法进行消息映射,下载例子。此外如果你对各种控件可以使用的消息不熟悉,你可以通过使用对话框,然后利用ClassWizard产生相关代码的方法来进行学习,你也可以将ClassWizard产生的代码直接拷贝到其他需要的地方(不瞒你说,我最开始就是这样学的 :-D 这也算一个小窍门)。

5.5 在对话框中进行数据交换和数据检查

MFC提供两种方法在对话框中进行数据交换和数据检查(Dialog data exchange/Dialog data validation),数据交换和数据检查的思想是将某一变量和对话框中的一个子窗口进行关联,然后通过调用BOOL UpdateData( BOOL bSaveAndValidate = TRUE )来指示MFC将变量中数据放入子窗口还是将子窗口中数据取到变量中并进行合法性检查。

在进行数据交换时一个子窗口可以和两种类型的变量相关联,一种是控件(Control)对象,比如说按钮子窗口可以和一个CButton对象相关联,这种情况下你可以通过该对象直接控制子窗口,而不需要象上节中讲的一样使用GetDlgItem(IDC_CONTROL_ID)来得到窗口指针;一种是内容对象,比如说输入框可以和一个CString对象关联,也可以和一个UINT类型变量关联,这种情况下你可以直接设置/获取窗口中的输入内容。

而数据检查是在一个子窗口和一个内容对象相关联时在存取内容时对内容进行合法性检查,比如说当一个输入框和一个CString对象关联时,你可以设置检查CString的对象的最长/最小长度,当输入框和一个UINT变量相关联时你可以设置检查UINT变量的最大/最小值。在BOOL UpdateData( BOOL bSaveAndValidate = TRUE )被调用后,合法性检查会自动进行,如果无法通过检查MFC会弹出消息框进行提示,并返回FALSE。

设置DDX/DDV在VC中非常简单,ClassWizard可以替你完成所有的工作,你只需要打开ClassWizard并选中Member Variables页,如图,

你可以看到所有可以进行关联的子窗口ID列表,双击一个ID会弹出一个添加变量的对话框,如图,

填写相关的信息后按下确定按钮就可以了。

然后选中你刚才添加的变量在底部的输入框中输入检查条件,如图。

下面我们看一个例子,对话框上的子窗口如图

设置,各子窗口的ID和关联的变量如下表:

这时候ClassWizard会自动生成变量定义和相关代码,在对话框的构造函数中可以对变量的初始值进行设置,此外在BOOL CDialog::OnInitDialog()中会调用UpdateData(FALSE),即会将变量中的数据放入窗口中。相关代码如下:

//头文件中的变量定义,ClassWizard自动产生

// Dialog Data

//{{AFX_DATA(CMy55_s1Dlg)

enum { IDD = IDD_MY55_S1_DIALOG };

CListBox m_lbTest;

int m_iSel;

CString m_szEdit;

CString m_szCombo;

BOOL m_fCheck;

//}}AFX_DATA

//构造函数中赋初值

CMy55_s1Dlg::CMy55_s1Dlg(CWnd* pParent /*=NULL*/)

: CDialog(CMy55_s1Dlg::IDD, pParent)

{

//{{AFX_DATA_INIT(CMy55_s1Dlg)

m_iSel = -1;

m_szEdit = _T("");

m_szCombo = _T("");

m_fCheck = FALSE;

//}}AFX_DATA_INIT

.....

}

//ClassWizard产生的关联和检查代码

void CMy55_s1Dlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CMy55_s1Dlg)

DDX_Control(pDX, IDC_LIST_TEST, m_lbTest);

DDX_Radio(pDX, IDC_RADIO_TEST_1, m_iSel);

DDX_Text(pDX, IDC_EDIT_TEST, m_szEdit);

DDV_MaxChars(pDX, m_szEdit, 5);

DDX_CBString(pDX, IDC_COMBO_TEST, m_szCombo);

DDX_Check(pDX, IDC_CHECK_TEST, m_fCheck);

//}}AFX_DATA_MAP

}

//在OnInitDialog中利用已经关联过的变量m_lbTest

BOOL CMy55_s1Dlg::OnInitDialog()

{

CDialog::OnInitDialog();

...

// TODO: Add extra initialization here

//设置列表框中数据

m_lbTest.AddString("String 1");

m_lbTest.AddString("String 2");

m_lbTest.AddString("String 3");

m_lbTest.AddString("String 4");

return TRUE; // return TRUE unless you set the focus to a control

}

//对两个按钮消息处理

//通过UpdateData(TRUE)得到窗口中数据

void CMy55_s1Dlg::OnGet()

{

if(UpdateData(TRUE))

{

//数据合法性检查通过,可以使用变量中存放的数据

CString szOut;

szOut.Format("radio =%d \ncheck is %d\nedit input is

%s\ncomboBox input is %s\n",

m_iSel,m_fCheck,m_szEdit,m_szCombo);

AfxMessageBox(szOut);

}

//else 未通过检查

}

//通过UpdateData(FALSE)将数据放入窗口

void CMy55_s1Dlg::OnPut()

{

m_szEdit="onPut test";

m_szCombo="onPut test";

UpdateData(FALSE);

}

在上面的例子中我们看到利用DDX/DDV和UpdateData(BOOL)调用我们可以很方便的存取数据,而且也可以同时进行合法性检查。下载例子代码

5.6 使用属性对话框

属性对话框不同于普通对话框的是它能同时提供多个选项页,而每页都可以由资源编辑器以编辑对话框的方式进行编辑,这样给界面开发带来了方便。同时使用上也遵守普通对话框的规则,所以学习起来很方便。属性对话框由两部分构成:多个属性页(CPropertyPage)和属性对话框(CPropertySheet)。

首先需要编辑属性页,在资源编辑器中选择插入,并且选择属性对话框后就可以插入一个属性页,如图,

或者选择插入一个对话框,然后将其属性中的Style设置为Child,Border设置为Thin也可以,如图。

然后根据这个对话框资源生成一个新类,在选择基类时选择CPropertyPage,ClassWizard 会自动生成相关的代码。

而对于CPropertySheet也需要生成新类,并且将所有需要加入的属性页对象都作为成员变量。属性对话框也分为有模式和无模式两种,有模式属性对话框使用DoModal()创建,无模式属性对话框使用Create()创建。下面的代码演示了如何创建属性对话框并添加属性页:

//修改CPropertySheet派生类的构造函数为如下形式

CSheet::CSheet()

:CPropertySheet("test sheet", NULL, 0)

{

m_page1.Construct(IDD_PAGE_1);

m_page2.Construct(IDD_PAGE_2);

AddPage(&m_page1);

AddPage(&m_page2);

}

//创建有模式属性对话框

void CMy56_s1Dlg::OnMod()

{

CSheet sheet;

sheet.DoModal();

}

//创建无模式属性对话框

void CMy56_s1Dlg::OnUnm()

{

CSheet *sheet=new CSheet;

sheet->Create();

}

对于属性对话框可以使用下面的一些成员函数:

?CPropertyPage* CPropertySheet::GetActivePage( )得到当前活动页的指针。

?BOOL CPropertySheet::SetActivePage( int nPage )用于设置当前活动页。

?int CPropertySheet::GetPageCount()用于得到当前页总数。

?void CPropertySheet::RemovePage( int nPage )用于删除一页。

而对于属性页来将主要通过重载一些函数来达到控制的目的:

?void CPropertyPage::OnOK() 在属性对话框上按下“确定”按钮后被调用

?void CPropertyPage::OnCancel() 在属性对话框上按下“取消”按钮后被调用?void CPropertyPage::OnApply() 在属性对话框上按下“应用”按钮后被调用?void CPropertyPage::SetModified( BOOL bChanged = TRUE ) 设置当前页面上的数据被修改标记,这个调用可以使“应用”按钮为允许状态。

此外利用属性对话框你可以生成向导对话框,向导对话框同样拥有多个属性页,但同时只有一页被显示,而且对话框上显示的按钮为“上一步”,“下一步”/“完成”,向导对话框会按照你添加页面的顺序依次显示所有的页。在显示属性对话框前你需要调用void CPropertySheet::SetWizardMode()。使用向导对话框时需要对属性页的BOOL CPropertyPage::OnSetActive( )进行重载,并在其中调用void

CPropertySheet::SetWizardButtons( DWORD dwFlags )来设置向导对话框上显示的按钮。dwFlags的取值可为以下值的“或”操作:

?PSWIZB_BACK 显示“上一步”按钮

?PSWIZB_NEXT 显示“下一步”按钮

?PSWIZB_FINISH 显示“完成”按钮

?PSWIZB_DISABLEDFINISH 显示禁止的“完成”按钮

void CPropertySheet::SetWizardButtons( DWORD dwFlags )也可以在其他地方调用,比如说在显示最后一页时先显示禁止的“完成”按钮,在完成某些操作后再显示允许的“完成”按钮。

在使用向导对话框时可以通过重载一些函数来达到控制的目的:

?void CPropertyPage::OnWizardBack() 按下了“上一步”按钮。返回0表示有系统决定需要显示的页面,-1表示禁止页面转换,如果希望显示一个特定的页面需要返回该页面的ID号。

?void CPropertyPage::OnOnWizardNext() 按下了“下一步”按钮。返回值含义与void CPropertyPage::OnWizardBack()相同。

?void CPropertyPage::OnWizardFinish() 按下了“完成”按钮。返回FALSE表示不允许继续,否则返回TRUE向导对话框将被结束。

在向导对话框的DoModal()返回值为ID_WIZFINISH或IDCANCEL。下面的代码演示了如何创建并使用向导对话框:

//创建有模式向导对话框

void CMy56_s1Dlg::OnWiz()

{

CSheet sheet;

sheet.SetWizardMode();

int iRet=sheet.DoModal();//返回ID_WIZFINISH或IDCANCEL

}

//重载BOOL CPropertyPage::OnSetActive( )来控制显示的按钮

BOOL CPage1::OnSetActive()

{

((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_BACK|PSWIZB_NE XT);

return CPropertyPage::OnSetActive();

}

BOOL CPage2::OnSetActive()

{

((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_BACK|PSWIZB_FI NISH);

return CPropertyPage::OnSetActive();

}

下载本节例子。

5.7 使用通用对话框

在Windows系统中提供了一些通用对话框如:文件选择对话框如图,

颜色选择对话框如图,

企业组织形式有哪几种

企业组织形式有哪几种 企业是一个实行自主经营、独立核算、依法设立的一种营利性的经济组织,这种经济组织用不同的形式在呈现。下面来介绍几个典型的企业组织形式:个人独资企业、合伙企业以及公司制企业,都是我们在日常生活中比较熟悉的。 典型的企业组织的形式主要有: 一、个人独资企业 个人独资企业是指由一个自然人投资,全部资产为投资人所有的营利性经济组织。个人独资企业不具有法人资格,也无独立承担民事责任的能力。但个人独资企业是独立的民事主体,可以以自己的名义从事民事活动。同时,个人独资企业的分支机构的民事责任由设立该分支机构的个人独资企业承担。个人独资企业的设立条件: 1.投资人为一个自然人,且只能是中国公民 (1)投资人只能是自然人,不包括法人。 (2)投资人只能是中国公民,不包括港、澳、台同胞。 (3)国家公务员、党政机关领导干部、法官、检察官、警官、商业银行工作人员等,不得投资设立个人独资企业。 2.有合法的企业名称 个人独资企业的名称中不能出现“有限”、“有限责任”或

者“公司”字样。 3.有固定的生产经营场所和必要的生产经营条件 4.有必要的从业人员 5.有投资人申报的出资 二、合伙企业 合伙企业是由两个或两个以上的自然人通过订立合伙协议,共同出资经营、共负盈亏、共担风险的企业组织形式。合伙企业分为普通合伙企业(其中包括特殊的普通合伙企业)和有限合伙企业。 三、公司制企业 公司(或称公司制企业)是指由两个以上投资人(自然人或法人)依法出资组建,有独立法人财产,自主经营,自负盈亏的法人企业。出资者按出资额对公司承担有限责任。 其主要形式分为有限责任公司和股份有限公司两种。 有限责任公司和股份有限公司的区别:(1)公司设立时对股东人数要求不同。设立有限责任公司必须有2个以上股东,最多不得超过50个;设立股份有限公司应有3个或3个以上发起人,多者不限。(2)股东的股权表现形式不同。有限责任公司的权益总额不作等额划分,股东的股权是通过投资人所拥有的比例来表示的;股份有限公司的权益总额平均划分为相等的股份,股东的股权是用持有多少股份来表示的。(3)股份转让限制不同。有限责任公司不发行股票,对股东只发

Visual C++基于对话框的MFC应用程序---简单的时钟实例实验一

1.1 创建对话框的应用程序 1.使用AppWizard创建应用程序框架 首先,创建一个对话框应用程序,其工程文件名为:ch1.dsp。具体步骤如下: (1)启动Visual C++ 6.0,在File菜单中选择new菜单项;(2)在new对话框的Project页中选择 MFC AppWizard(exe)选项,在Project name框中输入:ch1,并在Location 框中指定希望的目录路径,编译系统生成的各种文件将会存放在该目录下,然后点击[OK]按钮 (3)MFC AppWizard-Step1 中选择Dialog based 选项,MFC AppWizard-Step2 到MFC AppWizard-Step4中取默认选项;(4)进入VC对话框设计界面后,选中 [TODO:在这里设置对话控制。]静态框并按del键删除该框,选中[取消]按钮并按del键删除该按钮; (5)将[确认]按钮拖曳到对话框的下方中间。生成的对话框设计窗口(如图1-1所示)。 图1-1

2.向类中添加系统消息响应函数 Windows应用程序的采用事件触发、消息驱动机制和大量的消息响应函数构成了应用程序的主体。本示例需要用到两个消息响应函数OnCtlColor()和OnTimer(),前者响应窗口消息:WM_CTLCOLOR,后者响应窗口消息:WM_TIMER。关于这两个函数的功能和用法暂且略过,留待后面小节再叙。这里先介绍响应函数加载的方法。 在CCh1Dlg类中添加OnCtlColor( )函数的操作方法如下:(1)打开类向导(MFC ClassWizard)窗口,选择Message Maps 页; (2)选择工程、类和对象标识。在Message Maps页的Project、Class name、Object Ids框中 分别选择:ch1、CCh1Dlg、CCh1Dlg; (3)添加响应函数。在Message Maps页的Messages框中选中并双击窗口消息:WM_CTLCOLOR,此时,消息WM_CTLCOLOR 的响应函数OnCtlColor( )被添加到类向导底部Member Functions框中。 注意,添加OnTimer( )函数的过程与上述过程相似,只是第(3)步选择WM_TIMER消息,而不是WM_CTLCOLOR。 添加完毕后,按[OK]按钮退出类向导。回到项目工作区,在项目工作区窗口展开CCh1Dlg类,可以看到类中添加了OnCtlColor( )和OnTimer( )两个消息响应函数。

专升本的形式都有哪几种

一、专科升本科的方式关键有下列四种,这四种方式都有优劣。 1、一般专科升本科 一般专科升本科考入后必须再读2年大学本科(全日制教育学习培训),一般专科升本科是归属于我国一般高等职业教育,现阶段已列入高考招生方案。考入后和一般本科毕业生一样塑造,推行插班或单独开课学习培训(依据总数而定)。修业年限2年。 2、自考专科升本科 自考专科升本科是自考特性的大学本科,即独立本科段。自考专科升本科一般称之为专套本,学习形式一般为业余组制(双休日授课)学习培训或通过自学,考试内容一般为15门上下,必须所有根据才可以取得毕业证。由于其学习形式随意,考试报名时间和技术专业不受到限制,因此很受学员热烈欢迎。 3、成人高考专科升本科 成人高考专科升本科即成年人高等职业教育(成考),报名参加国家统一的入学考,考試根据较为非常容易,录取人数高。成考分成大专环节和专科升本科环节,每一年一次报名机遇。学习形式有脱产学习、业余组和成考函授三种,修业年限2.五年。 4、网络教育专科升本科 网络教育(远程控制网络教育)是由各院校网络教育学院或远程控制网络教育学院组机构考試和管理方法,其特性和成考类似,也是必须入学考,但差别是院校自 己出题和判卷,分春秋季节招收。学习形式选用网络学习为主导

的教学方法,根据互联网在线学习平台开展线上自觉学习、在网上答疑解惑指导、网上作业、在网上检测等课堂教学。修业年限最短 2.五年。 二、各种专科升本科难度系数、社会发展认同率 1、一般专科升本科 一般专科升本科考試并不会太难,但录取人数少,市场竞争大。因为归属于我国一般高等职业教育,入校门坎高,故社会发展认同率也最大。毕业证和高职本科一样,但会标明是大专起始点(专科升本科)二年制学员。学位证书和一般统招学位证书一样。 2、自考专科升本科 自考专科升本科本质便是自考大学本科,自考专升本是各种专科升本科考試中是难度系数较大的,必须将十几门课程内容所有根据才可以取得毕业证。毕业证由省自考办授予,资格证书上面盖省自考联合会和主考官学校两个章。因为难度系数大,因此還是较为受公司的认同。 3、成人高考专科升本科 成人高考专科升本科只必须报名参加并根据全国各地机构的统一入学考就可以,考試不会太难,录取人数较为大,相对性入校门坎较为低,毕业证由各院校继续再教育学院授予,有成人继续教育脱产学习或成考函授字眼,一般来说,社会发展认同率相对性小于自考和一般专科升本科。 4、网络教育专科升本科

表达方式有哪几种

表达方式有哪几种? 有五种1、记叙2、说明3、议论4、描写5、抒情 修辞手法: 比喻、拟人、夸张、排比、对偶、反复、设问、反问,引用、对比、借代、反语,顶真 记叙文记事六要素,第一要素是时间,年、月、日、时写清楚;第二要素是地点,要写环境和住处。第三要素是人物,不写人物是糊涂, 第四要素是原因,为何发生找原因;第五要素是经过,来龙去脉写清楚;第六要素是结果,交代结局别含糊。 记叙的顺序一般可分为顺叙、倒叙、插叙。 关于表现手法:托物言志写景抒情叙事抒情直抒胸臆对比衬托卒章显志象征衬托想象联想照应寓情于景反衬烘托托物起兴美景衬哀情渲染虚实结合点面结合动静结合伏笔照应托物言志设置悬念渲染环境侧面描写正面描写直接抒情间接抒情等,借物喻人欲扬先抑欲抑先扬顺叙 倒叙插用典照应; 常见的说明方法有举例子、作引用、分类别、列数字、作比较、画图表、下定义、作诠释、打比方、摹状貌、作假设这11种。 说明顺序有哪几种1、时间顺序:2、空间顺序:3、逻辑顺序::①从主到次②从简单到复杂③从概括到具体④从整体到局部⑤从现象到本质⑥从结果到原因人物描写的基本方法可分为四种:外貌描写、语言描写、行动描写、心理描写和神态描写。 二、在鉴赏现代文阅读中,表达技巧包括: 1、表达方式:叙述、说明、议论、抒情、描写。 2、表现手法:想象、联想、类比、象征、烘托、对比、渲染、修辞、抑扬、用典等。 3、材料安排:主次、详略、繁简。 4、结构:承上启下、悬念、照应、铺垫等。 5、修辞手法:比喻、反复、排比、反问、拟 人、比拟、拟物、夸张等 景物描写的角度:视觉角度、味觉角度、听觉角度、触觉角度、感觉角度等不必说碧绿的菜畦(视觉),光滑的石井栏(触觉),高大的皂荚树,紫红的桑椹;也不必说鸣蝉在树叶里长吟(听觉),肥胖的黄蜂伏在菜花上,轻捷的叫天子忽然从草间直窜向云霄里去了。单是周围的短短的泥墙根一带,就有无限趣味(感觉),油岭在这里低唱,蟋蟀们在这里弹琴(听觉)。如果不怕刺,还可以摘到覆盆子,像小珊瑚珠攒成的小球,又酸又甜(味觉)。 常见的文章结构方式有四种。1、并列式:2、总分式3、对照式4、递进式一些表示各种情感的词语一、激动悲喜交集悲愤填膺百感交集感人肺腑动人心弦情不自禁心潮澎湃激昂慷慨慷慨激昂二、感激感激涕零感恩戴德谢天谢地没齿不忘感同身受三、懊丧垂头丧气灰心丧气心灰意冷心灰意懒万念俱灰自暴自弃黯然销魂大失所望四、悲痛、哀悼心如刀割切肤之痛哀毁骨立悲天悯人五、愤怒怒不可遏怒形于色怒火中烧忍无可忍六、欢喜欢天喜地欢欣鼓舞喜从天降大喜过望兴高采烈兴致勃勃乐不可支心花怒放手舞足蹈拍手称快皆大欢喜七、忧愁愁眉不展愁眉苦脸愁眉紧缩忧心忡忡忧心如焚心急如火郁郁寡欢八、烦乱坐立不安局促不安忐忑不安方寸大乱心烦意乱六神无主七上八下神魂颠倒心神不定心乱如麻若有所失惘然若失长吁短叹度日

Wincc中弹出对话框函数MessageBox参数以及应用

Wincc 中对话框弹出函数MessageBox 参数以及应用 按键显示: 常数 值 描述 MB_OK 0x00000000 消息框中包含的一个按钮: 确定 这是默认值. MB_OKCANCEL 0x00000001 消息框中包含的两个按钮: 确定和取消. MB_ABORTRETRYIGNORE 0x00000002 消息框中包含的三个按钮: 中止, 重试和忽略. MB_YESNOCANCEL 0x00000003 消息框中包含的三个按钮: 是,否和取消 MB_YESNO 0x00000004 消息框中包含的两个按钮: 是和否 MB_RETRYCANCEL 0x00000005 消息框中包含的两个按钮: 重试和取消 MB_CANCELTRYCONTINUE 0x00000006 Windows 2000: 消息框中包含的三个按钮: 取消, 重试, 继续. 使用这个消息框类型代替 //MessageBox(NULL,"这是一个默认的只有确定的消息框!","标题", MB_OK ); //MessageBox(NULL,"这是一个确定取消的消息框!","标题", MB_OKCANCEL ); //MessageBox(NULL,"这是一个是或否的消息框!","标题", MB_YESNO ); //MessageBox(NULL,"这是一个是或否或取消的消息框!","标题", MB_YESNOCANCEL ); //MessageBox(NULL,"这是一个重试或取消的消息框!","标题",MB_RETRYCANCEL ); //MessageBox(NULL,"这是一个中止, 重试和忽略的消息框!","标题",MB_ABORTRETRYIGNORE ); 在消息框内显示的图标是以下值之一。 //MessageBox(NULL,"这是一个错误的消息框!","标题", MB_ICONHAND ); //MessageBox(NULL,"这是一个错误的消息框!","标题", MB_ICONSTOP ); //MessageBox(NULL,"这是一个错误的消息框!","标题", MB_ICONERROR ); //MessageBox(NULL,"这是一个询问的消息框!","标题", MB_ICONQUESTION); //MessageBox(NULL,"这是一个警告的消息框!","标题", MB_ICONEXCLAMATION );

1C#程序设计第十章课后习题答案

单选: (1).NET中的大多数控件都派生于(C)类 A.Class B.From C.Control D.Object (2)在以下控件中,可用于输入数据的是(B) https://www.doczj.com/doc/fe13974911.html,bel B.TextBox C.Button D.PictureBox (3)在以下控件中,可实现多项选择的是(A) A.CheckBox B.RadioButton https://www.doczj.com/doc/fe13974911.html,boBox D.NumericUpDown (4)不属于容器控件的是(C) A.GroupBox B.Panel C.MenuStrip D.TapControl (5)(B)控件组合了TextBox控件和ListBox控件的功能。 https://www.doczj.com/doc/fe13974911.html,bel https://www.doczj.com/doc/fe13974911.html,boBox C.ProgressBar D.PictureBox (6)让控件不可以使用的属性是以下哪一个?B A.AllowDrop B.Enabled C.Bounds D.Visible (7)让控件不可显示的属性是以下哪一个?D A.AllowDrop B.Enabled C.Bounds D.Visible (8)不能用于设置控件布局位置的属性是(C) A.Left B.Top C.Size D.Location (9)可用来设置文字颜色的属性是(B) A.BackColor B.ForeColor C.Text D.Parent (10)TextBox控件的(B)属性将输入的字符代替显示为指定的密码字符。 A.Text B.PasswordChar C.TextAlign D.Multiline (11)所有控件都一定具有的属性是(D) A.Text B.BackColor C.Items https://www.doczj.com/doc/fe13974911.html, (12)当用户鼠标左键单击窗体或控件系统将触发(D)事件 A.Activated B.Load C.DoubleClick D.Click (13)用户修改了文本框中的内容时,系统将触发(A)事件。 A.xtChanged B.CheckedChanfed C.SelectedIndexChanged D.SizeChanged (14)在列表框或组合框中,当用户重新选择另一个选项时,系统将触发(C)事件。A.TextChanged B.CheckedChanged C.SelectedIndexChanged D.SizeChanged (15)有关模态对话框说法错误的是(A) A.模态对话框允许用户单击该对话框之外的区域 B.模态对话框通常没有最大化、最小化按钮 C.模态对话框使用ShowDialog方法显示 D.模态对话框不能使用鼠标改变窗体大小 (16)当复选框能够显示2种状态时,可通过它的(C)属性来设置或返回复选框的状态。 A.Enabled B.Visible C.Checked D.Text (17)要使用ListBox控件多选的情况下,可使用它的(A)属性设置为true。 A.SelectionMode B.SelectedItem C.SelectedValue D.ImeMode (18)在允许ListBox控件多选的情况下,可以使用它的(B)属性值来访问已选中的选项。 A.SelectionMode B.SelectedItem C.SelectedValue D.SelectedIndex (19)要使PictureBox中显示的图片刚好填满整个图片框,应把它的(D)属性值设为PictureBoxSizeMode.StretchImage。 A.Enabled B.Visible C.ImageLocation D.SizeMode (20)Timer控件的(A)属性用来是指定时器Tick事件发生的时间间隔

常见的模具结构形式有哪几种

木构建筑体系是中国古代建筑文化的精华部分。大多数中国古代建筑是以木构架为主,构成富有弹性的框架。常用的有抬梁、穿斗、干阑、井干四种比较基本的结构方式。 抬粱式构架,又称“叠粱式构架”,是中国古代建筑中普遍的木构架形式,它是在柱子子上放粱、粱上放短柱、短柱上放短粱,层层叠落直至屋脊,各个粱头上再架檩条以承托屋椽的形式。抬粱式结构复杂,要求加工细致,但结实牢固,经久耐用,且内部有较大的使用空间,同时,还能产生宏伟的气势,又可做出美观的造型。《营造法式》中将抬梁式木构架分成殿堂式和厅堂式两种结构。 A.柱上搁置梁头,梁头上搁置檩条,梁上再用矮柱支起较短的梁; B.当柱上采用斗栱时,梁头搁置于斗栱上。 穿斗式构架是中国古代建筑木构架的一种形式,这种构架以柱直接承檩,没有梁,原作穿兜架,后简化为“穿逗架”。穿斗式构架以柱承檩的作法,可能和早期的纵架有一定渊源关系,已有悠久的历史。在汉代画像石中就可以看到汉代

穿斗式构架房屋的形象。 A.用穿枋把柱子串联起来,形成一榀榀的房架; B.檩条直接搁置在柱头上; C.沿檩条方向,再用斗枋把柱子串联起来。 干栏式木构架是先用柱子在底层做一高台,台上放梁、铺板,再于其上建房子。这种结构的房子高出地面,可以避免地面湿气的侵入。但是后期的干栏式木构架实际上是穿斗的形式,只不过建筑底层架空,不封闭而已。 井干式构架,是指用天然圆木或方形、矩形、六角形等断面的木料层层垒且,构成房屋的壁体,因类似古代井干(井台的木栏)而名。井干也是一种早期的结构形式。在殷商时期的基葬已见有采用这种井干式结构的木撑,文献记汉代宫苑中有所谓井干楼,可以叠至百层。至于井干式结构的房屋,据云南晋宁石寨山西汉时期演国遗址墓葬出土的青铜鉴建筑模型及图像所示,既可直接建于地上,也可像穿斗式构架一样建于干栏式木架之上。井千式构架对木料的使用显然是很费的,所以至今只在东北、云南等少数森林地区以及某些特定的建筑如粮仓上,还保持这种建筑方式,但在工艺上也有很多改进,如一般已不用圆木而改用长方形截面的方木或厚木板,结合的神卯做得很精致,可以随时拆卸、拼装,等等。 这四类木结构中,抬梁式木结构能体现出中国古代传统建筑营造精髓,也是我们了解复习的重点,后续的内容中也会带大家补充学习。

对话框

Windows编程基础 东软人才实训中心 Copyright 2010 By Neusoft Group. All rights reserved 1

本课程旨在向学员介绍: 1)对话框和对话框类2)模式对话框 3)无模式对话框 4)属性页对话框 5)通用对话框时间:学时6 教学方法:讲授+课上练习+课下作业 第四章对话框 2

3 ?Windows 应用程序的基本工作流程是从用户那里得到数据,经过相应的处理后,再把计算结果输出到屏幕或打印机。获取数据的方法会涉及很重要的界面对象-对话框。?首先学习对话框应用程序的好处: –它比基于文档/视图应用程序更易于理解 –涉及的类少,但与文档/视图应用程序有相同的威力。 学习对话框的重要性

4 ?主要有以下两种 –模态(Modal)对话框,必须首先响应这个对话框才可以进行其他动作。 –非模态(Modaless)对话框,用户可以操作该程序的其他窗口。 对话框的类型

CDialog类 ?CDialog类从CWnd类派生而来,所以它继承了CWnd类的成员函数,具有CWnd类的基本功能,可以编写代码移动、显示或隐藏对话框,并能根据对话框的特点增加新的成员函数,扩展它的功能。 CObject CmdTarget CWnd CDialog 5

6 对话框类相关成员函数 用于关闭对话框窗口 CDialog::EndDiaolg()响应WM_INITDIALOG 消息CDialog::OnInitDialog() 单击取消或Esc 调用该函数,内部调用EndDialog()CDialog::OnCancel() 单击OK 按钮调用该函数,内部调用EndDialog()CDialog::OnOK() 根据对话框模板资源创建非模态对话框CDialog::Create() 激活模态对话框,显示对话框窗口直到该窗口关闭返回CDialog::DoModal() 功能描述成员函数

第11章 用户界面设计

第11章用户界面设计 人机交互活动的大量存在于计算机运行的整个过程当中。目前的应用软件 都采用图形界面用以交互,图形界面的研究也成为了许多软件开发机构的课 题。本章内容主要包括:界面软件设计,设计人机交互子系统,图形用户界面 设计,多媒体用户界面设计。 11.1基础知识 11.1.1 软件面设计 1.可使用行 可使用行是用界面设计最重要的目标。它强调简单,术语标准化和一致 化,拥有完善的帮助功能,系统响应快可系统成本低,具有良好的容错能力。 2.灵活行 灵活行包括:算法可隐可现,界面方式可由用户动态制定和修改,提供 不同详细程度的系统响应信息,界面的标准化。 3.复杂行 复杂行是用户界面的规模和组织的复杂程度。在完成预定功能的前提 下,用户界面越简单越好。 4.可靠性 无故障使用的时间越长,改用户界面的可靠性就越高。用户界面应能保 证用户正确,可靠的使用系统,保证有关程序和数据的安全行。 5.用户界面设计存在的问题 用户界面的开发有别于其他软件,无固定结构,其目的和用户的真正需 求相适应。但是用户的意图有时候并不容易表达出来,唯有通过进一步的探索 和咨询的方法来完成。而目前的一部分软件设计者的心目中,存在一些心里障 碍,容易妨碍友好界面的设计: (1)部分软件人员没有从用户的角度去考虑界面设计,没有重视界面的美观和方便。 (2)设计人员习惯单一的抽象思维,希望能自主控制软件的运行,忽略了人机交互,有些开发人员则是懒于设计界面的健壮行,害怕用户的干 预导致程序运行的瘫痪。 (3)软件人员和用户在知识结构上存在差异,程序员不乐于学习用户工作领域的专业知识,忽视了软件的专业行,导致生成的软件不适合用户 的习惯。 11.1.2设计人机交互子系统 1.准则 设计出让用户满意的人机交互界面应遵循如下原则:一致性,操作简单, 及时提供反映信息,提供撤销命令,无需记忆,易学,富有吸引力。 2.策略 用户界面是适应人的需要而建立的,因此需要清楚用户的类型,用户的 特性度量以及对用户的工作进行分析。 173

4 对话框及常用控件 (第四章 对话框和常用控件)

1.什么是对话框?它分为哪两类?这两类对话框有哪些不同? 答:对话框是一种特殊的窗口,主要功能是输出信息和接收用户的输入。对话框分为有模式对话框和无模式对话框。当一个有模式对话框打开时,用户只能与该对话框进行交互,而其他用户界面对象收不到输入信息。而无模式对话框打开时,用户可以同时打开其他窗口对象,操作完毕后,又可用鼠标或其他方式激活该窗口。 2.什么是对话框模板、对话框资源和对话框类? 答:对话框模板是一个描述对话框的内存结构,用于添加控件及其布局。对话框资源指快捷键、对话框、菜单、字符串、工具栏按钮、图表、版本信息等。对话框类用于实现对话框功能。 3.对一个对话框编程一般经过几个步骤? 答:1. 在资源编辑器中画对话框,添加控件,设定控件位置、大小、ID和其它属性; 2. 定义对话框回调函数,添加控件的事件处理函数; 3. 注册对话框函数 4、什么是控件?根据控件的性质可以将控件分为几类? 答:在Windows中所用的按钮控件是用来实现一种开与关的输入。 常见按钮类型:按键按钮、单选按钮、复选框按钮。 5.向对话框添加一个常用控件的方法有哪些?这些方法是否使用于ActiveX控件? 答:1、先点击控件,然后在对话框上单击, 2、先点击控件,然后在对话框上点住不放,画出像要的大小。 否。 6.什么是DDV/DDX技术?如何使用这种技术? 答:DDX(对话框数据交换)机制用来初始化对话框中的数据,并向应用程序返回数据,它使得用户向对话框加载对象数据和当对话框关闭时恢复其中的数据这两个过程自动化。 DDV(对话框数据验证有效性)机制用于将数据返回成员变量之前将数据的长度和范围有效化。 7.什么是空间的通知消息?它在编程中起哪些作用? 答:控件消息由按钮(BN_)、编辑框(EN_)、组合框(CBN_)和列表框(LBN_)等产生。控件通过向父窗口发送控件通知消息来表明发生了某种事件。

合同形式有哪几种[工作范文]

合同形式有哪几种 篇一:建筑合同价都有哪几种形式 建筑合同价都有哪几种形式 不同承包方式的价格计算不同工程项目的条件和承包内容的不同,往往要求不同类型的合同和包价计算方法。因此,在实践中,合同类型和计价方法就成为划分承包方式的重要依据。 1.固定总价合同的合同价固定总价就是按商定的总价承包工程。它的特点是以图纸和工程说明书为依据,明确承包内容和计算包价,并一笔包死。在合同执行过程中,除非建设单位要求变更原定的承包内容,承包单位一般不得要求变更包价。这种方式对建设单位比较简便,因此为一般建设单位所欢迎。对承包商来说,如果设计图纸和说明书相当详细,能据以比较精确地估算造价,签订合同时考虑得也比较周全,不致有太大的风险,也是一种比较简便的承包方式。如果图纸和说明书不够详细,未知数比较多,或者遇到材料突然涨价以及恶劣的气候等意外情况,承包单位须承担应变的风险;为此,往往加大不可预见费用,因而不利于降低造价,最终是对承包单位不利。这种承包方式通常仅适用于规模较小、技术不太复杂的工程。 2.按量计价合同的合同价按量计价合同以工程量清单

和单价表为计算包价的依据。通常由建设单位委托设计单位或专业估算师(造价工程师或测量师)提出工程量清单,列出分部分项工程量,例如挖土若干立方米,填土夯实若干立方米,混凝土若干立方米,墙面抹灰若干平方米等等,由承包商填报单价,再算出总造价。因为工程量是统一计算出来的,承包商只要经过复核并填上适当的单价就能得出总造价,承担风险较小;发包单位也只要审核单价是否合理即可,对双方都方便。目前国际上采用这种承包方式的较多。在我国,作为工程造价计算方法的改革方向,已开始推行。 3.单价合同的合同价在没有施工详图就需开工,或虽有施工图而对工程的某些条件尚不完全清楚的情况下,既不能比较精确地计算工程量,又要避免凭运气而使建设单位和承包单位任何一方承担过大的风险,采用单价合同是比较适宜的。在实践中,这种承包方式可细分为3种: (1)按分部分项工程单价承包即由建设单位开列分部分项工程名称和计量单位,例如挖土方每立方米、混凝土每立方米、钢结构每吨等等,多由承包单位逐项填报单价;也可以由建设单位先提出单价,再由承包单位认可或提出修订的意见后作为正式报价,经双方磋商确定承包单价,然后签订合同,并根据实际完成的工程数量,按此单价结算工程价款。这种承包方式主要适用于没有施工图、工程量不明即须开工的紧急工程。

政府采购方式有哪几种

遇到行政法问题?赢了网律师为你免费解惑!访问>> https://www.doczj.com/doc/fe13974911.html, 政府采购方式有哪几种 政府采购,是指各级国家机关、事业单位和团体组织,使用财政性资金采购依法制定的集中采购目录以内的或者采购限额标准以上的货物、工程和服务的行为。那么政府采购方式有哪几种? 政府采购方式有哪几种? 1、公开招标 公开招标是政府采购主要采购方式,公开招标与其他采购方式不是并行的关系。 公开招标的具体数额标准,属于中央预算的政府采购项目,由国务院规定;属于地方预算的政府采购项目,由省、自治区、直辖市人民政府规定;因特殊情况需要采用公开招标以外的采购方式的,应当在采购活动开始前获得设区的市、自治州以上人民政府采购监督管理部门的批准。

采购人不得将应当以公开招标方式采购的货物或者服务化整为零或者以其他任何方式规避公开招标采购。 2、邀请招标 邀请招标也称选择性招标,由采购人根据供应商或承包商的资信和业绩,选择一定数目的法人或其他组织(不能少于三家),向其发出招标邀请书,邀请他们参加投标竞争,从中选定中标的供应商。 条件: (1)具有特殊性,只能从有限范围的供应商处采购的; (2)采用公开招标方式的费用占政府采购项目总价值的比例过大的。 2、竞争性谈判 竞争性谈判是指谈判小组与符合资格条件的供应商就采购货物、工程和服务事宜进行谈判,供应商按照谈判文件的要求提交响应文件和最后报价,采购人从谈判小组提出的成交候选人中确定成交供应商的采购方式。

条件: (1)招标后没有供应商投标或者没有合格标的或者重新招标未能成立的; (2)技术复杂或者性质特殊,不能确定详细规格或者具体要求的; (3)非采购人所能预见的原因或者非采购人拖延造成采用招标所需时间不能满足用户紧急需要的; (4)因艺术品采购、专利、专有技术或者服务的时间、数量事先不能确定等原因不能事先计算出价格总额的。 3、单一来源采购 单一来源采购是指采购人从某一特定供应商处采购货物、工程和服务的采购方式。 条件: (1)只能从唯一供应商处采购的;

【初学VC讲稿】第5篇:对话框应用简单示例

今天我们来学习对话框的编程 【知识要点】(参考《Visual C++ 技术内幕》) 1,模式对话框(Modal dialog box):打开后直至关闭期间不可在应用程序的其它位置工作。非模式对话框(Modalless dialog box):打开后直至关闭期间可在应用程序的其它位置工作。2,对话框编程的一般步骤 (1)用对话框编辑器创建包含各种控件的对话框资源。对话框编辑器会对项目的资源文件进行更新使之包含新的对话框资源,并且该项目的resource.h文件也会被更新,以便能包含新的#define常量。 (2)利用ClassWizard创建Cdialog的派生类,并将它同第一步创建的资源相连接。ClassWizard会自动在Developer Studio的项目中加入相应的代码和头文件。 (3)利用ClassWizard向对话框类中加入数据成员、交换函数和确认函数。 (4)利用ClassWizard向对话框中的按钮和其它可产生事件的控件加入响应的消息控制函数。 (5)对一些特殊的控件初始化函数(如OnInitDialog)及消息控制函数进行编辑。当用户关闭对话框时别忘了调用CDialog的虚成员函数OnOK(除非用户取消了该对话框)。(说明:OnOK 是以默认方式调用的。) (6)对视图类的代码进行编辑,以便对话框能够被激活。即要调用对话框。 3,对话框的调用 假设对话框的ID为IDD_MYDLG,创建的对话框类名为CMyDlg,则 (1)模式对话框的调用 CMyDlg m_dlg;//声名CMyDlg类的一个对象 m_dlg.DoModal();//现实模式对话框 (2)非模式对话框的调用 <1>在视图类的头文件中添加CMyDlg类的指针变量: CMyDlg* m_pDlg; <2>在试图类的构造函数中将其初始化: m_pDlg = NULL; <3>在调用函数中添加如下代码: if(m_pDlg==NULL)//如果指针为NULL说明对话框还没有创建,那就创建吧 { m_pDlg = new CMyDlg; m_pDlg->Create(IDD_MYDLG,this); } m_pDlg->ShowWindow(SW_SHOW);//显示非模式对话框 <4>在视图类的析构函数中释放内存空间 if(m_pDlg!=NULL) { ` delete m_pDlg;//千万不能忘了!!! }

组态王6.5使用手册 第14章 控件(共101页 34~73页)

第十四章控件 14.2.8 超级文本显示控件 组态王提供一个超级文本显示控件,用于显示RTF格式或TXT格式的文本文件,而且也可在超级文本显示控件中输入文本字符串,然后将其保存成指定的文件,调入RTF、TXT格式的文件和保存文件通过超级文本显示控件函数来完成。 14.2.8.1 如何创建超级文本显示控件 在画面开发系统的工具箱中选择“插入控件”按钮,或选择菜单“编辑/插入控件”命令,在弹出的如图14.2所示的“创建控件”对话框中,在种类列表中选择“超级文本显示”,在右侧的内容中选择“显示框”图标,单击对话框上的“创建”按钮,或直接双击“显示框”图标,关闭对话框。此时鼠标变成小“十” 字形,在画面上需要插入控件的地方按下鼠标左键,拖动鼠标,画面上出现一个矩形框,表示创建后控件界面的大小。松开鼠标左键,控件在画面上显示出来。 如图14.32所示。控件周围有带箭头的小矩形框,鼠标挪到小矩形框上,鼠标箭头变为方向箭头时,按下鼠标左键并拖动,可以改变控件的大小。当鼠标在控件上变为双“十”字型时,按下鼠标左键并拖动,可以改变控件的位置。

图14.32 创建后的超级文本显示框控件 14.2.8.2 如何定义超级文本显示控件的属性 控件创建完成后,需要定义空间的属性。用鼠标双击控件,弹出超级文本显示框控件属性对话框,如图14.33所示。 图14.33 超级文本显示框控件属性对话框 超级文本显示框控件属性: ◆控件名称:定义控件的名称,一个显示框控件对应一个控件名称, 而且是唯一的,不能重复命名,控件的命名应该符合组态王的命名 规则。如“Richtxt1”。 ◆访问权限:定义控件的安全级别——访问权限,范围为1~999。定

常用的培训员工有哪几种形式

常用的培训员工有哪几种形式?各个形式都有哪些特点? (1)讲授法:属于传统的培训方式,优点是运用起来方便,便于培训者控制整个过程。缺点是单向信息传递,反馈效果差。常被用于一些理念性知识的培训。(2)视听技术法:通过现代视听技术(如投影仪、DVD、录像机等工具),对员工进行培训。优点是运用视觉与听觉的感知方式,直观鲜明。但学员的反馈与实践较差,且制作和购买的成本高,内容易过时。它多用于企业概况、传授技能等培训内容,也可用于概念性知识的培训。(3)讨论法:按照费用与操作的复杂程序又可分成一般小组讨论与研讨会两种方式。研讨会多以专题演讲为主,中途或会后允许学员与演讲者进行交流沟通。优点是信息可以多向传递,与讲授法相比反馈效果较好,但费用较高。而小组讨论法的特点是信息交流时方式为多向传递,学员的参与性高,费用较低。多用于巩固知识,训练学员分析、解决问题的能力与人际交往的能力,但运用时对培训教师的要求较高。(4)案例研讨法:通过向培训对象提供相关的背景资料,让其寻找合适的解决方法。这一方式使用费用低,反馈效果好,可以有效训练学员分析解决问题的能力。另外,近年的培训研究表明,案例、讨论的方式也可用于知识类的培训,且效果更佳。(5)角色扮演法:授训者在培训教师设计的工作情况中扮演其中角色,其他学员与培训教师在学员表演后作适当的点评。由于信息传递多向化,反馈效果好、实践性强、费用低,因而多用于人际关系能力的训练。(6)自学法:这一方式较适合于一般理念性知识的学习,由于成人学习具有偏重经验与理解的特性,让具有一定学习能力

与自觉的学员自学是既经济又实用的方法,但此方法也存在监督性差的缺陷。(7)互动小组法:也称敏感训练法。此法主要适用于管理人员的人际关系与沟通训练。让学员在培训活动中的亲身体验来提高他们处理人际关系的能力。其优点是可明显提高人际关系与沟通的能力,但其效果在很大程度上依赖于培训教师的水平。(8)网络培训法:是一种新型的计算机网络信息培训方式,投入较大。但由于使用灵活,符合分散式学习的新趋势,节省学员集中培训的时间与费用。这种方式信息量大,新知识、新观念传递优势明显,更适合成人学习。因此,特别为实力雄厚的企业所青睐,也是培训发展的一个必然趋势。 企业培训方法 企业培训的效果在很大程度上取决于培训方法的选择,当前,企业培训的方法有很多种,不同的培训方法具有不同的特点,其自身也是各有优劣。要选择到合适有效的培训方法,需要考虑到培训的目的、培训的内容、培训对象的自身特点及企业具备的培训资源等因素。下面我把企业培训常用的8种方法的特点和适用范围给大家做一介绍,供大家参考。 ●讲授法:属于传统模式的培训方式,指培训师通过语言表达,系统地向受训者传授知识,期望这些受训者能记住其中的重要观念与特定知识。 【要求】培训师应具有丰富的知识和经验;讲授要有系统性,条理

SAP常用对话框应用

1. Dialog box for confirming processing step (CONFIRM, POPUP) CALL FUNCTION 'POPUP_TO_CONFIRM_STEP' EXPORTING textline1 = text-006 titel = text-005 IMPORTING answer = t_code. CHECK t_code = 'J'. 2. Dialog box for confirming processing step: With diagnosis text CALL FUNCTION 'POPUP_TO_CONFIRM_WITH_MESSAGE' EXPORTING titel = text-100 diagnosetext1 = text diagnosetext2 = text-102 textline1 = text-103 defaultoption = 'Y' IMPORTING answer = answer. IF answer = 'A' OR answer = 'N'. ELSEIF answer = 'J'. ENDIF.

3. Dialog box for choosing from a list without diagnosis(提供選擇列表供用戶選擇) * 填充選項列表: selectlist-varoption = 'A. Wal Mart'. APPEND selectlist. selectlist-varoption = 'B. COLE'. APPEND selectlist. selectlist-varoption = 'C. Private lable'. APPEND selectlist. * 顯示列表dialog供用戶選擇 CALL FUNCTION 'POPUP_TO_DECIDE_LIST' EXPORTING mark_flag = 'X' mark_max = 0 textline1 = '請選擇執行標准' titel = '請選擇執行標准:' TABLES t_spopli = selectlist EXCEPTIONS not_enough_answers = 1 too_much_answers = 2 too_much_marks = 3

表达方式有哪几种

表达方式有哪几种 Prepared on 22 November 2020

表达方式有哪几种 有五种 1、记叙 2、说明 3、议论 4、描写 5、抒情 修辞手法: 比喻、拟人、夸张、排比、对偶、反复、设问、反问,引用、对比、借代、反语,顶真 记叙文记事六要素,第一要素是时间,年、月、日、时写清楚;第二要素是地点,要写环境和住处。第三要素是人物,不写人物是糊涂, 第四要素是原因,为何发生找原因;第五要素是经过,来龙去脉写清楚;第六要素是结果,交代结局别含糊。 记叙的顺序一般可分为顺叙、倒叙、插叙。 关于表现手法:托物言志写景抒情叙事抒情直抒胸臆对比衬托卒章显志象征衬托想象联想照应寓情于景反衬烘托托物起兴美景衬哀情渲染虚实结合点面结合动静结合伏笔照应托物言志设置悬念渲染环境侧面描写正面描写直接抒情间接抒情等,借物喻人欲扬先抑欲抑先扬顺叙倒叙插用典照应; 常见的说明方法有、、、、、、、、、、作假设这11种。 说明顺序有哪几种1、时间顺序:2、空间顺序:3、逻辑顺序::①从主到次②从简单到复杂③从概括到具体④从整体到局部⑤从现象到本质⑥从结果到原因 人物描写的基本方法可分为四种:外貌描写、语言描写、行动描写、和神态描写。 二、在鉴赏阅读中,表达技巧包括: 1、表达方式:、说明、议论、抒情、描写。 2、表现手法:想象、联想、、、、、、、抑扬、用典等。 3、材料安排:主次、详略、繁简。 4、结构:承上启下、悬念、照应、铺垫等。 5、修辞手法:比喻、、、、、比拟、、夸张等 景物描写的角度:视觉角度、味觉角度、听觉角度、触觉角度、感觉角度等 不必说碧绿的菜畦(视觉),光滑的石井栏(触觉),高大的皂荚树,紫红的桑椹;也不必说鸣蝉在树叶里长吟(听觉),肥胖的黄蜂伏在菜花上,轻捷的叫天子忽然从草间直窜向云霄里去了。单是周围的短短的泥墙根一带,就有无限趣味(感觉),油岭在这里低唱,蟋蟀们在这里弹琴(听觉)。如果不怕刺,还可以摘到覆盆子,像小珊瑚珠攒成的小球,又酸又甜(味觉)。

股权投资的形式有哪几种

股权投资的形式有哪几种 1、征收耕地补偿标准,旱田平均每亩补偿5.3万元。 2、征收基本农田补偿标准,旱田平均每亩补偿5.8万元。 3、征收林地及其他农用地平均每亩补偿13.8万元。 4、征收工矿建设用地、村民住宅、道路等集体建设用地平均每亩补偿13.6万元。 5、征收空闲地、荒山、荒地、荒沟和未利用地平均每亩补偿2.1万元。 通常情况下我们接触到的股权投资,就是指企业或者个人购买其他企业的股票或者以其他形式投资其他单位。其最终目的是为了获得经济利益。简单地说,那么股权投资的形式有几种?下面我们来了解一下股权投资的形式的相关内容。 一、主要内容 股权投资通常是为长期(至少在一年以上)持有一个公司的股票或长期的投资一个公司,以期达到控制被投资单位,或对被投资单位施加重大影响,或为了与被投资单位建立密切关系,以分散经营风险的目的。[1]

如被投资单位生产的产品为投资企业生产所需的原材料,在市场上这种原材料的价格波动较大,且不能保证供应。在这种情况下,投资企业通过所持股份,达到控制或对被投资单位施加重大影响,使其生产所需的原材料能够直接从被投资单位取得,而且价格比较稳定,保证其生产经营的顺利进行。 但是,如果被投资单位经营状况不佳,或者进行破产清算时,投资企业作为股东,也需要承担相应的投资损失。股权投资通常具有投资大、投资期限长、风险大以及能为企业带来较大的利益等特点。股权投资的利润空间相当广阔,一是企业的分红,二是一旦企业上市则会有更为丰厚的回报。同时还可享受企业的配股、送股等等一系列优惠措施。 二、分类 (1)控制,是指有权决定一个企业的财务和经营政策,并能据以从该企业的经营活动中获取利益。 (2)共同控制,是指按合同约定对某项经济活动所共有的控制。 (3)重大影响,是指对一个企业的财务和经营政策有参与决策的权力,但并不决定这些政策。 (4)无控制、无共同控制且无重大影响。 三、核算方法

违约责任的形式有哪几种

遇到合同法问题?赢了网律师为你免费解惑!访问>> https://www.doczj.com/doc/fe13974911.html, 违约责任的形式有哪几种 核心内容:违约责任的形式有继续履行、采取补救措施、违约金责任、违约金责任、定金责任和损害赔偿。下面赢了网合同法栏目为您详细介绍。 (一)继续履行 继续履行主要适用于拒绝履行和迟延履行的情形。 (1)金钱债务无条件适用继续履行。金钱债务只存在迟延履行,不存在履行不能,因此,应无条件适用继续履行的责任形式。 (2)对非金钱债务,原则上可以请求继续履行,但下列情形除外: ①法律上或者事实上不能履行(履行不能),如买卖房屋的合同房屋灭失的。

②强制履行费用过高。 ③债务的标的不适用强制履行,如提供劳务的合同。 ④没有在合理期限内提出实际履行的要求 (二)采取补救措施 补救措施适用于不完全履行的情形,其主要方式有:修理、更换、重作、退货、减少价款或者报酬等。 (三)违约金责任 1.概念 违约金是依据合同约定当事人一方违反合同时应当向对方支付 的一定数量的金钱或财物。(须在合同中预先约定) 2.违约金的调整 (1)约定的违约金过分高于造成的损失的,当事人可以请求人民

法院或者仲裁机构予以适当减少; (2)约定的违约金低于造成的损失的,当事人可以请求人民法院或者仲裁机构予以增加。 (四)定金责任 合同法第115条规定:当事人可以依照担保法约定一方向对方给付定金作为债权的担保。债务人履行债务后,定金应当抵作价款或者收回。给付定金的一方不履行约定的债务的,无权要求返还定金;收受定金的一方不履行约定的债务的,应当双倍返还定金。 定金是合同的一种担保方式,由《担保法》来规定。对于定金,应注意的是: 第一,定金合同是实践性合同,如果没有实际交付定金,定金合同不生效,不能适用定金罚则。 第二,根据担保法的规定,定金的数额不得超过合同总价款的20%;如果定金数额超过合同总价款的20%,超过部分无效。 第三,实际交付的定金与约定的数额不一致的,以实际交付的数

相关主题
文本预览
相关文档 最新文档