merhabalar. İntelliCAD'de exe içindeki olaylardan haberdar olmak CALLBACK olarak tabir ediliyor.
Bununla ilgili bir örnek aşağıda mevcuttur.
<pre id=code><font face=courier size=2 id=code>
//IntelliCAD callback fonksiyonlarına örnek kod.
//Komut tanımları
static struct func_def func_table[] = {
// command:(dynssget)
{"dynssget" , dynssget},
// command:dynssget
{"c:dynssget" , dynssget},
};
sds_name g_ssname; //Seçim seti (Global)
//Mouse' un altında kalan nesneleri highlight yapar.
static int dynssget(struct sds_resbuf *rb)
{
int ret;
struct sds_resbuf resb;
sds_ssfree(g_ssname);//
sds_printf("Mouse'u hareket ettirerek nesneleri seç\n");
ret=sds_ssadd(NULL,g_ssname,NULL);
//Callback'i başlat
//Fonksiyonun bu kısmından itibaren
sds_setcallbackfunc(cbfunc);
char string1[512];
ret=sds_getstring(0,"\nHit [Enter] when done: ",string1);
if(ret==RTNORM){
sds_getvar("CMDNAMES", &resb);
if(strcmp(resb.resval.rstring,"C:DYNSSGET")==0)
{//Şayet komut olarak girilmişse
//(command:move,"selctionset" (dynssget))
resb.restype=SDS_RTPICKS;
sds_name_set(g_ssname, resb.resval.rlname);
sds_putsym ("SELECTION", &resb);
sds_retvoid();
}
else
//Şayet fonksiyon olarak çağrılmışsa (Setq g_ssname (DYNSSGET))
sds_retname(g_ssname, SDS_RTPICKS);
}
else
sds_retnil();//seçim seti yok
//Callback nesnesini boşaltır.
sds_setcallbackfunc(cbfunc2);
return RTNORM;
}
int cbfunc(int flag,void *arg1,void *arg2,void *arg3)
{
sds_point pt;
sds_name ssname,ename;
switch (flag) {
//mouse move' da iken mouse koordinatlarını UCS ye göre verir.
case SDS_CBMOUSEMOVEUCS:
pt[0]=*(double *)arg1;pt[1]=*(double *)arg2;pt[2]=* (double *)arg3;
if(sds_ssget (NULL, pt, NULL, NULL, ssname)==RTNORM){
sds_ssname (ssname, 0, ename);
//seçilen nesneyi seçim setine ekle
sds_ssadd(ename,g_ssname,g_ssname);
//nesneyi kesikli çiz
sds_redraw (ename, 3);
sds_ssfree(ssname);
}
break;
default:
break;
}
return RTNORM;
}
//Boş fonksiyon
int cbfunc2(int flag,void *arg1,void *arg2,void *arg3)
{
return RTNORM;
}
</font id=code></pre id=code>
|