The following description uses the first syntax. The class has two events, onclick and ondoubleclick:
PBXEXPORT LPCTSTR PBXCALL PBX_GetDescription() { static const TCHAR desc[] = { "class visualext from userobject\n" "event int onclick()\n" "event int ondoubleclick()\n" "subroutine setcolor(int r, int g, int b)\n" "subroutine settext(string txt)\n" "end class\n" }; return desc; }
The code in the extension captures the Windows messages that cause the window to be drawn, as well as mouse clicks and double clicks:
LRESULT CALLBACK CVisualExt::WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { CVisualExt* ext = (CVisualExt*)::GetWindowLong(hwnd, GWL_USERDATA); switch(uMsg) { case WM_CREATE: return 0; case WM_SIZE: return 0; case WM_COMMAND: return 0; case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hwnd, &ps); RECT rc; GetClientRect(hwnd, &rc); LOGBRUSH lb; lb.lbStyle = BS_SOLID; // Get color using the visual class’s GetColor method lb.lbColor = ext->GetColor(); HBRUSH hbrush = CreateBrushIndirect(&lb); HBRUSH hbrOld = (HBRUSH)SelectObject(hdc, hbrush); Rectangle(hdc, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top); SelectObject(hdc, hbrOld); DeleteObject(hbrush);
// Get text using the visual class’s GetText method DrawText(hdc, ext->GetText(), ext->GetTextLength(), &rc, DT_CENTER|DT_VCENTER|DT_SINGLELINE); EndPaint(hwnd, &ps); } return 0; // Trigger event scripts in the PowerBuilder application case WM_LBUTTONUP: ext->TriggerEvent("onclick"); break; case WM_LBUTTONDBLCLK: ext->TriggerEvent("ondoubleclick"); break; } return DefWindowProc(hwnd, uMsg, wParam, lParam); }
The following is the TriggerEvent method that triggers the Onclick and Ondoubleclick events:
void CVisualExt::TriggerEvent(LPCTSTR eventName) { pbclass clz = d_session->GetClass(d_pbobj); pbmethodID mid = d_session->GetMethodID(clz, eventName, PBRT_EVENT, "I"); PBCallInfo ci; d_session->InitCallInfo(clz, mid, &ci); d_session->TriggerEvent(d_pbobj, mid, &ci); d_session->FreeCallInfo(&ci); }