int GUIAPI DefaultContainerProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam) { PCONTDATA pcontdata = NULL; switch (message) { case MSG_CREATE: if ( !container_init (hWnd) ) return -1; break; case MSG_DESTROY: pcontdata = (PCONTDATA) GetWindowAdditionalData2 (hWnd); container_destroy (hWnd, pcontdata); break; case MSG_COMMAND: pcontdata = (PCONTDATA) GetWindowAdditionalData2 (hWnd); SendNotifyMessage (GetParent(pcontdata->hSV), MSG_SVCONTCMD, wParam, lParam); break; } /* end switch */ return DefaultPageProc (hWnd, message, wParam, lParam); }
static void create_container (HWND hWnd, PSWDATA pswdata) { PCONTAINERINFO cont_info = (PCONTAINERINFO) GetWindowAdditionalData(hWnd); pswdata->hContainer = CreateWindowEx (CTRL_CONTAINER, "", WS_VISIBLE, WS_EX_NONE, IDC_STATIC, pswdata->scrdata.nContX, pswdata->scrdata.nContY, pswdata->scrdata.nContWidth, pswdata->scrdata.nContHeight, hWnd, 0); pswdata->pContdata = (PCONTDATA) GetWindowAdditionalData2 (pswdata->hContainer); if (cont_info && cont_info->user_proc) SetWindowCallbackProc (pswdata->hContainer, cont_info->user_proc); if (cont_info && (cont_info->controlnr > 0)) scrollwnd_add_controls (hWnd, pswdata, cont_info->controlnr, cont_info->controls); SendMessage (pswdata->hContainer, MSG_INITCONTAINER, 0, cont_info ? cont_info->dwAddData : 0); }
static void ShowCurItemHint (HWND hWnd, PCOOL_INDICATOR_CTRL cb) { COOL_INDICATOR_ITEMDATA* tmpdata; PCOOL_INDICATOR_CTRL TbarData = (PCOOL_INDICATOR_CTRL) GetWindowAdditionalData2(hWnd); int x, y; tmpdata = GetCurSel(cb); if(tmpdata == NULL) return; x = tmpdata->hintx; y = tmpdata->hinty; if (tmpdata->Hint [0] == '\0') return; ClientToScreen (hWnd, &x, &y); if (g_rcScr.bottom - y < y - g_rcScr.top) { y -= (GetSysCharHeight () + (2 << 1) + cb->ItemHeight); } if (TbarData->hToolTip == 0) { TbarData->hToolTip = CreateCdrToolTipWin (hWnd, x, y, 1000, tmpdata->Hint); SetWindowFont(TbarData->hToolTip, GetWindowFont(hWnd)); } else { ResetCdrToolTipWin (TbarData->hToolTip, x, y, tmpdata->Hint); } }
/* adjust the position and size of the container window */ static void scrollwnd_set_container (HWND hWnd, PSCRDATA pscrdata, BOOL visChanged) { PSWDATA pswdata = (PSWDATA) GetWindowAdditionalData2 (hWnd); MoveWindow (pswdata->hContainer, -pscrdata->nContX, -pscrdata->nContY, pscrdata->nContWidth, pscrdata->nContHeight, TRUE); }
int ScrollWndCtrlProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam) { PSWDATA pswdata = NULL; if (message != MSG_CREATE) pswdata = (PSWDATA) GetWindowAdditionalData2 (hWnd); switch (message) { case MSG_CREATE: { pswdata = (PSWDATA) malloc(sizeof (SWDATA)); if (!pswdata) return -1; scrollwnd_init (hWnd, pswdata); break; } case MSG_DESTROY: scrollwnd_destroy (pswdata); free (pswdata); break; case MSG_ERASEBKGND: EditOnEraseBackground (hWnd, (HDC)wParam, (const RECT*)lParam); return 0; case MSG_GETDLGCODE: return DLGC_WANTTAB | DLGC_WANTARROWS; case SVM_ADDCTRLS: { int ctrl_nr = (int)wParam; PCTRLDATA pCtrlData = (PCTRLDATA)lParam; scrollwnd_add_controls (hWnd, pswdata, ctrl_nr, pCtrlData); return 0; } case SVM_GETCTRL: return GetDlgItem (pswdata->hContainer, wParam); case SVM_RESETCONTENT: scrollwnd_reset_content (hWnd, pswdata); return 0; case SVM_SETCONTAINERPROC: scrollwnd_set_container_proc (pswdata, (WNDPROC)lParam); return 0; case SVM_GETFOCUSCHILD: return (int)GetFocus (pswdata->hContainer); }/* end switch */ return DefaultScrolledProc (hWnd, message, wParam, lParam); }
static void drawButton(HWND hDlg, HDC IDCButton, unsigned int flag) { HWND hWnd; RECT rect; MBPrivData* privData; DWORD old_bkmode; gal_pixel old_color; HDC hdc; char* text; privData = (MBPrivData*)GetWindowAdditionalData(hDlg); hWnd = GetDlgItem(hDlg, IDCButton); GetClientRect(hWnd, &rect); hdc = GetDC(hWnd); if(flag == BUTTON_SELECTED) { old_color = SetBrushColor(hdc, gp_hilite_bgc); old_bkmode = SetBkMode(hdc, BM_TRANSPARENT); FillBox(hdc, rect.left, rect.top, RECTW(rect), RECTH(rect)); SetTextColor(hdc, gp_hilite_fgc); text = (char*)GetWindowAdditionalData2(hWnd); DrawText(hdc, text, -1, &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE); SetBrushColor(hdc, old_color); SetBkMode(hdc, old_bkmode); } else if(flag == BUTTON_UNSELECTED) { old_color = SetBrushColor(hdc, gp_normal_bgc); old_bkmode = SetBkMode(hdc, BM_TRANSPARENT); FillBox(hdc, rect.left, rect.top, RECTW(rect), RECTH(rect)); SetTextColor (hdc, gp_normal_fgc); text = (char*)GetWindowAdditionalData2(hWnd); DrawText(hdc, text, -1, &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE); SetBrushColor(hdc, old_color); SetBkMode(hdc, old_bkmode); } ReleaseDC(hdc); }
static void unhilight (HWND hwnd) { COOLBARITEMDATA* pItemdata; PCOOLBARCTRL TbarData; TbarData = (PCOOLBARCTRL) GetWindowAdditionalData2(hwnd); if ((pItemdata = GetCurSel(TbarData))) { TbarData->iSel = -1; TbarData->iMvOver = -1; InvalidateRect (hwnd, &pItemdata->RcTitle, TRUE); } }
static void ShowCurItemHint (HWND hWnd, PCOOLBARCTRL cb, COOLBARITEMDATA* tmpdata) { int x = tmpdata->hintx, y = tmpdata->hinty; PCOOLBARCTRL TbarData = (PCOOLBARCTRL) GetWindowAdditionalData2(hWnd); if (tmpdata->Hint [0] == '\0') return; ClientToScreen (hWnd, &x, &y); if (g_rcScr.bottom - y < y - g_rcScr.top) { y -= (GetSysCharHeight () + (2 << 1) + cb->ItemHeight); } if (TbarData->hToolTip == 0) { TbarData->hToolTip = CreateToolTipWin (hWnd, x, y, 1000, tmpdata->Hint); } else { ResetToolTipWin (TbarData->hToolTip, x, y, tmpdata->Hint); } }
static int CoolBarCtrlProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam) { HDC hdc; PCOOLBARCTRL TbarData; PCOOLBARITEMDATA pTbid; switch (message) { case MSG_CREATE: { DWORD data; DWORD dwStyle; const char* caption; if ((TbarData = (COOLBARCTRL*) calloc (1, sizeof (COOLBARCTRL))) == NULL) return 1; TbarData->nCount = 0; TbarData->head = TbarData->tail = NULL; TbarData->BackBmp = NULL; TbarData->iSel = -1; TbarData->iMvOver = -1; TbarData->ShowHint = TRUE; TbarData->hToolTip = 0; ExcludeWindowStyle (hWnd, WS_BORDER); dwStyle = GetWindowStyle (hWnd); if (dwStyle & CBS_BMP_32X32) { TbarData->ItemWidth = 32; TbarData->ItemHeight = 32; } else if (dwStyle & CBS_BMP_CUSTOM) { data = GetWindowAdditionalData (hWnd); TbarData->ItemWidth = LOWORD (data); TbarData->ItemHeight = HIWORD (data); } else { TbarData->ItemWidth = 16; TbarData->ItemHeight = 16; } caption = GetWindowCaption (hWnd); if ((dwStyle & CBS_USEBKBMP) && caption [0]) { TbarData->BackBmp = (BITMAP*)calloc (1, sizeof (BITMAP)); if (LoadBitmap (HDC_SCREEN, TbarData->BackBmp, caption) < 0) { free (TbarData->BackBmp); TbarData->BackBmp = NULL; break; } } SetWindowAdditionalData2 (hWnd, (DWORD)TbarData); } break; case MSG_DESTROY: { COOLBARITEMDATA* unloaddata, *tmp; TbarData = (PCOOLBARCTRL) GetWindowAdditionalData2(hWnd); if (TbarData->hToolTip != 0) { DestroyToolTipWin (TbarData->hToolTip); TbarData->hToolTip = 0; } if (TbarData->BackBmp) { UnloadBitmap (TbarData->BackBmp); free (TbarData->BackBmp); } unloaddata = TbarData->head; while (unloaddata) { tmp = unloaddata->next; free (unloaddata); unloaddata = tmp; } free (TbarData); } break; case MSG_SIZECHANGING: { const RECT* rcExpect = (const RECT*)wParam; RECT* rcResult = (RECT*)lParam; TbarData = (PCOOLBARCTRL) GetWindowAdditionalData2(hWnd); rcResult->left = rcExpect->left; rcResult->top = rcExpect->top; rcResult->right = rcExpect->right; rcResult->bottom = rcExpect->top + TbarData->ItemHeight + 8; return 0; } case MSG_SIZECHANGED: { RECT* rcWin = (RECT*)wParam; RECT* rcClient = (RECT*)lParam; *rcClient = *rcWin; return 1; } case MSG_NCPAINT: return 0; case MSG_PAINT: { TbarData = (PCOOLBARCTRL) GetWindowAdditionalData2(hWnd); hdc = BeginPaint (hWnd); DrawCoolBox (hWnd, hdc, TbarData); EndPaint (hWnd, hdc); return 0; } case CBM_ADDITEM: { COOLBARITEMINFO* TbarInfo = NULL; COOLBARITEMDATA* ptemp; RECT rc; TbarData = (PCOOLBARCTRL) GetWindowAdditionalData2 (hWnd); TbarInfo = (COOLBARITEMINFO*) lParam; if (!(ptemp = (COOLBARITEMDATA*)calloc (1, sizeof (COOLBARITEMDATA)))) { return -1; } GetClientRect (hWnd, &rc); ptemp->id = TbarInfo->id; ptemp->Disable = 0; ptemp->ItemType = TbarInfo->ItemType; if (TbarInfo->ItemHint) { strncpy (ptemp->Hint, TbarInfo->ItemHint, LEN_HINT); ptemp->Hint [LEN_HINT] = '\0'; } else ptemp->Hint [0] = '\0'; if (TbarInfo->Caption) { strncpy (ptemp->Caption, TbarInfo->Caption, LEN_TITLE); ptemp->Caption [LEN_TITLE] = '\0'; } else ptemp->Caption [0] = '\0'; ptemp->Bmp = TbarInfo->Bmp; set_item_rect (hWnd, TbarData, ptemp); ptemp->next = NULL; if (TbarData->nCount == 0) { TbarData->head = TbarData->tail = ptemp; } else if (TbarData->nCount > 0) { TbarData->tail->next = ptemp; TbarData->tail = ptemp; } ptemp->insPos = TbarData->nCount; TbarData->nCount++; InvalidateRect (hWnd, NULL, TRUE); return 0; } case CBM_ENABLE: TbarData = (PCOOLBARCTRL)GetWindowAdditionalData2 (hWnd); if (enable_item (TbarData, wParam, lParam)) return -1; InvalidateRect (hWnd, NULL, TRUE); return 0; case MSG_LBUTTONDOWN: { int posx, posy; TbarData=(PCOOLBARCTRL) GetWindowAdditionalData2(hWnd); posx = LOSWORD (lParam); posy = HISWORD (lParam); if (GetCapture () == hWnd) break; SetCapture (hWnd); if ((pTbid = GetCurTag (posx, posy, TbarData)) == NULL) break; TbarData->iSel = pTbid->insPos; break; } case MSG_LBUTTONUP: { int x, y; TbarData = (PCOOLBARCTRL)GetWindowAdditionalData2(hWnd); x = LOSWORD(lParam); y = HISWORD(lParam); if (GetCapture() != hWnd) break; ReleaseCapture (); ScreenToClient (hWnd, &x, &y); if ((pTbid = GetCurTag(x, y, TbarData)) == NULL) { break; } if (TbarData->iSel == pTbid->insPos && !pTbid->Disable) NotifyParent (hWnd, GetDlgCtrlID(hWnd), pTbid->id); TbarData->iSel = -1; break; } case MSG_MOUSEMOVE: { int x, y; TbarData = (PCOOLBARCTRL) GetWindowAdditionalData2(hWnd); x = LOSWORD(lParam); y = HISWORD(lParam); if (GetCapture() == hWnd) ScreenToClient (hWnd, &x, &y); if ((pTbid = GetCurTag (x, y, TbarData)) == NULL) { unhilight (hWnd); break; } if (TbarData->iMvOver == pTbid->insPos) break; unhilight (hWnd); TbarData->iMvOver = pTbid->insPos; hilight (hWnd, TbarData, pTbid); break; } case MSG_MOUSEMOVEIN: if (!wParam) unhilight (hWnd); break; case MSG_NCLBUTTONDOWN: case MSG_KILLFOCUS: unhilight (hWnd); break; } return DefaultControlProc (hWnd, message, wParam, lParam); }
static int CoolIndicatorCtrlProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam) { HDC hdc; PCOOL_INDICATOR_CTRL TbarData; //db_msg("message is %s, wParam: 0x%x, lParam: 0x%lx\n", Message2Str(message), wParam, lParam); switch (message) { case MSG_CREATE: { DWORD data; DWORD dwStyle; //db_info("Cool Indicator ctrl proc\n"); if ((TbarData = (COOL_INDICATOR_CTRL*) calloc (1, sizeof (COOL_INDICATOR_CTRL))) == NULL) return 1; TbarData->nCount = 0; TbarData->head = TbarData->tail = NULL; TbarData->BackBmp = NULL; TbarData->iSel = 0; TbarData->hToolTip = 0; //ExcludeWindowStyle (hWnd, WS_BORDER); dwStyle = GetWindowStyle (hWnd); if (dwStyle & CBS_BMP_CUSTOM) { data = GetWindowAdditionalData (hWnd); TbarData->ItemWidth = LOWORD (data); TbarData->ItemHeight = HIWORD (data); int screenW,screenH; getScreenInfo(&screenW,&screenH); TbarData->ItemHeight = screenH/8; } else { TbarData->ItemWidth = 16; TbarData->ItemHeight = 16; } SetWindowAdditionalData2 (hWnd, (DWORD)TbarData); } break; case MSG_DESTROY: { COOL_INDICATOR_ITEMDATA* unloaddata, *tmp; TbarData = (PCOOL_INDICATOR_CTRL) GetWindowAdditionalData2(hWnd); if (TbarData->hToolTip != 0) { DestroyCdrToolTipWin(TbarData->hToolTip); TbarData->hToolTip = 0; } if (TbarData->BackBmp) { UnloadBitmap (TbarData->BackBmp); free (TbarData->BackBmp); } unloaddata = TbarData->head; while (unloaddata) { tmp = unloaddata->next; free (unloaddata); unloaddata = tmp; } free (TbarData); } break; case MSG_SHOWWINDOW: { if(wParam == SW_SHOWNORMAL) { enable_hint = TRUE; } else { enable_hint = FALSE; } } break; case MSG_SIZECHANGING: { const RECT* rcExpect = (const RECT*)wParam; RECT* rcResult = (RECT*)lParam; TbarData = (PCOOL_INDICATOR_CTRL) GetWindowAdditionalData2(hWnd); rcResult->left = rcExpect->left; rcResult->top = rcExpect->top; rcResult->right = rcExpect->right; rcResult->bottom = rcExpect->top + TbarData->ItemHeight + 14; return 0; } break; case MSG_SIZECHANGED: { RECT* rcWin = (RECT*)wParam; RECT* rcClient = (RECT*)lParam; *rcClient = *rcWin; return 1; } break; case MSG_FONTCHANGED: { TbarData = (PCOOL_INDICATOR_CTRL) GetWindowAdditionalData2(hWnd); PLOGFONT logfont = GetWindowFont(hWnd); //db_msg("MSG_FONTCHANGED, type :%s, familyt: %s, charset: %s\n", logfont->type, logfont->family, logfont->charset); if(TbarData != NULL && TbarData->hToolTip != 0) { SetWindowFont(TbarData->hToolTip, logfont ); } } break; case MSG_NCPAINT: return 0; case MSG_PAINT: //todo: why MSG_PAINT is received early than MSG_CREATE? { TbarData = (PCOOL_INDICATOR_CTRL) GetWindowAdditionalData2(hWnd); if (TbarData == NULL) { break; } hdc = BeginPaint (hWnd); PLOGFONT logfont = GetWindowFont(hWnd); SelectFont(hdc, logfont ); DrawCoolBox (hWnd, hdc, TbarData); EndPaint (hWnd, hdc); return 0; } break; case CBM_ADDITEM: { COOL_INDICATOR_ITEMINFO* TbarInfo = NULL; COOL_INDICATOR_ITEMDATA* ptemp; RECT rc; TbarData = (PCOOL_INDICATOR_CTRL) GetWindowAdditionalData2 (hWnd); TbarInfo = (COOL_INDICATOR_ITEMINFO*) lParam; if (!(ptemp = (COOL_INDICATOR_ITEMDATA*)calloc (1, sizeof (COOL_INDICATOR_ITEMDATA)))) { return -1; } GetClientRect (hWnd, &rc); //db_msg("add item id is %d\n", TbarInfo->id); ptemp->id = TbarInfo->id; ptemp->Disable = 0; ptemp->ItemType = TbarInfo->ItemType; ptemp->sliderColor = TbarInfo->sliderColor; // if (TbarInfo->ItemHint) { // strncpy (ptemp->Hint, TbarInfo->ItemHint, LEN_HINT); // ptemp->Hint [LEN_HINT] = '\0'; //} // else ptemp->Hint [0] = '\0'; if (TbarInfo->Caption) { strncpy (ptemp->Caption, TbarInfo->Caption, LEN_TITLE); ptemp->Caption [LEN_TITLE] = '\0'; } else ptemp->Caption [0] = '\0'; ptemp->Bmp = TbarInfo->Bmp; set_item_rect (hWnd, TbarData, ptemp); ptemp->next = NULL; if (TbarData->nCount == 0) { TbarData->head = TbarData->tail = ptemp; } else if (TbarData->nCount > 0) { TbarData->tail->next = ptemp; TbarData->tail = ptemp; } TbarData->nCount++; InvalidateRect (hWnd, NULL, TRUE); return 0; } break; case CBM_CLEARITEM: { COOL_INDICATOR_ITEMINFO* TbarInfo = NULL; COOL_INDICATOR_ITEMDATA *ptemp1, *ptemp2; TbarData = (PCOOL_INDICATOR_CTRL) GetWindowAdditionalData2 (hWnd); TbarInfo = (COOL_INDICATOR_ITEMINFO*) lParam; ptemp1 = TbarData->head; while (ptemp1) { ptemp2 = ptemp1->next; ptemp1->next = NULL; free (ptemp1); ptemp1 = ptemp2; } TbarData->head = TbarData->tail = NULL; TbarData->nCount = 0; TbarData->iSel = 0; } break; case CBM_SWITCH2NEXT: { TbarData = (PCOOL_INDICATOR_CTRL) GetWindowAdditionalData2 (hWnd); TbarData->iSel++; if(TbarData->iSel >= TbarData->nCount) { TbarData->iSel = 0; } db_info("switch to next, iSel is %d\n", TbarData->iSel); InvalidateRect (hWnd, NULL, TRUE); } break; case CBM_ENABLE: { TbarData = (PCOOL_INDICATOR_CTRL)GetWindowAdditionalData2 (hWnd); if (enable_item (TbarData, wParam, lParam)) return -1; InvalidateRect (hWnd, NULL, TRUE); return 0; } break; default: break; } return DefaultMainWinProc(hWnd, message, wParam, lParam); }
static int SpinCtrlProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam) { PSPINDATA pData = (PSPINDATA) GetWindowAdditionalData2 (hWnd); switch (message) { case MSG_CREATE: pData = (PSPINDATA) calloc (1, sizeof (SPINDATA)); if (!pData) { return -1; } pData->canup = 1; pData->candown = 1; pData->hTarget = GetParent ( hWnd ); SetWindowAdditionalData2 (hWnd, (DWORD)pData); break; case MSG_DESTROY: free (pData); break; case MSG_SIZECHANGING: { const RECT* rcExpect = (const RECT*)wParam; RECT* rcResult = (RECT*)lParam; int w, h; rcResult->left = rcExpect->left; rcResult->top = rcExpect->top; GetSpinBoxSize (GetWindowStyle (hWnd), &w, &h); rcResult->right = rcExpect->left + w; rcResult->bottom = rcExpect->top + h; return 0; } case MSG_SIZECHANGED: { RECT* rcWin = (RECT*)wParam; RECT* rcClient = (RECT*)lParam; *rcClient = *rcWin; return 1; } case SPM_SETINFO: { PSPININFO spinfo = (PSPININFO) lParam; if ( !spinfo ) return -1; if (!(GetWindowStyle (hWnd) & SPS_AUTOSCROLL)) { memcpy ( &(pData->spinfo), spinfo, sizeof (SPININFO) ); } else { if ( (spinfo->max >= spinfo->min && spinfo->max >= spinfo->cur && spinfo->cur >= spinfo->min )) { memcpy ( &(pData->spinfo), spinfo, sizeof (SPININFO) ); } else { return -1; } } InvalidateRect ( hWnd, NULL, FALSE ); return 0; } case SPM_GETINFO: { PSPININFO spinfo = (PSPININFO) lParam; if ( !spinfo ) return -1; memcpy ( spinfo, &(pData->spinfo), sizeof (SPININFO) ); return 0; } case SPM_SETCUR: { if (!(GetWindowStyle (hWnd) & SPS_AUTOSCROLL)) { pData->spinfo.cur = wParam; } else{ if ( wParam > pData->spinfo.max || wParam < pData->spinfo.min) return -1; pData->spinfo.cur = wParam; } InvalidateRect (hWnd, NULL, FALSE ); return 0; } case SPM_GETCUR: return pData->spinfo.cur; case SPM_ENABLEUP: pData->canup = 1; InvalidateRect ( hWnd, NULL, FALSE ); return 0; case SPM_ENABLEDOWN: pData->candown = 1; InvalidateRect ( hWnd, NULL, FALSE ); return 0; case SPM_DISABLEUP: pData->canup = 0; InvalidateRect ( hWnd, NULL, FALSE ); return 0; case SPM_DISABLEDOWN: pData->candown = 0; InvalidateRect ( hWnd, NULL, FALSE ); return 0; case SPM_SETTARGET: pData->hTarget = (HWND) lParam; return 0; case SPM_GETTARGET: return pData->hTarget; case MSG_NCPAINT: return 0; case MSG_PAINT: { DWORD dwStyle = GetWindowStyle (hWnd); HDC hdc = BeginPaint (hWnd); if (dwStyle & SPS_HORIZONTAL) DrawSpinBoxHorz (hdc, &pData->spinfo, pData, dwStyle); else DrawSpinBoxVert (hdc, &pData->spinfo, pData, dwStyle); EndPaint (hWnd, hdc); return 0; } case MSG_LBUTTONDOWN: { int posx = LOWORD (lParam); int posy = HIWORD (lParam); int id = GetDlgCtrlID (hWnd); DWORD dwStyle = GetWindowStyle (hWnd); if ((dwStyle & SPS_TYPE_MASK) == SPS_TYPE_UPARROW) { OnUpArrow (hWnd, pData, id, dwStyle, wParam); } else if ((dwStyle & SPS_TYPE_MASK) == SPS_TYPE_DOWNARROW) { OnDownArrow (hWnd, pData, id, dwStyle, wParam); } else if ( ((dwStyle & SPS_HORIZONTAL) && (posx <= SPINBOX_HORZ_WIDTH)) || (!(dwStyle & SPS_HORIZONTAL) && (posy <= SPINBOX_VERT_HEIGHT)) ) { OnUpArrow (hWnd, pData, id, dwStyle, wParam); } else if ( ((dwStyle & SPS_HORIZONTAL) && (posx >= SPINBOX_HORZ_WIDTH + 2)) || (!(dwStyle & SPS_HORIZONTAL) && (posy >= SPINBOX_VERT_HEIGHT + 2)) ) { OnDownArrow (hWnd, pData, id, dwStyle, wParam); } InvalidateRect ( hWnd, NULL, FALSE ); if (GetCapture () == hWnd) break; SetCapture (hWnd); SetAutoRepeatMessage (hWnd, message, wParam, lParam); break; } case MSG_LBUTTONUP: SetAutoRepeatMessage (0, 0, 0, 0); ReleaseCapture (); break; default: break; } return DefaultControlProc (hWnd, message, wParam, lParam); }
static int AnimationCtrlProc (HWND hwnd, int message, WPARAM wParam, LPARAM lParam) { ANIMATIONINFO* anim_info = (ANIMATIONINFO*)GetWindowAdditionalData2 (hwnd); switch (message) { case MSG_CREATE: if (!HaveFreeTimer ()) { fprintf (stderr, "Animation error : no free timer is available!\n"); return -1; } anim_info = (ANIMATIONINFO*) calloc (1, sizeof (ANIMATIONINFO)); if (anim_info == NULL) return -1; SetWindowAdditionalData2 (hwnd, (DWORD)anim_info); if(lParam) SendMessage (hwnd, ANM_SETANIMATION, 0, lParam); break; case MSG_DESTROY: if (anim_info->mem_dc) DeleteCompatibleDC (anim_info->mem_dc); free (anim_info); /* timer will be freed automatically */ //KillTimer (hwnd, ID_TIMER); break; case MSG_TIMER: if(anim_info->anim == NULL) return 0; if (anim_info->status == ANIM_STATUS_PLAY) { int delay_time = -1; if(anim_info->current) { delay_time = anim_info->current->delay_time; } anim_info->elapsed_10ms++; if (delay_time > 0 && anim_info->elapsed_10ms >= delay_time) { next_frame (hwnd, anim_info); anim_info->elapsed_10ms = 0; } } return 0; case MSG_PAINT: { HDC hdc; HDC src_dc; RECT rc_anim; if (!anim_info->mem_dc) break; hdc = BeginPaint (hwnd); src_dc = anim_info->mem_dc; if (GetWindowStyle (hwnd) & ANS_SCALED) { GetClientRect (hwnd, &rc_anim); } else { SetRect (&rc_anim, 0, 0, anim_info->anim->width, anim_info->anim->height); } if (RECTW (rc_anim) == anim_info->anim->width && RECTH (rc_anim) == anim_info->anim->height) { BitBlt (anim_info->mem_dc, 0, 0, 0, 0, hdc, 0, 0, 0); } else { StretchBlt (anim_info->mem_dc, 0, 0, anim_info->anim->width, anim_info->anim->height, hdc, 0, 0, RECTW (rc_anim), RECTH (rc_anim), 0); } EndPaint (hwnd, hdc); return 0; } case ANM_SETANIMATION: { ANIMATION* old = anim_info->anim; anim_info->anim = (ANIMATION*)lParam; anim_info->current = NULL; if (anim_info->anim) { KillTimer (hwnd, ID_TIMER); if (GetWindowStyle (hwnd) & ANS_FITTOANI) { RECT rc; GetWindowRect(hwnd, &rc); MoveWindow(hwnd, rc.left, rc.top, anim_info->anim->width, anim_info->anim->height, FALSE); } anim_info->current = NULL; setup_anim_mem_dc(hwnd, anim_info); next_frame(hwnd, anim_info); anim_info->elapsed_10ms = 0; //SetTimer (hwnd, ID_TIMER, anim_info->anim->time_unit); SetTimer (hwnd, ID_TIMER, 10); } return (int)old; } case ANM_GETANIMATION: return (int)anim_info->anim; case ANM_STARTPLAY: { if (anim_info->anim) { anim_info->current = NULL; anim_info->status = ANIM_STATUS_PLAY; next_frame(hwnd, anim_info); anim_info->elapsed_10ms = 0; } return 0; } case ANM_PAUSE_RESUME: if(anim_info->anim) { if (anim_info->status == ANIM_STATUS_PLAY) anim_info->status = ANIM_STATUS_STOP; else anim_info->status = ANIM_STATUS_PLAY; } return 0; case ANM_STOPPLAY: if(anim_info->anim) { anim_info->current = NULL; anim_info->status = ANIM_STATUS_STOP; next_frame (hwnd, anim_info); //back to the first frame anim_info->elapsed_10ms = 0; InvalidateRect (hwnd, NULL, FALSE); } return 0; case MSG_LBUTTONDBLCLK: NotifyParent (hwnd, GetDlgCtrlID (hwnd), ANNC_DBLCLK); break; case MSG_LBUTTONDOWN: NotifyParent (hwnd, GetDlgCtrlID (hwnd), ANNC_CLICKED); break; default: break; } return DefaultControlProc (hwnd, message, wParam, lParam); }