long WINAPI SysThread(sSysThreadHelper* p) { lphp_vparam vp; mb_event mbe = {MBT_CALLBACK,0}; char cb[32]; mbe.php = p->php; strncpy(cb,p->cb,sizeof(cb)-1); //make a copy of vp vp = p->vp; if(vp.type == LPHP_STRING){ vp.data = strdup((const char*)vp.data); } sman_incref(mbe.php); SetEvent(p->hEvent); MBMultiParam(mbe.php,cb,&mbe,"v",&vp); sman_decref(mbe.php); if(vp.type == LPHP_STRING){ my_memfree(vp.data); } return 0; }
BOOL CALLBACK DlgProcedure(HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam) { sDialog* dlg = (sDialog*)GetWindowLong(hDlg,GWL_USERDATA); PHPR res; if((uMsg != WM_INITDIALOG && uMsg != (WM_USER + 2)) && (!dlg || (dlg->hDlg != hDlg) || (dlg->lDepth > 0) || !(dlg->lFlags))){ return (FALSE); } if(dlg){dlg->lDepth++;} switch(uMsg) { case WM_INITDIALOG: SetWindowLong(hDlg,GWL_USERDATA,lParam); dlg = (sDialog*)lParam; sman_inc(dlg->php); return (TRUE); case (WM_USER + 2): { RECT rc; RECT drc; HWND hButton; //move the OK & CANCEL buttons GetClientRect(hDlg,&drc); hButton = GetDlgItem(hDlg,IDCANCEL); GetClientRect(hButton,&rc); SetWindowPos(hButton,NULL,drc.right - 10 - 2*(rc.right - rc.left),drc.bottom - 5 - (rc.bottom - rc.top), 0,0,SWP_NOZORDER | SWP_NOSIZE); hButton = GetDlgItem(hDlg,IDOK); GetClientRect(hButton,&rc); SetWindowPos(hButton,NULL,drc.right - 5 - (rc.right - rc.left), drc.bottom - 5 - (rc.bottom - rc.top),0,0,SWP_NOZORDER | SWP_NOSIZE); } break; case (WM_USER + 3): DestroyWindow(hDlg); sman_dec(dlg->php); DlgFree(dlg); SetWindowLong(hDlg,GWL_USERDATA,0); return (TRUE); case WM_CLOSE: wParam = IDCANCEL; lParam = (LPARAM)GetDlgItem(dlg->hDlg,IDCANCEL); case WM_COMMAND: { UINT uid = LOWORD(wParam); UINT ncode = HIWORD(wParam); if((uid == IDOK || uid == IDCANCEL) && ncode == BN_CLICKED) { mb_event mbe={MBT_DIALOG,wParam,lParam,0}; mbe.php = dlg->php; mbe.t3 = MBE_DIALOGCB; mbe.p3 = (void*)dlg; res = (PHPR)MBMultiParam(mbe.php,dlg->pszCallback,&mbe,"lll",(uid==IDOK),dlg->param,0); if(res == PHPR_BREAK || res == PHPR_END){ PostMessage(hDlg,WM_USER + 3,0,0); } break; } else if(uid >= 1000 && uid < (dlg->lNum + 1000)) { sDlgControl* dc = dlg->table[uid - 1000]; ULONG tmp = GetTickCount(); if(((uid == dlg->lid) && (tmp - dlg->ltc < 250)) || dc->pszCallback[0]=='\0'){ break; } mb_event mbe={MBT_DIALOG,wParam,lParam,0}; mbe.php = dlg->php; mbe.t3 = MBE_DIALOGCB; mbe.p3 = (void*)dlg; mbe.lFlags = MBOT_FLAG_NOOUTPUT; if(dc->type == 2 && ncode==BN_CLICKED){//button res = (PHPR)MBMultiParam(dlg->php,dc->pszCallback,&mbe,"ll",uid,dc->param); if(res == PHPR_END){ PostMessage(hDlg,WM_USER + 3,0,0); } } else if(dc->type == 4 && ncode == CBN_SELENDOK) { res = (PHPR)MBMultiParam(dlg->php,dc->pszCallback,&mbe,"ll",uid,dc->param); if(res == PHPR_END){ PostMessage(hDlg,WM_USER + 3,0,0); } } else if(*dlg->pszWmCommand) { res = (PHPR)MBMultiParam(dlg->php,dlg->pszWmCommand,&mbe,"llll",uid,dc->param,wParam,lParam); if(res == PHPR_END){ PostMessage(hDlg,WM_USER + 3,0,0); } } dlg->lid = uid; dlg->ltc = GetTickCount(); } break; } break; case WM_NOTIFY: if(wParam >= 1000 && (wParam < (dlg->lNum + 1000)) && (((LPNMHDR)lParam)->code == NM_RCLICK || ((LPNMHDR)lParam)->code == NM_CLICK)) { LVITEM lvi = {0}; sDlgControl* dc = dlg->table[wParam - 1000]; if(!dc || dc->type != 6 || !(*dc->pszCallback))break; mb_event mbe={MBT_DIALOG,wParam,lParam,0}; mbe.php = dlg->php; mbe.t3 = MBE_DIALOGCB; mbe.p3 = (void*)dlg; mbe.lFlags = MBOT_FLAG_NOOUTPUT; res = (PHPR)MBMultiParam(dlg->php,dc->pszCallback,&mbe,"llll",wParam,dc->param, ((LPNMLISTVIEW)lParam)->iItem, ((LPNMHDR)lParam)->code == NM_RCLICK); if(res == PHPR_END){ PostMessage(hDlg,WM_USER + 3,0,0); } } else if(*dlg->pszWmNotify && ((LPNMHDR)lParam)->idFrom >= 1000) { mb_event mbe={MBT_DIALOG,wParam,lParam,0}; mbe.php = dlg->php; mbe.t3 = MBE_DIALOGCB; mbe.p3 = (void*)dlg; mbe.lFlags = MBOT_FLAG_NOOUTPUT; res = (PHPR)MBMultiParam(dlg->php,dlg->pszWmNotify,&mbe,"llll",((LPNMHDR)lParam)->idFrom, dlg->param,wParam,lParam); if(res == PHPR_END){ PostMessage(hDlg,WM_USER + 3,0,0); } } break; case WM_TIMER: { if(*dlg->pszWmTimer){ mb_event mbe={MBT_DIALOG,wParam,lParam,0}; mbe.php = dlg->php; mbe.t3 = MBE_DIALOGCB; mbe.p3 = (void*)dlg; mbe.lFlags = MBOT_FLAG_NOOUTPUT; res = (PHPR)MBMultiParam(dlg->php,dlg->pszWmTimer,&mbe,"llll",wParam, dlg->param,wParam,lParam); if(res == PHPR_END){ PostMessage(hDlg,WM_USER + 3,0,0); } } }break; case WM_DESTROY: sman_dec(dlg->php); DlgFree(dlg); SetWindowLong(hDlg,GWL_USERDATA,0); return (TRUE); default: dlg->lDepth--; return (FALSE); }; dlg->lDepth--; return (TRUE); }