static HICON winDialogLoadIcon(const char* name, int size) { int w = (size == ICON_SMALL) ? GetSystemMetrics(SM_CXSMICON) : GetSystemMetrics(SM_CXICON); int h = (size == ICON_SMALL) ? GetSystemMetrics(SM_CYSMICON) : GetSystemMetrics(SM_CYICON); /* same as iupdrvImageLoad but using w and h to control icon size */ HICON hIcon = LoadImage(iupwin_hinstance, iupwinStrToSystem(name), IMAGE_ICON, w, h, 0); if (!hIcon && iupwin_dll_hinstance) hIcon = LoadImage(iupwin_dll_hinstance, iupwinStrToSystem(name), IMAGE_ICON, w, h, 0); if (!hIcon) hIcon = LoadImage(NULL, iupwinStrToSystemFilename(name), IMAGE_ICON, w, h, LR_LOADFROMFILE); return hIcon; }
void iupwinTipsGetDispInfo(LPARAM lp) { Ihandle* ih; HWND tips_hwnd; NMTTDISPINFO* tips_info; IFnii cb; 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; cb = (IFnii)IupGetCallback(ih, "TIPS_CB"); if (cb) { int x, y; iupdrvGetCursorPos(&x, &y); iupdrvScreenToClient(ih, &x, &y); cb(ih, x, y); } tips_info->lpszText = iupwinStrToSystem(iupAttribGet(ih, "TIP")); iupwinTipsUpdateInfo(ih, tips_hwnd); }
static int winItemSetTitleAttrib(Ihandle* ih, const char* value) { char *str; if (ih->handle == (InativeHandle*)-1) /* check if submenu is actually created */ return 1; if (!value) { str = " "; value = str; } else str = iupMenuProcessTitle(ih, value); { TCHAR* tstr = iupwinStrToSystem(str); int len = lstrlen(tstr); MENUITEMINFO menuiteminfo; menuiteminfo.cbSize = sizeof(MENUITEMINFO); menuiteminfo.fMask = MIIM_TYPE; menuiteminfo.fType = MFT_STRING; menuiteminfo.dwTypeData = tstr; menuiteminfo.cch = len; SetMenuItemInfo((HMENU)ih->handle, (UINT)ih->serial, FALSE, &menuiteminfo); } if (str != value) free(str); winMenuUpdateBar(ih); return 1; }
void iupdrvFontGetMultiLineStringSize(Ihandle* ih, const char* str, int *w, int *h) { int max_w = 0; IwinFont* winfont = winFontGet(ih); if (!winfont) { if (w) *w = 0; if (h) *h = 0; return; } if (!str) { if (w) *w = 0; if (h) *h = winfont->charheight * 1; return; } if (str[0]) { SIZE size; int len, wlen; const char *nextstr; const char *curstr = str; HDC hdc = winFontGetDC(ih); HFONT oldhfont = (HFONT)SelectObject(hdc, winfont->hFont); TCHAR* wstr = iupwinStrToSystem(str); do { nextstr = iupStrNextLine(curstr, &len); if (len) { #ifdef UNICODE wlen = MultiByteToWideChar(iupwinStrGetUTF8Mode()? CP_UTF8: CP_ACP, 0, curstr, len, 0, 0); #else wlen = len; #endif size.cx = 0; GetTextExtentPoint32(hdc, wstr, wlen, &size); max_w = iupMAX(max_w, size.cx); wstr += wlen+1; } curstr = nextstr; } while(*nextstr); SelectObject(hdc, oldhfont); winFontReleaseDC(ih, hdc); } if (w) *w = max_w; if (h) *h = winfont->charheight * iupStrLineCount(str); }
static int winGlobalSetMutex(const char* name) { if (win_singleintance) ReleaseMutex(win_singleintance); /* try to create a mutex (will fail if already one of that name) */ win_singleintance = CreateMutex(NULL, FALSE, iupwinStrToSystem(name)); /* Return TRUE if existing semaphore opened */ if (win_singleintance != NULL && GetLastError()==ERROR_ALREADY_EXISTS) { CloseHandle(win_singleintance); return 1; } /* wasn’t found, new one created therefore return FALSE */ return (win_singleintance == NULL); }
void iupwinDrawText(HDC hDC, const char* text, int x, int y, int width, int height, HFONT hFont, COLORREF fgcolor, int style) { COLORREF oldcolor; RECT rect; HFONT hOldFont = (HFONT)SelectObject(hDC, hFont); rect.left = x; rect.top = y; rect.right = x+width; rect.bottom = y+height; SetTextAlign(hDC, TA_TOP|TA_LEFT); SetBkMode(hDC, TRANSPARENT); oldcolor = SetTextColor(hDC, fgcolor); DrawText(hDC, iupwinStrToSystem(text), -1, &rect, style|DT_NOCLIP); SelectObject(hDC, hOldFont); SetTextColor(hDC, oldcolor); SetBkMode(hDC, OPAQUE); }
static UINT_PTR CALLBACK winColorDlgHookProc(HWND hWnd, UINT uiMsg, WPARAM wParam, LPARAM lParam) { (void)wParam; if (uiMsg == WM_INITDIALOG) { HWND hWndItem; CHOOSECOLOR* choosecolor = (CHOOSECOLOR*)lParam; Ihandle* ih = (Ihandle*)choosecolor->lCustData; char* value = iupAttribGet(ih, "TITLE"); if (value) SetWindowText(hWnd, iupwinStrToSystem(value)); ih->handle = hWnd; iupDialogUpdatePosition(ih); ih->handle = NULL; /* reset handle */ iupAttribSet(ih, "HWND", (char*)hWnd); /* used by HELP_CB in winDialogBaseProc */ hWndItem = GetDlgItem(hWnd, IUP_COLOR_RED); SetFocus(hWndItem); } return 0; }
static void winFileDlgGetFolder(Ihandle *ih) { InativeHandle* parent = iupDialogGetNativeParent(ih); BROWSEINFO browseinfo; TCHAR filename[MAX_PATH]; LPITEMIDLIST selecteditem; /* if NOT set will NOT be Modal */ /* anyway it will be modal only relative to its parent */ if (!parent) parent = GetActiveWindow(); ZeroMemory(&browseinfo, sizeof(BROWSEINFO)); browseinfo.lpszTitle = iupwinStrToSystem(iupAttribGet(ih, "TITLE")); browseinfo.pszDisplayName = filename; browseinfo.lpfn = winFileDlgBrowseCallback; browseinfo.lParam = (LPARAM)ih; browseinfo.ulFlags = IupGetGlobal("_IUPWIN_COINIT_MULTITHREADED")? 0: BIF_NEWDIALOGSTYLE; browseinfo.hwndOwner = parent; selecteditem = SHBrowseForFolder(&browseinfo); if (!selecteditem) { iupAttribSet(ih, "VALUE", NULL); iupAttribSet(ih, "STATUS", "-1"); } else { SHGetPathFromIDList(selecteditem, filename); iupAttribSetStr(ih, "VALUE", iupwinStrFromSystemFilename(filename)); iupAttribSet(ih, "STATUS", "0"); } iupAttribSet(ih, "FILEEXIST", NULL); iupAttribSet(ih, "FILTERUSED", NULL); }
static IwinFont* winFindFont(const char *standardfont) { HFONT hFont; int height_pixels; /* negative value */ char typeface[50] = ""; int size = 8; int is_bold = 0, is_italic = 0, is_underline = 0, is_strikeout = 0; int res = iupwinGetScreenRes(); int i, count = iupArrayCount(win_fonts); const char* mapped_name; /* Check if the standardfont already exists in cache */ IwinFont* fonts = (IwinFont*)iupArrayGetData(win_fonts); for (i = 0; i < count; i++) { if (iupStrEqualNoCase(standardfont, fonts[i].standardfont)) return &fonts[i]; } if (!iupGetFontInfo(standardfont, typeface, &size, &is_bold, &is_italic, &is_underline, &is_strikeout)) return NULL; /* Map standard names to native names */ mapped_name = iupFontGetWinName(typeface); if (mapped_name) strcpy(typeface, mapped_name); /* get in pixels */ if (size < 0) height_pixels = size; /* already in pixels */ else height_pixels = -iupWIN_PT2PIXEL(size, res); if (height_pixels == 0) return NULL; hFont = CreateFont(height_pixels, 0,0,0, (is_bold) ? FW_BOLD : FW_NORMAL, is_italic, is_underline, is_strikeout, DEFAULT_CHARSET,OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, FF_DONTCARE|DEFAULT_PITCH, iupwinStrToSystem(typeface)); if (!hFont) return NULL; /* create room in the array */ fonts = (IwinFont*)iupArrayInc(win_fonts); strcpy(fonts[i].standardfont, standardfont); fonts[i].hFont = hFont; { HDC hdc = GetDC(NULL); HFONT oldfont = (HFONT)SelectObject(hdc, hFont); TEXTMETRIC tm; GetTextMetrics(hdc, &tm); /* NOTICE that this is different from CD. In IUP we need "average" width, in CD is "maximum" width. */ fonts[i].charwidth = tm.tmAveCharWidth; fonts[i].charheight = tm.tmHeight; SelectObject(hdc, oldfont); ReleaseDC(NULL, hdc); } return &fonts[i]; }
static int winDatePickSetFormatAttrib(Ihandle* ih, const char* value) { SendMessage(ih->handle, DTM_SETFORMAT, 0, (LPARAM)iupwinStrToSystem(value)); return 1; }
static HWND winGlobalFindWindow(const char* name) { win_findwindow = NULL; EnumWindows(winGlobalEnumWindowProc, (LPARAM)iupwinStrToSystem(name)); return win_findwindow; }
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 winFileDlgPopup(Ihandle *ih, int x, int y) { InativeHandle* parent = iupDialogGetNativeParent(ih); OPENFILENAME openfilename; int result, dialogtype; char *value, *initial_dir=NULL; TCHAR* extfilter = NULL; iupAttribSetInt(ih, "_IUPDLG_X", x); /* used in iupDialogUpdatePosition */ iupAttribSetInt(ih, "_IUPDLG_Y", y); value = iupAttribGetStr(ih, "DIALOGTYPE"); if (iupStrEqualNoCase(value, "SAVE")) dialogtype = IUP_DIALOGSAVE; else if (iupStrEqualNoCase(value, "DIR")) dialogtype = IUP_DIALOGDIR; else dialogtype = IUP_DIALOGOPEN; if (dialogtype == IUP_DIALOGDIR) { winFileDlgGetFolder(ih); return IUP_NOERROR; } /* if NOT set will NOT be Modal */ /* anyway it will be modal only relative to its parent */ if (!parent) parent = GetActiveWindow(); ZeroMemory(&openfilename, sizeof(OPENFILENAME)); openfilename.lStructSize = sizeof(OPENFILENAME); openfilename.hwndOwner = parent; value = iupAttribGet(ih, "EXTFILTER"); if (value) { int index; extfilter = winFileDlgStrReplaceSeparator(iupwinStrToSystem(value)); openfilename.lpstrFilter = extfilter; value = iupAttribGet(ih, "FILTERUSED"); if (iupStrToInt(value, &index)) openfilename.nFilterIndex = index; else openfilename.nFilterIndex = 1; } else { value = iupAttribGet(ih, "FILTER"); if (value) { TCHAR *winfo, *wvalue; int sz1, sz2; char* info = iupAttribGet(ih, "FILTERINFO"); if (!info) info = value; winfo = iupwinStrToSystem(info); wvalue = iupwinStrToSystem(value); /* concat FILTERINFO+FILTER */ sz1 = lstrlen(winfo)+1; /* each part has a terminator */ sz2 = lstrlen(wvalue)+1; extfilter = (TCHAR*)malloc((sz1+sz2+1)*sizeof(TCHAR)); memcpy(extfilter, winfo, sz1*sizeof(TCHAR)); /* copy also the terminator */ memcpy(extfilter+sz1, wvalue, sz2*sizeof(TCHAR)); extfilter[sz1+sz2] = 0; /* additional terminator at the end */ openfilename.lpstrFilter = extfilter; openfilename.nFilterIndex = 1; } } openfilename.lpstrFile = (TCHAR*)malloc((IUP_MAX_FILENAME_SIZE+1)*sizeof(TCHAR)); value = iupAttribGet(ih, "FILE"); if (value) { iupwinStrCopy(openfilename.lpstrFile, value, IUP_MAX_FILENAME_SIZE); winFileDlgStrReplacePathSlash(openfilename.lpstrFile); } else openfilename.lpstrFile[0] = 0; openfilename.nMaxFile = IUP_MAX_FILENAME_SIZE; /* only supports extensions with up to three characters, should NOT include the period */ openfilename.lpstrDefExt = iupwinStrToSystem(iupAttribGet(ih, "EXTDEFAULT")); initial_dir = iupStrDup(iupAttribGet(ih, "DIRECTORY")); openfilename.lpstrInitialDir = iupwinStrToSystemFilename(initial_dir); if (openfilename.lpstrInitialDir) winFileDlgStrReplacePathSlash((TCHAR*)openfilename.lpstrInitialDir); openfilename.lpstrTitle = iupwinStrToSystem(iupAttribGet(ih, "TITLE")); openfilename.Flags = OFN_PATHMUSTEXIST | OFN_HIDEREADONLY; if (!iupAttribGetBoolean(ih, "NOOVERWRITEPROMPT")) openfilename.Flags |= OFN_OVERWRITEPROMPT; if (iupAttribGetBoolean(ih, "SHOWHIDDEN")) openfilename.Flags |= OFN_FORCESHOWHIDDEN; value = iupAttribGet(ih, "ALLOWNEW"); if (!value) { if (dialogtype == IUP_DIALOGSAVE) value = "YES"; else value = "NO"; } if (iupStrBoolean(value)) openfilename.Flags |= OFN_CREATEPROMPT; else openfilename.Flags |= OFN_FILEMUSTEXIST; if (iupAttribGetBoolean(ih, "NOCHANGEDIR")) openfilename.Flags |= OFN_NOCHANGEDIR; if (iupAttribGetBoolean(ih, "MULTIPLEFILES")) openfilename.Flags |= OFN_ALLOWMULTISELECT; openfilename.lpfnHook = winFileDlgSimpleHook; openfilename.Flags |= OFN_ENABLEHOOK | OFN_EXPLORER | OFN_ENABLESIZING; openfilename.lCustData = (LPARAM)ih; if (iupAttribGetBoolean(ih, "SHOWPREVIEW") && IupGetCallback(ih, "FILE_CB")) { openfilename.Flags |= OFN_ENABLETEMPLATE; openfilename.hInstance = iupwin_dll_hinstance? iupwin_dll_hinstance: iupwin_hinstance; openfilename.lpTemplateName = TEXT("iupPreviewDlg"); openfilename.lpfnHook = winFileDlgPreviewHook; } if (IupGetCallback(ih, "HELP_CB")) openfilename.Flags |= OFN_SHOWHELP; if (dialogtype == IUP_DIALOGOPEN) result = GetOpenFileName(&openfilename); else result = GetSaveFileName(&openfilename); if (result) { if (iupAttribGetBoolean(ih, "MULTIPLEFILES")) { /* If there is more than one file, replace terminator by the separator */ if (openfilename.lpstrFile[openfilename.nFileOffset-1] == 0 && openfilename.nFileOffset>0) { int i = 0; int count = 0; char* dir = iupwinStrFromSystemFilename(openfilename.lpstrFile); /* already is the directory, but without the last separator */ iupAttribSetStrf(ih, "DIRECTORY", "%s\\", dir); /* add the last separator */ /* first the path */ iupAttribSetStrId(ih, "MULTIVALUE", count, iupAttribGet(ih, "DIRECTORY")); /* here count=0 always */ count++; while (openfilename.lpstrFile[i] != 0 || openfilename.lpstrFile[i + 1] != 0) { if (openfilename.lpstrFile[i] == 0) { iupAttribSetStrId(ih, "MULTIVALUE", count, iupwinStrFromSystemFilename(openfilename.lpstrFile + i + 1)); count++; openfilename.lpstrFile[i] = TEXT('|'); } i++; } iupAttribSetInt(ih, "MULTIVALUECOUNT", count); openfilename.lpstrFile[i] = TEXT('|'); /* one last at the end */ iupAttribSetStr(ih, "VALUE", iupwinStrFromSystemFilename(openfilename.lpstrFile)); /* here file was already modified to match the IUP format */ } else { /* if there is only one file selected the returned value is different and includes just that file */ char* filename = iupwinStrFromSystemFilename(openfilename.lpstrFile); char* dir = iupStrFileGetPath(filename); int dir_len = (int)strlen(dir); iupAttribSetStr(ih, "DIRECTORY", dir); iupAttribSetStrId(ih, "MULTIVALUE", 0, dir); iupAttribSetStrId(ih, "MULTIVALUE", 1, filename + dir_len); iupAttribSetStr(ih, "VALUE", filename); /* here value is not separated by '|' */ iupAttribSetInt(ih, "MULTIVALUECOUNT", 2); free(dir); } iupAttribSet(ih, "STATUS", "0"); iupAttribSet(ih, "FILEEXIST", "YES"); } else { char* filename = iupwinStrFromSystemFilename(openfilename.lpstrFile); char* dir = iupStrFileGetPath(filename); iupAttribSetStr(ih, "DIRECTORY", dir); free(dir); if (winIsFile(openfilename.lpstrFile)) /* check if file exists */ { iupAttribSet(ih, "FILEEXIST", "YES"); iupAttribSet(ih, "STATUS", "0"); } else { iupAttribSet(ih, "FILEEXIST", "NO"); iupAttribSet(ih, "STATUS", "1"); } iupAttribSetStr(ih, "VALUE", filename); } iupAttribSetInt(ih, "FILTERUSED", (int)openfilename.nFilterIndex); } else { iupAttribSet(ih, "FILTERUSED", NULL); iupAttribSet(ih, "VALUE", NULL); iupAttribSet(ih, "DIRECTORY", NULL); iupAttribSet(ih, "FILEEXIST", NULL); iupAttribSet(ih, "STATUS", "-1"); } if (extfilter) free(extfilter); if (initial_dir) free(initial_dir); if (openfilename.lpstrFile) free(openfilename.lpstrFile); return IUP_NOERROR; }
int iupwinSetTitleAttrib(Ihandle* ih, const char* value) { if (!value) value = ""; SetWindowText(ih->handle, iupwinStrToSystem(value)); return 1; }
static int winDialogMapMethod(Ihandle* ih) { InativeHandle* native_parent; DWORD dwStyle = WS_CLIPSIBLINGS, dwExStyle = 0; int has_titlebar = 0, has_border = 0; TCHAR* classname = TEXT("IupDialog"); char* title = iupAttribGet(ih, "TITLE"); if (title) has_titlebar = 1; if (!iupAttribGetBoolean(ih, "SAVEUNDER")) classname = TEXT("IupDialogNoSaveBits"); if (iupAttribGetBoolean(ih, "RESIZE")) { dwStyle |= WS_THICKFRAME; has_border = 1; } else iupAttribSet(ih, "MAXBOX", "NO"); if (iupAttribGetBoolean(ih, "MENUBOX")) { dwStyle |= WS_SYSMENU; has_titlebar = 1; } if (iupAttribGetBoolean(ih, "MAXBOX")) { dwStyle |= WS_MAXIMIZEBOX; has_titlebar = 1; } if (iupAttribGetBoolean(ih, "MINBOX")) { dwStyle |= WS_MINIMIZEBOX; has_titlebar = 1; } if (iupAttribGetBoolean(ih, "BORDER") || has_titlebar) has_border = 1; if (iupAttribGetBoolean(ih, "MDICHILD")) { Ihandle *client; /* must have a parent dialog (the mdi frame) */ Ihandle* parent = IupGetAttributeHandle(ih, "PARENTDIALOG"); if (!parent || !parent->handle) return IUP_ERROR; /* set when the mdi client is mapped */ client = (Ihandle*)iupAttribGet(parent, "MDICLIENT_HANDLE"); if (!client) return IUP_ERROR; /* store the mdi client handle in each mdi child also */ iupAttribSet(ih, "MDICLIENT_HANDLE", (char*)client); classname = TEXT("IupDialogMDIChild"); /* The actual parent is the mdi client */ native_parent = client->handle; dwStyle |= WS_CHILD; if (has_titlebar) dwStyle |= WS_CAPTION; else if (has_border) dwStyle |= WS_BORDER; /* make sure it has at least one name */ if (!iupAttribGetHandleName(ih)) iupAttribSetHandleName(ih); } else { native_parent = iupDialogGetNativeParent(ih); if (native_parent) { dwStyle |= WS_POPUP; if (has_titlebar) dwStyle |= WS_CAPTION; else if (has_border) dwStyle |= WS_BORDER; } else { if (has_titlebar) { dwStyle |= WS_OVERLAPPED; } else { if (has_border) dwStyle |= WS_POPUP | WS_BORDER; else dwStyle |= WS_POPUP; dwExStyle |= WS_EX_NOACTIVATE; /* this will hide it from the taskbar */ } } if (iupAttribGetBoolean(ih, "MDIFRAME")) { COLORREF color = GetSysColor(COLOR_BTNFACE); iupAttribSetStrf(ih, "_IUPWIN_BACKGROUND_COLOR", "%d %d %d", (int)GetRValue(color), (int)GetGValue(color), (int)GetBValue(color)); classname = TEXT("IupDialogMDIFrame"); } } if (iupAttribGetBoolean(ih, "TOOLBOX") && native_parent) dwExStyle |= WS_EX_TOOLWINDOW | WS_EX_WINDOWEDGE; if (iupAttribGetBoolean(ih, "DIALOGFRAME") && native_parent) dwExStyle |= WS_EX_DLGMODALFRAME; /* this will hide the MENUBOX but not the close button */ if (iupAttribGet(ih, "OPACITY") || iupAttribGet(ih, "OPACITYIMAGE")) dwExStyle |= WS_EX_LAYERED; iupwinGetNativeParentStyle(ih, &dwExStyle, &dwStyle); if (iupAttribGetBoolean(ih, "HELPBUTTON")) dwExStyle |= WS_EX_CONTEXTHELP; if (iupAttribGetBoolean(ih, "CONTROL") && native_parent) { /* TODO: this were used by LuaCom to create embedded controls, don't know if it is still working */ dwStyle = WS_CHILD | WS_TABSTOP | WS_CLIPCHILDREN; classname = TEXT("IupDialogControl"); } /* CreateWindowEx will send WM_GETMINMAXINFO before Ihandle is associated with HWND */ if (iupAttribGet(ih, "MINSIZE") || iupAttribGet(ih, "MAXSIZE")) winMinMaxHandle = ih; /* Windows 7 Taskbar */ #ifdef __ITaskbarList3_FWD_DEFINED__ if (iupAttribGetInt(ih, "TASKBARPROGRESS")) { ITaskbarList3* tbl; CoCreateInstance(&CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER, &IID_ITaskbarList3, &tbl); iupAttribSet(ih, "_IUPWIN_TASKBARLIST", (char*)((ITaskbarList3*)tbl)); } #endif /* size will be updated in IupRefresh -> winDialogLayoutUpdate */ /* position will be updated in iupDialogShowXY */ if (iupAttribGetBoolean(ih, "MDICHILD")) { ih->handle = CreateMDIWindow(classname, iupwinStrToSystem(title), /* title */ dwStyle, /* style */ 0, /* x-position */ 0, /* y-position */ 100, /* horizontal size - set this to avoid size calculation problems */ 100, /* vertical size */ native_parent, /* owner window */ iupwin_hinstance, /* instance of app. */ 0); /* no creation parameters */ } else { ih->handle = CreateWindowEx(dwExStyle, /* extended styles */ classname, /* class */ iupwinStrToSystem(title), /* title */ dwStyle, /* style */ 0, /* x-position */ 0, /* y-position */ 100, /* horizontal size - set this to avoid size calculation problems */ 100, /* vertical size */ native_parent, /* owner window */ (HMENU)0, /* Menu or child-window identifier */ iupwin_hinstance, /* instance of app. */ NULL); /* no creation parameters */ } if (!ih->handle) return IUP_ERROR; /* associate HWND with Ihandle*, all Win32 controls must call this. */ iupwinHandleAdd(ih, ih->handle); if (iupAttribGetBoolean(ih, "MDICHILD")) /* hides the mdi child */ ShowWindow(ih->handle, SW_HIDE); /* configure for DROP of files */ if (IupGetCallback(ih, "DROPFILES_CB")) iupAttribSet(ih, "DROPFILESTARGET", "YES"); /* Ignore VISIBLE before mapping */ iupAttribSet(ih, "VISIBLE", NULL); /* Set the default CmdShow for ShowWindow */ ih->data->cmd_show = SW_SHOWNORMAL; if (iupAttribGetBoolean(ih, "MDICHILD")) winDialogMDIRefreshMenu(ih); return IUP_NOERROR; }
static int winMessageDlgPopup(Ihandle* ih, int x, int y) { InativeHandle* parent = iupDialogGetNativeParent(ih); MSGBOXPARAMS MsgBoxParams; int result, button_def; DWORD dwStyle = MB_TASKMODAL; char *icon, *buttons; (void)x; (void)y; /* MessageBox is the only Windows pre-defined dialog that has a modal control, no need to force a parent dialog here. */ icon = iupAttribGetStr(ih, "DIALOGTYPE"); if (iupStrEqualNoCase(icon, "ERROR")) dwStyle |= MB_ICONERROR; else if (iupStrEqualNoCase(icon, "WARNING")) dwStyle |= MB_ICONWARNING; else if (iupStrEqualNoCase(icon, "INFORMATION")) dwStyle |= MB_ICONINFORMATION; else if (iupStrEqualNoCase(icon, "QUESTION")) dwStyle |= MB_ICONQUESTION; buttons = iupAttribGetStr(ih, "BUTTONS"); if (iupStrEqualNoCase(buttons, "OKCANCEL")) dwStyle |= MB_OKCANCEL; else if (iupStrEqualNoCase(buttons, "RETRYCANCEL")) dwStyle |= MB_RETRYCANCEL; else if (iupStrEqualNoCase(buttons, "YESNO")) dwStyle |= MB_YESNO; else if (iupStrEqualNoCase(buttons, "YESNOCANCEL")) dwStyle |= MB_YESNOCANCEL; else dwStyle |= MB_OK; if (IupGetCallback(ih, "HELP_CB")) dwStyle |= MB_HELP; button_def = iupAttribGetInt(ih, "BUTTONDEFAULT"); if (button_def == 3) dwStyle |= MB_DEFBUTTON3; else if (button_def == 2) dwStyle |= MB_DEFBUTTON2; else dwStyle |= MB_DEFBUTTON1; MsgBoxParams.cbSize = sizeof(MSGBOXPARAMS); MsgBoxParams.hwndOwner = parent; MsgBoxParams.hInstance = NULL; MsgBoxParams.lpszText = iupwinStrToSystem(iupAttribGet(ih, "VALUE")); MsgBoxParams.lpszCaption = iupwinStrToSystem(iupAttribGet(ih, "TITLE")); MsgBoxParams.dwStyle = dwStyle; MsgBoxParams.lpszIcon = NULL; MsgBoxParams.dwContextHelpId = (DWORD_PTR)ih; MsgBoxParams.lpfnMsgBoxCallback = (MSGBOXCALLBACK)winMessageDlgHelpCallback; MsgBoxParams.dwLanguageId = MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT); result = MessageBoxIndirect(&MsgBoxParams); if (result == 0) /* memory error */ { iupAttribSet(ih, "BUTTONRESPONSE", NULL); return IUP_ERROR; } if (result == IDOK || result == IDYES || result == IDRETRY) iupAttribSet(ih, "BUTTONRESPONSE", "1"); else if (result == IDCANCEL && iupStrEqualNoCase(buttons, "YESNOCANCEL")) iupAttribSet(ih, "BUTTONRESPONSE", "3"); else iupAttribSet(ih, "BUTTONRESPONSE", "2"); return IUP_NOERROR; }