
第一步:添加一个按钮
1、首先在**View.h中定义一个按钮标识
#define ID_BUTTON 100
2、 其次给C**View类添加一个成员变量
CButton m_myButton //这条语句写在**View.h的类的定义中,要声明为PUBLIC类型
3、然后创建按钮实例
m_myButton.Create(_T("示例按钮"), //按钮的caption属性,按钮的显示
WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|BS_ICON, // 按钮也是一种窗体,同样有窗体风格,这些常量通过或运算使按钮达到一定的效果,这些常量的含义可以参考MSDN。
CRect(20,320,50,340), //这个参数指出按钮在视图中的位置和按钮的大小。
this, //这个指针指向按钮这个窗体的父窗体
ID_BUTTON) //这是刚才为按钮定义的常量,按钮的控制ID
4、然后调用函数m_MyButton.ShowWindow(SW_HIDE)这个函数根据参数的样式显示按钮,此时的参数表示隐藏按钮,如果要显示按钮,可以以SW_SHOW作为参数,这样,就是在想用到按钮的时候调用函数m_MyButton.ShowWindow(SW_SHOW)显示出按钮。
说明:按钮在C**View::OnCreate()函数中初始化。这个函数是当窗体被创建的时候调用的一个初始化函数。像按钮这样的对象在这个时候初始化是比较合适的。
int C**View::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1
m_MyButton.Create(_T("示例按钮"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|BS_ICON,
CRect(20,320,50,340), this, ID_BUTTON)
m_MyButton.SetIcon(AfxGetApp()->LoadIcon(ICON_SAVE)) //给按钮加载一个图标
m_MyButton.ShowWindow(SW_HIDE)
return 0
}
第二步:消息函数
此时的按钮是不能响应任何消息的。下面我们手动添加按钮的消息。
1、声明函数原型
在C**View类的声明中声明一个protected类型的函数
//{{AFX_MSG(CSoftView)
afx_msg void OnMyButton()
//}}AFX_MSG
通常的做法,也是VC6.0向导的做法,会将消息处理函数声明在//{{AFX_MSG(CSoftView)~~~ //}}AFX_MSG标记中,当然,在VS.NET 2003中,我们将看不到这个标记。真正起作用的是afx_msg,它表明随后的函数是一个消息处理函数。
2、函数的实现
下面实现函数,显然,这个函数也是C**View类的一个成员函数,所以在**View.cpp中实现
void C**View::OnMyButton()
{
MessageBox("你点击了我")
}
3、如果这个时候你就运行程序的话,按钮依然不会响应任何事件。因为事件的产生的消息是交给视图的,所以我们需要把消息从视图传给按钮,实现起来很简单,在**View.cpp中找到如下的标记:
BEGIN_MESSAGE_MAP(C**View, CView)
END_MESSAGE_MAP()
在这个标记中写入如下代码:ON_BN_CLICKED(ID_BUTTON, OnMybutton)
这句代码是说,让ID_BUTTON所指的对象响应单击(ON_BN_CLICKED)事件,事件的处理函数是OnMybutton。这是MFC的消息映射机制。对于这个机制,在此不多说,待后续。
到此,一个可以响应单击事件的按钮就创建好了。如果要响应其他事件,可以按照这个方式创建,只需要改动这个过程中的第3步,将ON_BN_CLICKED改成希望响应的消息类型就可以了。
创建继承BaseAdapter并实现其抽象方法的类MyListViewAdapter说明
下面的讲解中,只创建自定义的适配器类,如何使用请参考android中常用控件的使用之ListView
1.创建类MyListViewAdapter
创建类MyListViewAdapter,该类继承BaseAdapter,并实现其抽象方法:
1
2
3
4
int getCount()
Object getItem(int position)
long getItemId(int position)
View getView(int position,View convertView,ViewGroup parent)
getCount需要返回有多少个item,也就是说最会在listview中展示这么多行
getItem需要返回参数position位置的数据
getItemId返回position就行了
2.给MyListViewAdapter类添加成员变量和构造方法
两个成员变量
1
2
List<String>list
Context context
list表示要显示的数据,context变量在生成View对象时需要用到
构造方法:构造方法是为了给两个成员变量赋值
1
2
3
4
public MyListViewAdapter(List<String>list , Context context) {
this.list = list
this.context = context
}
3.给getCount,getItem,getItemId方法添加代码
getCount需要返回有多少个item,也就是说最会在listview中展示这么多行,所以返回list.size
getItem需要返回参数position位置的数据,也就是list中第position项的值list.get(position)
getItemId返回position就行了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Override
public int getCount() {
return list.size()
}
@Override
public Object getItem(int position) {
return list.get(position)
}
@Override
public long getItemId(int position) {
return position
}
4.给getView方法添加代码
getView方法是返回位置为position的View对象,第二个参数convertView考虑到资源重用问题,在上下滑动的过程中,需要显示某项的时候才会调用getView方法,而如果有某项被隐藏不显示,就会把不显示那一行的View作为convertView参数传入,如果没有某项被隐藏,convertView值为null。可以通过下面代码中的if(convertView!=null)中的输出来看哪一行被隐藏了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Override
public View getView(int position, View convertView, ViewGroup parent) {
System.out.println("调用getView方法,显示position="+position+"项")
if(convertView!=null){
TextView t = (TextView) convertView.findViewById(R.id.firstTextView)
System.out.println(t.getText())
}else{
LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)
convertView = layoutInflater.inflate(R.layout.item_mylistviewadapter, null)
}
TextView t = (TextView)(convertView.findViewById(R.id.firstTextView))
t.setText(list.get(position))
if(position%2==0)
{
t.setBackgroundColor(Color.WHITE)
}
else{
t.setBackgroundColor(Color.GRAY)
}
return convertView
}
补充:通过xml生成View对象
通过Context对象生成一个LayoutInflater对象
调用LayoutInflater对象的inflate方法生成控件对象,inflate方法的第一个参数为xml文件,第二个参数一般为null。返回值为该xml文件最外层的标签对象。
1
2
LayoutInflater layoutInflater =(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)
LinearLayout convertView =(LinearLayout)layoutInflater.inflate(R.layout.item_mylistvie
源代码下载
pan.baidu.com/s/1ntuQDdv
如果你这个对话框是在view的成员函数中d出来的,也就是说在成员函数中声明并DoModal的,可以在DoModal之前直接把this指针传递到对话框对象中的成员函数中。这样在IDOK中进行赋值。假如view类是MyView,对话框类MyDlg,在MyView的成员函数fun()中d出对话框,一般的例子如下:class CMyView
class CMyDlg : public CDialog
{
.......
//下面是增加的定义内容
private:
CMyView *m_pView //接收View类的指针
public:
SetMyView(CMyView *pView) //提供接收view指针的 *** 作
{ m_pView = pView}
}
void CMyView::fun()
{
MyDlg dlg
dlg.SetMyView(this) //将CMyView对象的this指针传递给对话框。
if(dlg.DoModal()==IDOK)
{
//相应的处理过程
}
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)