All,

Below is code from Trevor Garside (reproduced with permission) - it adds a new event _Drag for the splitter control. The downside is that it disables the _Release event. I've tested it and it works (558). If this is included in any new build, the _Release event should be enabled.

Cheers,

jez.


---

   /*
###########################################################################
   # (@)INTERNAL:SplitterMsgLoop(hwnd, uMsg, wParam, lParam)
   # message loop for Win32::GUI::Splitter objects
   */
LRESULT CALLBACK SplitterMsgLoop(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM
lParam)
{
   int PerlResult;
   char Name[MAX_EVENT_NAME];
   HV* self;
   SV** fetching;
   SV* storing;
   long tracking, horizontal, trackpos;
   int min;
   int max;
   POINT pt;
   HWND phwnd;
   HDC hdc;
   RECT rc;
        LPPERLWIN32GUI_USERDATA perlud;

#ifdef PERLWIN32GUI_STRONGDEBUG
   printf("!XS(SplitterMsgLoop) got (%ld, 0x%x, %ld, %ld)\n", hwnd, uMsg,
wParam, lParam);
#endif

   if(uMsg == WM_DESTROY) {
                safefree( (LPPERLWIN32GUI_USERDATA) GetWindowLong(hwnd, 
GWL_USERDATA));
                return DefWindowProc(hwnd, uMsg, wParam, lParam);
        }

#ifdef PERL_OBJECT
pPerl = ((LPPERLWIN32GUI_USERDATA) GetWindowLong(hwnd, GWL_USERDATA))->pPerl;
#endif

   PerlResult = 1;
   strcpy(Name, "main::");
   if(GetObjectName(NOTXSCALL hwnd, Name)) {
       switch(uMsg) {
       case WM_MOUSEMOVE:
        self = HV_SELF_FROM_WINDOW(hwnd);
                        fetching = hv_fetch(self, "-tracking", 9, FALSE);
                        if(SvMAGICAL(self)) mg_get(*fetching);
                        if(fetching != NULL) {
                                tracking = SvIV(*fetching);
                                if(tracking) {
                                        fetching = hv_fetch(self, 
"-horizontal", 11, FALSE);
                                        if(SvMAGICAL(self)) mg_get(*fetching);
                                        if(fetching != NULL && SvOK(*fetching)) 
{
                                                horizontal = SvIV(*fetching);
                                        }
                                        fetching = hv_fetch(self, "-trackpos", 
9, FALSE);
                                        if(SvMAGICAL(self)) mg_get(*fetching);
                                        if(fetching != NULL && SvOK(*fetching)) 
{
                                                trackpos = SvIV(*fetching);
                                        }
                                        /*
                                         * (@)EVENT:Drag(COORD)
                                         * Sent when the Splitter is dragged to 
a new coordinate
                                         * (@)APPLIES_TO:Splitter
                                         */
                                        if(horizontal > 0) {
                                                phwnd = GetParent(hwnd);
                                                GetCursorPos(&pt);
                                                ScreenToClient(phwnd, &pt);
                                                if(trackpos != pt.y) {
                                                        pt.y = 
AdjustSplitterCoord(NOTXSCALL self, pt.y, phwnd);
                                                        
//DrawSplitter(NOTXSCALL hwnd);
                                                        GetClientRect(hwnd, 
&rc);
SetWindowPos(hwnd, NULL, rc.left, pt.y, 0, 0, SWP_NOZORDER | SWP_NOSIZE);
                                                        
//DrawSplitter(NOTXSCALL hwnd);
                                                        if(trackpos != pt.y) {
                                                                storing = 
newSViv((long) pt.y);
                                                                hv_store(self, 
"-trackpos", 9, storing, 0);
                                                                
if(SvMAGICAL(self)) mg_set(storing);
                                                                strcat(Name, 
"_Drag");
                                                                PerlResult = 
DoEvent_Long(NOTXSCALL Name, (long) pt.y);
                                                        }
                                                }
                                        } else {
                                                phwnd = GetParent(hwnd);
                                                GetCursorPos(&pt);
                                                ScreenToClient(phwnd, &pt);
                                                if(trackpos != pt.x) {
                                                        pt.x = 
AdjustSplitterCoord(NOTXSCALL self, pt.x, phwnd);
                                                        
//DrawSplitter(NOTXSCALL hwnd);
                                                        GetClientRect(hwnd, 
&rc);
SetWindowPos(hwnd, NULL, pt.x, rc.top, 0, 0, SWP_NOZORDER | SWP_NOSIZE);
                                                        
//DrawSplitter(NOTXSCALL hwnd);
                                                        if(trackpos != pt.y) {
                                                                storing = 
newSViv((long) pt.x);
                                                                hv_store(self, 
"-trackpos", 9, storing, 0);
                                                                
if(SvMAGICAL(self)) mg_set(storing);
                                                                strcat(Name, 
"_Drag");
                                                                PerlResult = 
DoEvent_Long(NOTXSCALL Name, (long) pt.x);
                                                        }
                                                }
                                        }
                                }
                        }
           break;
       case WM_LBUTTONDOWN:
        self = HV_SELF_FROM_WINDOW(hwnd);
                        storing = newSViv((long) 1);
                        hv_store(self, "-tracking", 9, storing, 0);
                        if(SvMAGICAL(self)) mg_set(storing);
                        fetching = hv_fetch(self, "-horizontal", 11, FALSE);
                        if(SvMAGICAL(self)) mg_get(*fetching);
                        if(fetching != NULL && SvOK(*fetching)) {
                                horizontal = SvIV(*fetching);
                        }
                        if(horizontal > 0) {
                                phwnd = GetParent(hwnd);
                                GetCursorPos(&pt);
                                ScreenToClient(phwnd, &pt);
                                pt.y = AdjustSplitterCoord(NOTXSCALL self, 
pt.y, phwnd);
                                //DrawSplitter(NOTXSCALL hwnd);
                                SetCapture(hwnd);
                        } else {
                                phwnd = GetParent(hwnd);
                                GetCursorPos(&pt);
                                ScreenToClient(phwnd, &pt);
                                pt.x = AdjustSplitterCoord(NOTXSCALL self, 
pt.x, phwnd);
                                //DrawSplitter(NOTXSCALL hwnd);
                                SetCapture(hwnd);
                        }
                        if(horizontal > 0) {
                                phwnd = GetParent(hwnd);
                                GetCursorPos(&pt);
                                ScreenToClient(phwnd, &pt);
                                pt.y = AdjustSplitterCoord(NOTXSCALL self, 
pt.y, phwnd);
                                //DrawSplitter(NOTXSCALL hwnd);
                        } else {
                                phwnd = GetParent(hwnd);
                                GetCursorPos(&pt);
                                ScreenToClient(phwnd, &pt);
                                pt.x = AdjustSplitterCoord(NOTXSCALL self, 
pt.x, phwnd);
                                //DrawSplitter(NOTXSCALL hwnd);
                        }
           break;
                case WM_LBUTTONUP:
                        self = HV_SELF_FROM_WINDOW(hwnd);
                        fetching = hv_fetch(self, "-tracking", 9, FALSE);
                        if(SvMAGICAL(self)) mg_get(*fetching);
//                      if(fetching != NULL) {
//                              tracking = SvIV(*fetching);
//                              if(tracking) {
//                                      fetching = hv_fetch(self, 
"-horizontal", 11, FALSE);
//                                      if(SvMAGICAL(self)) mg_get(*fetching);
//                                      if(fetching != NULL && SvOK(*fetching)) 
{
//                                              horizontal = SvIV(*fetching);
//                                      }
//                                      if(horizontal > 0) {
//                                              phwnd = GetParent(hwnd);
//                                              GetCursorPos(&pt);
//                                              ScreenToClient(phwnd, &pt);
//                                              pt.y = 
AdjustSplitterCoord(NOTXSCALL self, pt.y, phwnd);
//                                              //DrawSplitter(NOTXSCALL hwnd);
//                                              strcat(Name, "_Release");
//                                              PerlResult = 
DoEvent_Long(NOTXSCALL Name, (long) pt.y);
//                                      } else {
//                                              phwnd = GetParent(hwnd);
//                                              GetCursorPos(&pt);
//                                              ScreenToClient(phwnd, &pt);
//                                              pt.x = 
AdjustSplitterCoord(NOTXSCALL self, pt.x, phwnd);
//                                              //DrawSplitter(NOTXSCALL hwnd);
//                                              strcat(Name, "_Release");
//                                              PerlResult = 
DoEvent_Long(NOTXSCALL Name, (long) pt.x);
//                                      }
//                              }
//                      }
                        ReleaseCapture();
                        if(fetching != NULL) tracking = SvIV(*fetching);
                        else tracking = 0;

                        if(tracking) {
                                storing = newSViv((long) 0);
                                hv_store(self, "-tracking", 9, storing, 0);
                                if(SvMAGICAL(self)) mg_set(storing);
                        } else {
                                /*
                                 * (@)EVENT:Click()
                                 * Sent when the Splitter is clicked
                                 * (@)APPLIES_TO:Splitter
                                 */
                                strcat(Name, "_Click");
                                PerlResult = DoEvent_Generic(NOTXSCALL Name);
                        }
                        break;
//              default:
//                      strcat(Name, "_Default");
//                      PerlResult = DoEvent_Long(NOTXSCALL Name, (long) uMsg);
//                      break;
                }
   }
   if(PerlResult == 0) {
       return 0;
   } else {
       return DefWindowProc(hwnd, uMsg, wParam, lParam);
   }
}

_________________________________________________________________
Express yourself with cool emoticons - download MSN Messenger today! http://www.msn.co.uk/messenger


Reply via email to