static int winListCtlColor(Ihandle* ih, HDC hdc, LRESULT *result) { COLORREF cr; if (iupwinGetColorRef(ih, "FGCOLOR", &cr)) SetTextColor(hdc, cr); if (iupwinGetColorRef(ih, "BGCOLOR", &cr)) { SetBkColor(hdc, cr); SetDCBrushColor(hdc, cr); *result = (LRESULT)GetStockObject(DC_BRUSH); return 1; } return 0; }
static int winToggleCtlColor(Ihandle* ih, HDC hdc, LRESULT *result) { COLORREF cr; SetBkMode(hdc, TRANSPARENT); if (iupwinGetColorRef(ih, "FGCOLOR", &cr)) SetTextColor(hdc, cr); if (iupwinGetParentBgColor(ih, &cr)) { SetDCBrushColor(hdc, cr); *result = (LRESULT)GetStockObject(DC_BRUSH); return 1; } return 0; }
void iupwinTipsUpdateInfo(Ihandle* ih, HWND tips_hwnd) { COLORREF color, tip_color; char* value; { HFONT hfont; value = iupAttribGetStr(ih, "TIPFONT"); if (value) { if (iupStrEqualNoCase(value, "SYSTEM")) hfont = NULL; else hfont = iupwinGetHFont(value); } else hfont = (HFONT)iupwinGetHFontAttrib(ih); if (hfont) { HFONT tip_hfont = (HFONT)SendMessage(tips_hwnd, WM_GETFONT, 0, 0); if (tip_hfont != hfont) SendMessage(tips_hwnd, WM_SETFONT, (WPARAM)hfont, MAKELPARAM(TRUE,0)); } } iupwinGetColorRef(ih, "TIPBGCOLOR", &color); tip_color = (COLORREF)SendMessage(tips_hwnd, TTM_GETTIPBKCOLOR, 0, 0); if (color != tip_color) SendMessage(tips_hwnd, TTM_SETTIPBKCOLOR, (WPARAM)color, 0); iupwinGetColorRef(ih, "TIPFGCOLOR", &color); tip_color = (COLORREF)SendMessage(tips_hwnd, TTM_GETTIPTEXTCOLOR, 0, 0); if (color != tip_color) SendMessage(tips_hwnd, TTM_SETTIPTEXTCOLOR, (WPARAM)color, 0); { int balloon = IupGetInt(ih, "TIPBALLOON"); /* must use IupGetInt to use inheritance */ DWORD style = GetWindowLong(tips_hwnd, GWL_STYLE); int tip_balloon = style & TTS_BALLOON? 1: 0; if (tip_balloon != balloon) { if (balloon) style |= TTS_BALLOON; else style &= ~TTS_BALLOON; SetWindowLong(tips_hwnd, GWL_STYLE, style); } if (balloon) { int balloon_icon = IupGetInt(ih, "TIPBALLOONTITLEICON"); /* must use IupGetInt to use inheritance */ TCHAR* balloon_title = iupwinStrToSystem(IupGetAttribute(ih, "TIPBALLOONTITLE")); /* must use IupGetAttribute to use inheritance */ SendMessage(tips_hwnd, TTM_SETTITLE, balloon_icon, (LPARAM)balloon_title); } else SendMessage(tips_hwnd, TTM_SETTITLE, 0, 0); } { int delay = IupGetInt(ih, "TIPDELAY"); /* must use IupGetInt to use inheritance */ int tip_delay = (int)SendMessage(tips_hwnd, TTM_GETDELAYTIME, TTDT_AUTOPOP, 0); if (delay != tip_delay) SendMessage(tips_hwnd, TTM_SETDELAYTIME, TTDT_AUTOPOP, (LPARAM)MAKELONG(delay, 0)); } { TTTOOLINFO ti; ZeroMemory(&ti, sizeof(TTTOOLINFO)); if (iupwin_comctl32ver6) ti.cbSize = sizeof(TTTOOLINFO); else ti.cbSize = sizeof(TTTOOLINFO)-sizeof(void*); /* fix for no visual styles and Unicode */ ti.uId = 0; ti.hwnd = ih->handle; value = iupAttribGet(ih, "TIPRECT"); if (value) { int x1, x2, y1, y2; sscanf(value, "%d %d %d %d", &x1, &y1, &x2, &y2); ti.rect.left = x1; ti.rect.right = x2; ti.rect.top = y1; ti.rect.bottom = y2; } else GetClientRect(ih->handle, &ti.rect); SendMessage(tips_hwnd, TTM_NEWTOOLRECT, 0, (LPARAM)&ti); } }
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); }
static void winListDrawItem(Ihandle* ih, DRAWITEMSTRUCT *drawitem) { char* text; int txt_w, txt_h; winListItemData* itemdata; HFONT hFont = (HFONT)iupwinGetHFontAttrib(ih); iupwinBitmapDC bmpDC; HDC hDC; RECT rect; COLORREF fgcolor, bgcolor; int x = drawitem->rcItem.left; int y = drawitem->rcItem.top; int width = drawitem->rcItem.right - drawitem->rcItem.left; int height = drawitem->rcItem.bottom - drawitem->rcItem.top; /* If there are no list box items, skip this message */ if (drawitem->itemID == -1) return; hDC = iupwinDrawCreateBitmapDC(&bmpDC, drawitem->hDC, x, y, width, height); if (drawitem->itemState & ODS_SELECTED) bgcolor = GetSysColor(COLOR_HIGHLIGHT); else if (!iupwinGetColorRef(ih, "BGCOLOR", &bgcolor)) bgcolor = GetSysColor(COLOR_WINDOW); SetDCBrushColor(hDC, bgcolor); SetRect(&rect, 0, 0, width, height); FillRect(hDC, &rect, (HBRUSH)GetStockObject(DC_BRUSH)); if (iupdrvIsActive(ih)) { if (drawitem->itemState & ODS_SELECTED) fgcolor = GetSysColor(COLOR_HIGHLIGHTTEXT); else if (!iupwinGetColorRef(ih, "FGCOLOR", &fgcolor)) fgcolor = GetSysColor(COLOR_WINDOWTEXT); } else fgcolor = GetSysColor(COLOR_GRAYTEXT); /* Get the bitmap associated with the item */ itemdata = winListGetItemData(ih, drawitem->itemID); /* Get and draw the string associated with the item */ text = winListGetText(ih, drawitem->itemID); iupdrvFontGetMultiLineStringSize(ih, text, &txt_w, &txt_h); x = ih->data->maximg_w + 3; /* spacing between text and image */ y = (height - txt_h)/2; /* vertically centered */ iupwinDrawText(hDC, text, x, y, txt_w, txt_h, hFont, fgcolor, 0); /* Draw the bitmap associated with the item */ if (itemdata->hBitmap) { int bpp, img_w, img_h; HBITMAP hMask = NULL; iupdrvImageGetInfo(itemdata->hBitmap, &img_w, &img_h, &bpp); if (bpp == 8) { char name[50]; sprintf(name, "IMAGE%d", (int)drawitem->itemID+1); hMask = iupdrvImageCreateMask(IupGetAttributeHandle(ih, name)); } x = 0; y = (height - img_h)/2; /* vertically centered */ iupwinDrawBitmap(hDC, itemdata->hBitmap, hMask, x, y, img_w, img_h, bpp); if (hMask) DeleteObject(hMask); } /* If the item has the focus, draw the focus rectangle */ if (drawitem->itemState & ODS_FOCUS) iupdrvDrawFocusRect(ih, hDC, 0, 0, width, height); free(text); iupwinDrawDestroyBitmapDC(&bmpDC); }
void iupwinTipsGetDispInfo(LPARAM lp) { COLORREF color, tip_color; NMTTDISPINFO* tips_info; Ihandle* ih; HWND tips_hwnd; char* value; if (!lp) return; tips_info = (NMTTDISPINFO*)lp; ih = iupwinHandleGet(tips_info->hdr.hwndFrom); /* hwndFrom is the tooltip window */ if (!ih) return; tips_hwnd = (HWND)iupAttribGet(ih, "_IUPWIN_TIPSWIN"); if (tips_hwnd != tips_info->hdr.hwndFrom) return; tips_info->hinst = NULL; tips_info->lpszText = IupGetAttribute(ih, "TIP"); /* must use IupGetAttribute to use inheritance */ { HFONT hfont = (HFONT)iupwinGetHFontAttrib(ih); value = iupAttribGetStr(ih, "TIPFONT"); if (value) { if (iupStrEqualNoCase(value, "SYSTEM")) hfont = NULL; else hfont = iupwinFontGetNativeFont(value); } if (hfont) { HFONT tip_hfont = (HFONT)SendMessage(tips_hwnd, WM_GETFONT, 0, 0); if (tip_hfont != hfont) SendMessage(tips_hwnd, WM_SETFONT, (WPARAM)hfont, MAKELPARAM(TRUE,0)); } } iupwinGetColorRef(ih, "TIPBGCOLOR", &color); tip_color = (COLORREF)SendMessage(tips_hwnd, TTM_GETTIPBKCOLOR, 0, 0); if (color != tip_color) SendMessage(tips_hwnd, TTM_SETTIPBKCOLOR, (WPARAM)color, 0); iupwinGetColorRef(ih, "TIPFGCOLOR", &color); tip_color = (COLORREF)SendMessage(tips_hwnd, TTM_GETTIPTEXTCOLOR, 0, 0); if (color != tip_color) SendMessage(tips_hwnd, TTM_SETTIPTEXTCOLOR, (WPARAM)color, 0); { int ballon = IupGetInt(ih, "TIPBALLON"); /* must use IupGetInt to use inheritance */ DWORD style = GetWindowLong(tips_hwnd, GWL_STYLE); int tip_ballon = style & TTS_BALLOON? 1: 0; if (tip_ballon != ballon) { if (ballon) style |= TTS_BALLOON; else style &= ~TTS_BALLOON; SetWindowLong(tips_hwnd, GWL_STYLE, style); } if (ballon) { char* ballon_title = IupGetAttribute(ih, "TIPBALLONTITLE"); /* must use IupGetAttribute to use inheritance */ int ballon_icon = IupGetInt(ih, "TIPBALLONTITLEICON"); /* must use IupGetInt to use inheritance */ SendMessage(tips_hwnd, TTM_SETTITLEA, ballon_icon, (LPARAM)ballon_title); } else SendMessage(tips_hwnd, TTM_SETTITLEA, 0, 0); } { int delay = IupGetInt(ih, "TIPDELAY"); /* must use IupGetInt to use inheritance */ int tip_delay = SendMessage(tips_hwnd, TTM_GETDELAYTIME, TTDT_AUTOPOP, 0); if (delay != tip_delay) SendMessage(tips_hwnd, TTM_SETDELAYTIME, TTDT_AUTOPOP, (LPARAM)MAKELONG(delay, 0)); } { TOOLINFO ti; ZeroMemory(&ti, sizeof(TOOLINFO)); ti.cbSize = sizeof(TOOLINFO); ti.uId = 0; ti.hwnd = ih->handle; value = iupAttribGet(ih, "TIPRECT"); if (value) { int x1, x2, y1, y2; sscanf(value, "%d %d %d %d", &x1, &y1, &x2, &y2); ti.rect.left = x1; ti.rect.right = x2; ti.rect.top = y1; ti.rect.bottom = y2; } else GetClientRect(ih->handle, &ti.rect); SendMessage(tips_hwnd, TTM_NEWTOOLRECT, 0, (LPARAM)&ti); } }