int iupwinMouseMove(Ihandle* ih, UINT msg, WPARAM wp, LPARAM lp) { IFniis cb = (IFniis)IupGetCallback(ih, "MOTION_CB"); if (cb) { char status[IUPKEY_STATUS_SIZE] = IUPKEY_STATUS_INIT; iupwinButtonKeySetStatus(LOWORD(wp), status, 0); cb(ih, (int)(short)LOWORD(lp), (int)(short)HIWORD(lp), status); return 1; } (void)msg; return 0; }
int iupwinButtonUp(Ihandle* ih, UINT msg, WPARAM wp, LPARAM lp) { char status[IUPKEY_STATUS_SIZE] = IUPKEY_STATUS_INIT; int ret, b=0; IFniiiis cb = (IFniiiis) IupGetCallback(ih, "BUTTON_CB"); if (!cb) return 0; iupwinButtonKeySetStatus(LOWORD(wp), status, 0); /* also updates the button status, since wp could not have the flag */ if (msg==WM_LBUTTONUP) { b = IUP_BUTTON1; iupKEY_SETBUTTON1(status); } else if (msg==WM_MBUTTONUP) { b = IUP_BUTTON2; iupKEY_SETBUTTON2(status); } else if (msg==WM_RBUTTONUP) { b = IUP_BUTTON3; iupKEY_SETBUTTON3(status); } else if (msg==WM_XBUTTONUP) { if (HIWORD(wp) == XBUTTON1) { b = IUP_BUTTON4; iupKEY_SETBUTTON4(status); } else { b = IUP_BUTTON5; iupKEY_SETBUTTON5(status); } } ret = cb(ih, b, 0, (int)(short)LOWORD(lp), (int)(short)HIWORD(lp), status); if (ret == IUP_CLOSE) IupExitLoop(); else if (ret == IUP_IGNORE) return -1; return 1; }
int iupwinButtonDown(Ihandle* ih, UINT msg, WPARAM wp, LPARAM lp) { char status[IUPKEY_STATUS_SIZE] = IUPKEY_STATUS_INIT; int ret, doubleclick = 0; int b = 0; IFniiiis cb = (IFniiiis) IupGetCallback(ih, "BUTTON_CB"); if (!cb) return 0; if (msg==WM_XBUTTONDBLCLK || msg==WM_LBUTTONDBLCLK || msg==WM_MBUTTONDBLCLK || msg==WM_RBUTTONDBLCLK) doubleclick = 1; iupwinButtonKeySetStatus(LOWORD(wp), status, doubleclick); if (msg==WM_LBUTTONDOWN || msg==WM_LBUTTONDBLCLK) b = IUP_BUTTON1; else if (msg==WM_MBUTTONDOWN || msg==WM_MBUTTONDBLCLK) b = IUP_BUTTON2; else if (msg==WM_RBUTTONDOWN || msg==WM_RBUTTONDBLCLK) b = IUP_BUTTON3; else if (msg==WM_XBUTTONDOWN || msg==WM_XBUTTONDBLCLK) { if (HIWORD(wp) == XBUTTON1) b = IUP_BUTTON4; else b = IUP_BUTTON5; } ret = cb(ih, b, 1, (int)(short)LOWORD(lp), (int)(short)HIWORD(lp), status); if (ret == IUP_CLOSE) IupExitLoop(); else if (ret == IUP_IGNORE) return -1; return 1; }
static LRESULT CALLBACK winHookGetMessageProc(int hcode, WPARAM gm_wp, LPARAM gm_lp) { MSG* gm_msg = (MSG*)gm_lp; UINT msg = gm_msg->message; WPARAM wp = gm_msg->wParam; LPARAM lp = gm_msg->lParam; POINT pt = gm_msg->pt; static int last_button = 0; static int last_pressed = 0; char status[IUPKEY_STATUS_SIZE] = IUPKEY_STATUS_INIT; if (hcode!=HC_ACTION) return CallNextHookEx(win_OldGetMessageHook, hcode, gm_wp, gm_lp); switch (msg) { case WM_MOUSEWHEEL: { IFfiis cb = (IFfiis)IupGetFunction("GLOBALWHEEL_CB"); if (cb) { short delta = (short)HIWORD(wp); iupwinButtonKeySetStatus(LOWORD(wp), status, 0); cb((float)delta/120.0f, LOWORD(lp), HIWORD(lp), status); } break; } case WM_NCXBUTTONDBLCLK: case WM_NCLBUTTONDBLCLK: case WM_NCMBUTTONDBLCLK: case WM_NCRBUTTONDBLCLK: case WM_NCXBUTTONDOWN: case WM_NCLBUTTONDOWN: case WM_NCMBUTTONDOWN: case WM_NCRBUTTONDOWN: case WM_XBUTTONDBLCLK: case WM_LBUTTONDBLCLK: case WM_MBUTTONDBLCLK: case WM_RBUTTONDBLCLK: case WM_XBUTTONDOWN: case WM_LBUTTONDOWN: case WM_MBUTTONDOWN: case WM_RBUTTONDOWN: { int doubleclick = 0, button = 0; IFiiiis cb = (IFiiiis) IupGetFunction("GLOBALBUTTON_CB"); if (!cb) break; if (msg==WM_XBUTTONDBLCLK || msg==WM_NCXBUTTONDBLCLK || msg==WM_LBUTTONDBLCLK || msg==WM_NCLBUTTONDBLCLK || msg==WM_MBUTTONDBLCLK || msg==WM_NCMBUTTONDBLCLK || msg==WM_RBUTTONDBLCLK || msg==WM_NCRBUTTONDBLCLK) doubleclick = 1; if (msg>=WM_MOUSEFIRST && msg<=WM_MOUSELAST) iupwinButtonKeySetStatus(LOWORD(wp), status, doubleclick); else if (doubleclick) iupKEY_SETDOUBLE(status); if (msg==WM_LBUTTONDOWN || msg==WM_LBUTTONDBLCLK || msg==WM_NCLBUTTONDOWN || msg==WM_NCLBUTTONDBLCLK) { button = IUP_BUTTON1; iupKEY_SETBUTTON1(status); } else if (msg==WM_MBUTTONDOWN || msg==WM_MBUTTONDBLCLK || msg==WM_NCMBUTTONDOWN || msg==WM_NCMBUTTONDBLCLK) { button = IUP_BUTTON2; iupKEY_SETBUTTON2(status); } else if (msg==WM_RBUTTONDOWN || msg==WM_RBUTTONDBLCLK || msg==WM_NCRBUTTONDOWN || msg==WM_NCRBUTTONDBLCLK) { button = IUP_BUTTON3; iupKEY_SETBUTTON3(status); } else if (msg==WM_XBUTTONDOWN || msg==WM_XBUTTONDBLCLK || msg==WM_NCXBUTTONDOWN || msg==WM_NCXBUTTONDBLCLK) { if (HIWORD(wp) == XBUTTON1) { button = IUP_BUTTON4; iupKEY_SETBUTTON4(status); } else { button = IUP_BUTTON5; iupKEY_SETBUTTON5(status); } } if (last_button == button && last_pressed == 1) break; /* do nothing because last state was already pressed */ cb(button, 1, pt.x, pt.y, status); last_button = button; last_pressed = 1; break; } case WM_NCXBUTTONUP: case WM_NCLBUTTONUP: case WM_NCMBUTTONUP: case WM_NCRBUTTONUP: case WM_XBUTTONUP: case WM_LBUTTONUP: case WM_MBUTTONUP: case WM_RBUTTONUP: { int button=0; IFiiiis cb = (IFiiiis) IupGetFunction("GLOBALBUTTON_CB"); if (!cb) break; if (msg>=WM_MOUSEFIRST && msg<=WM_MOUSELAST) iupwinButtonKeySetStatus(LOWORD(wp), status, 0); /* also updates the button status, since wp could not have the flag */ if (msg==WM_LBUTTONUP || msg==WM_NCLBUTTONUP) { button = IUP_BUTTON1; iupKEY_SETBUTTON1(status); } else if (msg==WM_MBUTTONUP || msg==WM_NCMBUTTONUP) { button = IUP_BUTTON2; iupKEY_SETBUTTON2(status); } else if (msg==WM_RBUTTONUP || msg==WM_NCRBUTTONUP) { button = IUP_BUTTON3; iupKEY_SETBUTTON3(status); } else if (msg==WM_XBUTTONUP || msg==WM_NCXBUTTONUP) { if (HIWORD(wp) == XBUTTON1) { button = IUP_BUTTON4; iupKEY_SETBUTTON4(status); } else { button = IUP_BUTTON5; iupKEY_SETBUTTON5(status); } } if (last_button == button && last_pressed == 0) break; /* do nothing because last state was already released */ cb(button, 0, pt.x, pt.y, status); last_button = button; last_pressed = 0; break; } case WM_NCMOUSEMOVE: case WM_MOUSEMOVE: { IFiis cb = (IFiis)IupGetFunction("GLOBALMOTION_CB"); if (cb) { if (msg>=WM_MOUSEFIRST && msg<=WM_MOUSELAST) iupwinButtonKeySetStatus(LOWORD(wp), status, 0); cb(pt.x, pt.y, status); } break; } case WM_KEYDOWN: case WM_SYSKEYDOWN: case WM_SYSKEYUP: case WM_KEYUP: { IFii cb = (IFii)IupGetFunction("GLOBALKEYPRESS_CB"); if (cb) { int pressed = (msg==WM_KEYDOWN || msg==WM_SYSKEYDOWN)? 1: 0; int code = iupwinKeyDecode((int)wp); if (code != 0) cb(code, pressed); } break; } default: break; } return CallNextHookEx(win_OldGetMessageHook, hcode, gm_wp, gm_lp); }
static int winCanvasProc(Ihandle* ih, UINT msg, WPARAM wp, LPARAM lp, LRESULT *result) { switch (msg) { case WM_ERASEBKGND: /* only paint background if ACTION is not defined */ if (!IupGetCallback(ih, "ACTION")) { RECT rect; HDC hdc = (HDC)wp; COLORREF color; iupwinGetColorRef(ih, "BGCOLOR", &color); GetClientRect(ih->handle, &rect); FillRect(hdc, &rect, iupwinBrushGet(color)); } else InvalidateRect(ih->handle,NULL,FALSE); /* This will invalidate all area. Necessary in XP, or overlapping windows will have the effect of partial redrawing. */ /* always return non zero value */ *result = 1; return 1; case WM_PAINT: { IFnff cb = (IFnff)IupGetCallback(ih, "ACTION"); if (cb && !(ih->data->inside_resize)) { PAINTSTRUCT ps; HDC hdc = BeginPaint(ih->handle, &ps); iupAttribSetStr(ih, "HDC_WMPAINT", (char*)hdc); iupAttribSetStrf(ih, "CLIPRECT", "%d %d %d %d", ps.rcPaint.left, ps.rcPaint.top, ps.rcPaint.right-ps.rcPaint.left, ps.rcPaint.bottom-ps.rcPaint.top); cb(ih, ih->data->posx, ih->data->posy); iupAttribSetStr(ih, "CLIPRECT", NULL); iupAttribSetStr(ih, "HDC_WMPAINT", NULL); EndPaint(ih->handle, &ps); } break; } case WM_SIZE: { IFnii cb = (IFnii)IupGetCallback(ih, "RESIZE_CB"); if (cb && !(ih->data->inside_resize)) { /* w=LOWORD (lp), h=HIWORD(lp) can not be used because an invalid size at the first time of WM_SIZE with scroolbars. */ int w, h; RECT rect; GetClientRect(ih->handle, &rect); w = rect.right-rect.left; h = rect.bottom-rect.top; ih->data->inside_resize = 1; /* avoid recursion */ cb(ih, w, h); ih->data->inside_resize = 0; } if (!iupAttribGetBoolean(ih, "MDICLIENT")) { /* If a MDI client, let the DefMDIChildProc do its work. */ *result = 0; return 1; } break; } case WM_GETDLGCODE: /* avoid beeps when keys are pressed */ *result = DLGC_WANTCHARS|DLGC_WANTARROWS; return 1; case WM_MOUSEWHEEL: { IFnfiis cb = (IFnfiis)IupGetCallback(ih, "WHEEL_CB"); short delta = (short)HIWORD(wp); if (cb) { char status[IUPKEY_STATUS_SIZE] = IUPKEY_STATUS_INIT; POINT p; p.x = LOWORD(lp); p.y = HIWORD(lp); ScreenToClient(ih->handle, &p); iupwinButtonKeySetStatus(LOWORD(wp), status, 0); cb(ih, (float)delta/120.0f, p.x, p.y, status); } else { if (ih->data->sb & IUP_SB_VERT) { int i, winop = delta>0? SB_LINEUP: SB_LINEDOWN; delta = (short)abs(delta/120); for (i=0; i < delta; i++) SendMessage(ih->handle, WM_VSCROLL, MAKELONG(winop, 0), 0); } } *result = 0; return 1; } case WM_XBUTTONDBLCLK: case WM_LBUTTONDBLCLK: case WM_MBUTTONDBLCLK: case WM_RBUTTONDBLCLK: case WM_XBUTTONDOWN: case WM_LBUTTONDOWN: case WM_MBUTTONDOWN: case WM_RBUTTONDOWN: { /* Force focus on canvas click */ if (iupAttribGetBoolean(ih, "CANFOCUS")) SetFocus(ih->handle); SetCapture(ih->handle); if (iupwinButtonDown(ih, msg, wp, lp)) { /* refresh the cursor, it could have been changed in BUTTON_CB */ SendMessage(ih->handle, WM_SETCURSOR, (WPARAM)ih->handle, MAKELPARAM(1,WM_MOUSEMOVE)); } if (msg==WM_XBUTTONDOWN || msg==WM_XBUTTONDBLCLK) *result = 1; else *result = 0; return 1; } case WM_MOUSEMOVE: { if (iupwinMouseMove(ih, msg, wp, lp)) { /* refresh the cursor, it could have been changed in MOTION_CB */ SendMessage(ih->handle, WM_SETCURSOR, (WPARAM)ih->handle, MAKELPARAM(1,WM_MOUSEMOVE)); } break; /* let iupwinBaseProc process enter/leavewin */ } case WM_XBUTTONUP: case WM_LBUTTONUP: case WM_MBUTTONUP: case WM_RBUTTONUP: { ReleaseCapture(); if (iupwinButtonUp(ih, msg, wp, lp)) { /* refresh the cursor, it could have been changed in BUTTON_CB */ SendMessage(ih->handle, WM_SETCURSOR, (WPARAM)ih->handle, MAKELPARAM(1,WM_MOUSEMOVE)); } *result = 0; if (msg==WM_XBUTTONUP) *result = 1; return 1; } case WM_KILLFOCUS: { if (GetCapture() == ih->handle) ReleaseCapture(); break; } case WM_INITMENU: /* abort capture if a menu is opened */ ReleaseCapture(); break; case WM_VSCROLL: if (!iupAttribGetBoolean(ih, "MDICLIENT")) { /* only update the scrollbar is not a MDI client */ winCanvasUpdateVerScroll(ih, LOWORD(wp)); *result = 0; return 1; } case WM_HSCROLL: if (!iupAttribGetBoolean(ih, "MDICLIENT")) { /* only update the scrollbar is not a MDI client */ winCanvasUpdateHorScroll(ih, LOWORD(wp)); *result = 0; return 1; } case WM_SETFOCUS: if (!iupAttribGetBoolean(ih, "CANFOCUS")) { HWND previous = (HWND)wp; if (previous && previous != ih->handle) SetFocus(previous); } break; } /* can be a container */ if (ih->firstchild) return iupwinBaseContainerProc(ih, msg, wp, lp, result); else return iupwinBaseProc(ih, msg, wp, lp, result); }