69,373
社区成员
发帖
与我相关
我的任务
分享
typedef struct {
int a;
void (*set_a)(int val);
} test_t;
void my_set_a(int val)
{
/* 哪里能得到这个指向不同实例的this指针? */
this->a = val;
}
void main(void)
{
test_t test;
test.set_a = my_set_a;
test.set_a(1);
}
#ifndef _Kbd_H
#define _Kbd_H
#include "common.h"
#include "..\G\G.h"
#define KEYS_INPUT_MAX 64
typedef struct Kbd_t CKbd;
struct Kbd_t{
void *pObj; //子类指针
BYTE keys[KEYS_INPUT_MAX];
BYTE index;
BYTE count;
void (*Disp)(CKbd*); //kbd数据显示函数
GCallback completeCallback;
GCallback cancelCallback;
};
//完成数据输入回调
extern void CKbd_CompleteCallback(CKbd *this, GCallbackRequest *request, GObjectClient *client, BYTE event);
//取消数据输入回调
extern void CKbd_cancelCallback(CKbd *this, GCallbackRequest *request, GObjectClient *client, BYTE event);
extern void CKbd_StartGet(CKbd *this, BYTE count);
//初始化函数
extern CKbd* CKbd_Initial(CKbd *this, BYTE count);
#define CKbd_Start(X, Y) CKbd_StartGet((CKbd*)X, (BYTE)Y)
#define CKbd_StartAfterInit(X) CKbd_StartGet((CKbd*)X, (BYTE)0)
#endif
#include "Kbd.h"
#include "SW.h"
#include "..\G\PosToSimulator.h"
extern CSW *pKeySW[];
/*============================内部函数===============================*/
static void KeySWOn(CKbd *this, CSW *pSW)
{
if((pSW->key >= KEY_0) && (pSW->key <= KEY_9)){
if(this->index < this->count){
this->keys[this->index++] = pSW->key;
this->Disp(this);
}
}else if(pSW->key == KEY_CLR){
if(this->index != 0){
this->keys[this->index--] = 0x00;
this->Disp(this);
}
}else if(pSW->key == KEY_ENTER){
if(this->index == this->count){
OnCallback(&this->completeCallback);
}
}else if(pSW->key == KEY_CANCL){
OnCallback(&this->cancelCallback);
}
}
/*============================外部函数===============================*/
void CKbd_CompleteCallback(CKbd *this, GCallbackRequest *request, GObjectClient *client, BYTE event)
{
GCallback_SetCallback(&(this->completeCallback), request, client, event);
}
void CKbd_cancelCallback(CKbd *this, GCallbackRequest *request, GObjectClient *client, BYTE event)
{
GCallback_SetCallback(&(this->cancelCallback), request, client, event);
}
void CKbd_StartGet(CKbd *this, BYTE count)
{
BYTE i = 0;
CKbd_Initial(this, count);
//向按键登陆
for(i = 0;i < KEY_MAX;i++){
CSW_SetOnMethod(pKeySW[i], (void*)this, KeySWOn);
}
}
/*============================构建函数矩阵===============================*/
/*============================初始化函数===============================*/
CKbd* CKbd_Initial(CKbd *this, BYTE count)
{
GCallback_Initial(&this->completeCallback);
GCallback_Initial(&this->cancelCallback);
memset(this->keys, 0x00, KEYS_INPUT_MAX);
this->index = 0;
this->count = count;
return this;
}
void CKbd_Startup(CKbd *this)
{
}
#ifndef _Kbd_Pass_H
#define _Kbd_Pass_H
#include "Kbd.h"
typedef struct Kbd_Pass_t CKbd_Pass;
struct Kbd_Pass_t{
CKbd m_Super;
BYTE disp[3][16]; //界面上第1、3、5行的显示内容
};
//count输入密码长度;dispValue界面上的显示
extern void CKbd_Pass_Start(CKbd *this, BYTE count, BYTE *dispValue);
//初始化函数
extern CKbd* CKbd_Pass_Initial(CKbd_Pass *this);
#endif
#include "Kbd_Pass.h"
#include "..\G\PosToSimulator.h"
/*============================内部函数===============================*/
static void CKbd_Pass_Disp(CKbd *this)
{
BYTE dispBuf[16];
memset(dispBuf, ' ', 16-this->index);
memset(dispBuf+16-this->index, '*', this->index);
disp_cram(dispBuf, LINE7, 16);
}
/*============================外部函数===============================*/
void CKbd_Pass_Start(CKbd *this, BYTE len, BYTE *dispValue)
{
if(dispValue != NULL){
disp_cram(dispValue, LINE1, 16);
disp_cram(dispValue+16, LINE3, 16);
disp_cram(dispValue+32, LINE5, 16);
}
CKbd_Start(this, len);
}
/*============================初始化函数===============================*/
CKbd* CKbd_Pass_Initial(CKbd_Pass *this)
{
CKbd *pObj = (CKbd*)&this->m_Super;
CKbd_Initial(pObj, 8);
memset(this->disp, ' ', sizeof(this->disp));
pObj->Disp = CKbd_Pass_Disp; //设置按建显示函数
return pObj;
}
void CKbd_Pass_Startup(CKbd_Pass *this)
{
}